52 / 736BIP125

Replace-by-Fee (RBF)

Замена неподтверждённой транзакции версией с большей комиссией

Replace-by-Fee (RBF) позволяет заменить ожидающую транзакцию Bitcoin другой, с более высокой комиссией. Так кошелёк может помочь платежу, который ещё не попал в блок; отменить уже подтверждённый платёж этим способом нельзя.

Отправить платёж — ещё не значит подтвердить его. Пока майнер не включил его в блок, узлы — программы, проверяющие и передающие транзакции Bitcoin, — могут хранить его в своём Mempool, локальном списке ожидающих транзакций. При определённых условиях RBF позволяет принять вместо него новую транзакцию, расходующую хотя бы один из тех же UTXO — ещё не потраченных выходов. Замена должна содержать действительные подписи, и её нужно передать сети; сама по себе повышенная комиссия не гарантирует быстрого подтверждения.

Анна отправила 20 000 sat, но платёж всё ещё ждёт. Сокращение sat означает satoshi — наименьшую единицу биткоина. Кошелёк предлагает повысить комиссию через RBF. В простом примере исходная транзакция расходует 50 000 sat: 20 000 sat получает адресат, 200 sat составляет комиссия, а 29 800 sat возвращаются Анне как сдача. Замена может по-прежнему отправлять получателю 20 000 sat, увеличить комиссию до 2 000 sat и вернуть Анне 28 000 sat. Эти числа объясняют принцип, а не рекомендуют текущую комиссию. Перед подписанием Анна проверяет адрес, сумму для получателя и новую общую комиссию. Кошелёк должен уметь подписать нужные входы; аппаратный кошелёк, возможно, придётся подключить снова. У замены новый txid — идентификатор транзакции, поэтому получателю может понадобиться новая ссылка для отслеживания. Повышение комиссии отличается от второго независимого платежа с другими UTXO: оба независимых платежа могут подтвердиться, и ты заплатишь дважды. [1] [2] [12]

Кошелёк может показать поступление ещё до первого подтверждения. Такой платёж называют zero-conf: его уже заметили, но в блоке его пока нет. Другая версия может подтвердиться первой, а показанное поступление — исчезнуть. Поэтому отметка ‘RBF выключен’ не доказывает надёжность платежа. Выдавая товар за неподтверждённый платёж, продавец сознательно принимает коммерческий риск. После включения в блок RBF уже не переписывает транзакцию. Возможная реорганизация цепочки — другой риск, из-за которого для значимых платежей ждут нескольких подтверждений. [1]

Сам RBF не требует сохранять первоначального получателя. Замена может повысить комиссию и продолжать платить тому же человеку либо отправить средства в другое место. Обе версии пытаются потратить один UTXO: технически это конфликтующие попытки, Double Spend. Сам термин ещё не говорит о мошенничестве. Но злоумышленник не может произвольно подписать чужой платёж: замена тоже должна выполнить условия расходования, включая необходимые подписи. Если кошелёк предлагает ‘отмену’ путём замены платежом себе, это попытка опередить исходную транзакцию, а не гарантированный отзыв платежа. [1]

RBF меняет саму ожидающую транзакцию. Child Pays for Parent (CPFP) сохраняет её и создаёт новую, расходующую один из её выходов. Чтобы получить комиссию новой транзакции, майнер должен включить и исходную, поэтому может оценивать их общую ставку. Новую транзакцию называют дочерней, а исходную — родительской. Создать дочернюю может тот, кто способен потратить нужный выход: например, получатель платежа или отправитель со своей сдачей. Возможности зависят от кошелька, необходимых подписей и связей между транзакциями. CPFP не заменяет исходный платёж и тоже не гарантирует срок подтверждения. [2]

Mempool — не единая очередь всего Bitcoin. Каждый узел ведёт свой список и применяет собственные правила приёма и передачи ожидающих транзакций. RBF относится к этой локальной политике, а не к консенсусу, определяющему допустимость блоков. Поэтому майнер может выбрать допустимую конфликтующую транзакцию, которую другой узел раньше не хранил. Full Node затем проверит весь блок по правилам Bitcoin; прежнее предпочтение его mempool не определяет результат. Принятие замены одним узлом не обещает её принятия везде. [1] [6]

Пользователю важны два разных числа: сколько он заплатит всего и какую ставку предлагает с учётом размера транзакции. При условном размере 200 vB комиссия 200 sat означает 1 sat/vB; при том же размере 2 000 sat означает 10 sat/vB. Виртуальный байт, vB, — единица размера, производная от веса транзакции. При перестроении размер может измениться, поэтому кошелёк должен пересчитать и ставку. Общая комиссия — сумма в satoshi, ставка — сумма за виртуальный байт в sat/vB. Для одиночной замены в Core 30 комиссия должна покрывать сумму комиссий всех вытесненных транзакций и дополнительную стоимость по incrementalrelayfee за размер замены. Её ставка должна превышать ставки непосредственно конфликтующих транзакций. Одного увеличения ставки или добавления satoshi недостаточно; в Core 30 incrementalrelayfee по умолчанию равна 0,1 sat/vB, но настройки узла могут отличаться. [2] [9]

