FAQ: всё про REPLACE-BY-FEE транзакцииЭтот FAQ был написан мной с нуля 03.03.19. Замечания и дополнения приветствуются. Серым цветом выделены технические подробности, которые читать не обязательно.
FAQ по зависшим транзакциям (любым - не только rbf) -
тутЧто такое replace-by-fee (opt-in RBF) транзакция?Это транзакция, которая при создании была помечена как заменяемая (replaceable).
Чем отличаются такие транзации?
Они легко могут быть изменены отправителем произвольным образом (практически - и отменены) в любой момент до включения в блок (получения подтверждений).
На самом деле при этом происходит двойная трата (даблспенд); только в отличие от обычной транзакции, здесь это признано нормальным (BIP-125, англ.).Зачем мне такие транзакции?Они позволяют в большинстве случаев поднять комиссию нажатием кнопки в интерфейсе кошелька в случае необходимости. Как использовать на примере bitcoin core:
открываем вкладку с транзакциями, правой кнопкой по проблемной транзакции, затем "Increase transaction fee".
Кошелек сам создаст новую транзакцию, в которой будет больше комиссия и меньше сдача. Входы и остальные выходы останутся те же. Потом он её разошлёт и ноды заменят старую на новую в своём мемпуле.Если у транзакции не было сдачи, будет сообщение об ошибке и вопрос надо будет решать по-другому: создать вручную транзакцию через Coinb.in, затем разослать. Для RBF-транзакций с рассылкой проблем нет.
Какие минусы по сравнению с обычными?- В редких случаях вы можете дольше ждать зачисления средств на сервисе. Если обычные неподтвержденные транзакции могут приниматься некоторыми сервисами, то для replace-by-fee транзакции точно придется ждать подтверждения.
- Если кто-то завладел вашими приватными ключами, то срочно переводить монеты на новый адрес надо обычной транзакцией. Иначе ваша транзакция может быть заменена транзакцией похитителя.
В каких блокчейн-эксплорерах можно посмотреть заменённые транзакции?https://tradeblock.com,
bitaps.com и
btc.com.
Может ли в рамках этого механизма быть отменена обычная транзакция?Да, может. В том случае, если у неё есть неподтвержденная транзакция-предок, которая была помечена как replace-by-fee. Поэтому если вам отправили транзакцию с хорошей комиссией и она сама не помечена как RBF -- это ещё совсем не значит, что она обязательно потвердится. Не спешите делать перевод/отдавать товар - ждите подтверждений.
Не верите? См опять же тут (англ), раздел Summary -> Inherited signaling.При каких условиях replace-by-fee транзация А заменяется новой конкурирующей транзакцией B в мемпуле?На каждой ноде могут быть установлены свои правила.
Условие по умолчанию (установлено на большинстве нод) такое: у B должна быть больше комиссия.
Более точно - абсолютная комиссия транзакции B должна быть больше хотя бы на (размер транзакции B)*(minimum relay fee). Minimum relay fee на большинстве нод установлен в 1 сатоши. Ещё более точный ответ см здесь (англ, раздел Implementation details). Обязаны ли майнеры заменять replace-by-fee транзакции?Нет. Но им выгодна такая замена.
Все ли майнеры принимают такие транзакции?Принимают - да. Но заменяют на новые не все.
Мной были проверены и заменяют:
- btc.com
- poolin
- f2pool
- btc.top
- slush
- viabtc
- dpool
- bitclub
- bitcoin.com
- bixin
Если не ошибаюсь, антпул был против введения replace-by-fee. Механизм replace-by-fee выключен в сети Bitcoin Cash. Поэтому единственный крупный майнер, который не заменяет транзакции - antpool.com. В моих экпериментах замена антпулом была сделана в 1 случае из 4. Видимо, разные ноды у них сконфигурированы по-разному. Для майнеров нет никакой разницы - просто ли увеличивается комиссия за счет сдачи или же происходит замена адреса получателя.
Что мешает майнерам так же заменять обычные транзакции?На самом деле - ничего. Но (можно считать это джентельменским соглашением) они не заменяют.
RBF придумал сам Сатоши?Нет. У него был предусмотрен механизм замены транзакций, но другой.
RBF, Opt-in RBF, opt-in full RBF, full RBF, full opt-in rbf - это всё одно и то же?Работающий механизм есть всего один, хотя во время его разработки было много разных предложений - как именно реализовать. С тех пор осталась эта путаница. Ещё некоторые зачем-то называют случаи даблспенда для обычных транзакций full RBF.
Как именно помечаются replace-by-fee транзакции?
Это описано в BIP-125 (англ): поставить у любого входа в поле nSequence любое значение меньше 0xfffffffe. Но так как то же поле используется для всяких других вещей, то на практике большиство кошельков ставит в поле nSequence каждого входа значение 0xfffffffd вместо 0xffffffff. Для примера (2 входа, 1 выход, без подписей):
0100000002a813c380ba5d8c0698004b12d0bbb69ba7434ed5126884370117d932d004402c00000 0001976a9141238e2a3bcbb814aedfb6f94eb453530602d45b088acffffffffd51680b172158a4c8de3e6b4417f435a2a27c135cb677f01f936b39de1fc5a1d000000001976a91 41238e2a3bcbb814aedfb6f94eb453530602d45b088acffffffff01c0270900000000001976a9143eed7387440ca17639fe59e45961dced3bb0cbd288ac00000000
0100000002a813c380ba5d8c0698004b12d0bbb69ba7434ed5126884370117d932d004402c00000 0001976a9141238e2a3bcbb814aedfb6f94eb453530602d45b088acfdffffffd51680b172158a4c8de3e6b4417f435a2a27c135cb677f01f936b39de1fc5a1d000000001976a91 41238e2a3bcbb814aedfb6f94eb453530602d45b088acfdffffff01c0270900000000001976a9143eed7387440ca17639fe59e45961dced3bb0cbd288ac00000000
Здесь видим fdffffff вместо fffffffd из-за того, что 4 байта nSequence хранятся в обратном порядке.