От первого ожидающего платежа уже может зависеть следующий: кто-то расходует выход первой, ещё не подтверждённой транзакции. Такие последующие транзакции называют потомками. Когда родительская исчезает, они тоже становятся непригодными в mempool, поэтому узел должен рассмотреть всю затронутую группу. Замена родительской транзакции может вытеснить из mempool потомков, расходующих её выходы. Поэтому сравнение не всегда ограничено двумя транзакциями. Для одиночной замены Core 30 ограничивает сумму количеств потомков непосредственно конфликтующих транзакций, включая их самих, числом 100; общие потомки могут учитываться несколько раз. Комиссии и связи пакета влияют на успех замены. [2]

Узел также должен защищаться от перегрузки постоянными пересчётами замен. Это защита от DoS — атаки на доступность сервиса. UTXO — неизрасходованный выход прежней транзакции; вход новой транзакции ссылается на него. Далее описаны правила именно Bitcoin Core 30, а не неизменный закон Bitcoin. Политика Bitcoin Core 30 для одной заменяющей транзакции ограничивает также новые неподтверждённые входы и число вытесняемых транзакций. Замена должна соответствовать локальным правилам о допустимых формах транзакций (стандартности), а также правилам распространения и проверки корректности; одного расходования того же UTXO недостаточно. Ограничения защищают вычислительные ресурсы, память и пропускную способность; правила пакетной замены рассматривают отдельно для версии узла. Core 31 изменил эту политику с появлением Cluster Mempool: связанные неподтверждённые транзакции рассматриваются группами. Замена должна улучшать так называемую диаграмму ставок комиссии — feerate diagram, которая сопоставляет накопленные комиссии с постепенно занимаемым местом. Сохраняются и другие условия, включая достаточную общую комиссию и доплату за распространение замены. Поэтому не переноси описанные выше ограничения Core 30 автоматически на новые версии: проверь правила своего узла. [2] [13]

Почему некоторые кошельки до сих пор показывают переключатель RBF? Узлы с первоначальной политикой opt-in RBF требовали предварительного сигнала согласия на замену. Bitcoin Core 24 позволил настроить full-RBF без этого условия, Core 28 включил его по умолчанию, а Core 29 убрал переключатель mempoolfullrbf. Следующие детали BIP125 объясняют исходную сигнализацию, а не универсальное правило всех современных узлов. BIP125 описывает явный opt-in сигнал, когда хотя бы один вход имеет nSequence ниже 0xfffffffe, а также наследование сигнала от неподтверждённого предка. Это историческая политика, а не требование консенсуса. Full-RBF позволяет оценить замену без такого сигнала; его отсутствие не гарантирует незаменимость платежа. [1] [3] [4] [5] [6]

Этот раздел предназначен для работы со своим узлом. RPC — команды для запроса данных у программы или управления ею; для кнопки повышения комиссии знать их не нужно. getmempoolentry показывает состояние транзакции, если она есть в mempool этого узла; testmempoolaccept проверяет одну подписанную замену-кандидата относительно текущего mempool и правил узла, не распространяя её. Результат не обещает принятия другими узлами или включения в блок. Core 28 включил full-RBF значением mempoolfullrbf по умолчанию; Core 29 удалил эту опцию. getmempoolinfo сообщает параметры комиссий, но поле fullrbf в Core 30 помечено устаревающим; всегда проверяй версию и конкретную конфигурацию. [5] [6] [7] [8] [10] [11]

Для полной картины прочитайте эту статью вместе с Transaction Fees, Mempool, CPFP (Child Pays for Parent), Двойная трата, Подтверждение, Fee Rate. На эту статью также ссылаются Change Address, Подтверждение, Двойная трата, Fee Rate.

DOC · 001BIP 125 — Opt-in Full Replace-by-Fee SignalingСпецификация DOC · 002Bitcoin Core v30.0 — Mempool replacement policyДокументация DOC · 003Bitcoin Core 0.12.0 release notesДокументация DOC · 004Bitcoin Core 24.0.1 release notesДокументация DOC · 005Bitcoin Core 28.0 release notesДокументация DOC · 006Bitcoin Core 29.0 release notesДокументация DOC · 007Bitcoin Core getmempoolinfo RPCДокументация DOC · 008Bitcoin Core testmempoolaccept RPCДокументация DOC · 009Bitcoin Core 30.0 release notesДокументация DOC · 010Bitcoin Core getmempoolentry RPCДокументация DOC · 011Bitcoin Core v30.0 — Mempool RPC implementationПервичный источник DOC · 012Bitcoin Core 30.0 — bumpfee RPCДокументация DOC · 013Bitcoin Core v31.0 — Mempool replacement policyДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией