• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Разбираемся с Replace-By-Fee транзакциями Bitcoin

Разбираемся с Replace-By-Fee транзакциями Bitcoin +10

24.04.2017 07:55
Urn 3 1600 Источник
Платежные системы*, Криптография*, Биллинговые системы*
Всем привет! В этой статье мы разберемся что такое Replace-By-Fee транзакции и как их использовать. Бонус! Пара поучительных историй в конце.

Итак, представим ситуацию когда A посылает монеты B. Он создает и подписывает транзакцию, и выпускает ее в сеть для подтверждения. К сожалению, транзакция долго не подтверждается, у транзакции слишком маленькая комиссия (или комиссия нормальная в обычных обстоятельствах, но в данный момент очередь неподтвержденных транзакций слишком большая и майнеры предпочитают майнить транзакции с бОльшими комиссиями). Что делать пользователю A? Варианты: a) ждать подтверждения (ждать можно долго) б) ждать отмены транзакции (когда большинство нод решат наконец выкинуть из mempool транзакцию) и освобожденными монетами можно будет снова распоряжаться (то есть создавать транзакции и пулы не будут считать их даблспендами и отвергать) в) Заменить транзакцию с повышением комиссии (RBF)

Итак, RBF — замена существующей транзакции новой транзакцией с повышением комиссии. Замена означает что в новой транзакции будут использованы те же входы что и в старой транзакции, и это не будет считаться даблспендом (читай, мошенничеством). В итоге только одна транзакция будет добавлена в блокчейн (с большой вероятностью это будет транзакция с повышенной комиссией).

RBF описан в BIP-0125

Какая транзакция может быть заменена? Это хороший вопрос. Замена транзакций была предусмотрена еще создателем системы Сатоши Накамото, но выключена в определенный момент. Затем она была доработана до RBF и включена в код Bitcoin Core 0.12 и старше. Для замены в данных транзакции предусмотрено специальное int поле nSequence, которое сигнализирует о том, какая транзакция старше какой. Чтоб транзакция была потенциально заменяемой, значение nSequence должно быть меньше (0xffffffff — 1).

По умолчанию, большинство современных кошельков nSequence сразу ставят максимальным, и возможность заменять транзакции надо включать в настройках. Вот так это выглядит в кошельке Electrum:

image

Пример декодированой транзакции:

...
"inputs": [
        {
            "addresses": [
                "...."
            ], 
            "output_index": 0, 
            "output_value": 1010000, 
            "prev_hash": "...", 
            "script": "...", 
            "script_type": "pay-to-pubkey-hash", 
            "sequence": 0
        },
...

Sequence указывается для каждого входа транзакции.

В том же кошельке Electrum после включения опции RBF станет возможным увеличивать комиссию за транзакцию прямо в GUI, но сейчас мы с вами будем собирать RBF транзакцию руками. Зачем? Во-первых — разобраться, во-вторых — для большей гибкости, например, в этом случае в RBF транзакции мы сможем указать совершенно другие целевые адреса для перевода, чем периодически пытаются воспользоваться злоумышленники.

Выглядит это так: A хочет заплатить B. A создает, подписывает и транслирует транзакцию на перевод монет B, но умышленно ставит пониженную или нулевую комиссию. Если B недостаточно осторожен он засчитывает неподтвержденную транзакцию (и отдает товар А, например). После этого A заменяет транзакцию и перенаправляет выход транзакции на С, где С подконтролен А.

Как B может этого избежать? Если все же B предпочитает засчитывать неподтвержденные транзакции (для скорости), не стоит засчитывать пластичные транзакции (где nSequence позволяет транзакции заменять). И вообще, с подозрением относиться к таким транзакциям. Если вы когда-то засчитывали пластичные транзакции то неплохо бы их перепроверить на факт наличия фрода и применить санкции к плательщику, если тот мошенничает. Ну и естественно, идеально было бы дожидаться не менее 2х подтверждений.

Пример.

Будем пользоваться замечательной опенсорсной тулзой github.com/OutCast3k/coinbin с помощью которой можно вручную легко создавать транзакции с нужными нам входами и выходами. Работает полностью в браузере не общаясь с сервером. Живая версия доступна по адресу coinb.in

Создаем транзакцию через New > Transaction. Берем приватный ключ в формате WIF и загружаем доступные (непотраченные) выходы для этого ключа. Во вкладке Outputs указываем целевой адрес, указываем amount. В Advanced Options не забываем поставить галку на “Make this a RBF transaction” — в этом случае nSequence транзакции будет меньше максимального значения. Жмем Submit.

image

Транзакция создана. Обратите внимание на Transaction Fee — это разница между доступным количеством монет суммарно со всех входов МИНУС сумма всех выходов (в нашем случае 1 выход). Разница и будет комиссией которую майнер заберет себе. В этом примере она специально нулевая.

Жмем Sign, копипастим туда полученный hex транзакции, все тот же приватный ключ, и подписываем транзакцию:

image

Транслируем транзакцию в сеть (можно использовать любой ендпоинт):

image

Так транзакция выглядит:

image

Теперь давайте воспользуемся RBF. Создаем новую транзакцию, входы берем с того же WIF. Но выходы укажем совершенно иные! Один из выходов укажем 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg — донейт адрес создателя coinb.in

Amount укажем такие чтоб комиссия за транзакцию была достаточной для быстрого подтверждения.

image

Обратите внимание на вкладку Inputs — если исходный адрес многоразовый и на нем много транзакций, то нам придется во входах вручную прописать только те инпуты, которые входят в транзакцию которую мы хотим заменить (удалить лишние, оставить только нужные). Входов этих могут быть сотни, и в некоторых случаях это может быть достаточно кропотливая работа.

Подписываем:

image

Транслируем:

image

Вот так это теперь выглядит на blockchain.info. У новой транзакции есть все шансы быть включенной в блок раньше своей предыдущей версии.

image

Ждем. Есть подтверждение:

image

Мы только что заменили транзакцию с помощью RBF, причем монеты отправили совсем не на тот адрес который хотели изначально.

Опять о безопасности

Не всегда nSequence=MAX гарантирует что транзакция финальная и заменить ее нельзя. На самом деле галку “Make this a RBF transaction” можно было не ставить, но:

  • При замене транзакции не все ноды согласятся ретранслировать новую версию, ссылаясь на mempool-conflict
  • Некоторые ноды примут транзакцию, и таки ретранслируют ее в сеть
  • Информационные ресурсы типа blockchain.info будут прямым текстом писать DOUBLE SPEND
  • Не все пулы будут майнить эту транзакцию, справедливо считая её даблспендом. Некоторые пулы будут ее майнить, но это может занять больше времени (по сравнению со временем если вся сеть будет её майнить)
  • Если новая транзакция будет таки включена в блок — это абсолютно валидно и не противоречит правилам сети. Любые претензии потенциально обманутых нигде не принимаются

Т.о. мы приходим к мысли что любые транзакции без подтверждения хотя бы в 2х блоках являются ненадежными. Почему в 2х а не 1м? Короткий ответ — orphaned blocks.

Ссылки и материалы:

  • github.com/bitcoin/bips/blob/master/bip-0125.mediawiki — BIP-0125
  • github.com/OutCast3k/coinbin — исходники coinb.in
  • en.bitcoin.it/wiki/Transaction_broadcasting — список ендпоинтов где можно ретранслировать транзакции. Некоторые могут принять double spend транзакцию.

Бонус!

История 1.

Как-то один из проектов использующих мой биткоин платежный шлюз взломали, и поставили на вывод 2 BTC. В той версии шлюза была захардкоджена комиссия 0.0001 BTC, что было достаточно мало на тот момент. Времени оказалось достаточно чтобы во всем разобраться и заменить транзакцию на возврат средств, повысив комиссию до 0.1 BTC. Злоумышленники наверное расстроились. Мораль — используйте RBF во благо!

История 2.

Я на bitmedia.io пополнял счет биткоином. Счет там пополняется засчитывая входящие транзакции на специальный top-up адрес пользователя, и прибавляя сумму транзакции к общему балансу пользователя. Засчитываются только транзакции с 6 подтверждениями.

Баланс я хотел пополнить поскорее, поэтому когда первая транзакция зависла, я несколько раз заменял транзакцию с помощью RBF. Когда транзакция подтвердилась — баланс мне приплюсовался в столько раз больше, сколько RBF замен я сделал. Я сразу написал в поддержку, чтобы баг исправили. В благодарность лишние 0.3 BTC мне подарили как bug bounty. Мораль — проверьте свои системы как они поведут себя с RBF!
Поделиться с друзьями
-->

Комментарии (3)


  1. f9k56
    24.04.2017 13:18
    #10188454
    +1

    Возможность замены адреса однозначно уязвимость. Очень похоже на то, что жадность и монополизм установившие контроль над этой валютой и идущие против интересов сообщества поставят на ней крест, если не будет серьезных изменений. Хорошо, что конкурирующие валюты активно развиваются. А платёж с неизвестным сроком завершения это вообще нонсенс для расчётной системы.


    1. mayorovp
      25.04.2017 07:50
      #10189596
      +1

      Такая возможность — врожденная особенность любых децентрализованных цифровых валют, являющаяся следствием CAP-теоремы.


  1. MxMaks
    25.04.2017 14:32
    #10190328

    Ни один пул не принял double spend транзакцию везде ошибка: txn-mempool-conflict

МЕТКИ

  • Хабы
  • Теги

Платежные системы

Криптография

Биллинговые системы

bitcoin

rbf

blockchain

cryptocurrency

биткоин

блокчейн

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Разбираемся с Replace-By-Fee транзакциями Bitcoin +10

    • 24.04.2017 07:55

    Пишем собственный платежный шлюз Bitcoin +16

    • 13.09.2015 21:22

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
07:00

Встреча ISO C++ в Софии: С++26 и рефлексия +20

08:44

ИИ-помощник редактора на Хабре: семь раз вайб-код — один раз поймешь +10

08:02

Acer Switch One 10: как я спас необычный планшет-трансформер с барахолки. Что это за устройство? +10

07:30

Цены на дата-центры растут, а ИИ может сдристнуть в Казахстан +10

07:00

Спасаем умный дом на KNX: как быть, если интегратор залочил оборудование +9

07:13

Синдром Бога vs. Реальные Боги +8

07:45

Культура перестраховки: мы смогли перестать согласовывать всё подряд +7

07:22

Base 44: как пет-проект сделанный ИИ, купили за $80 млн +7

07:01

ElastAlert 2 на практике: как я создал универсальное правило для мониторинга событий +6

07:14

Как чек-лист в Confluence убил 70% вопросов о релизах — без автоматизации и бюджета +5

07:02

Ликбез по ЭДО: почему это не просто техническое подключение, а пересмотр процессов, которыми нужно заниматься заранее +5

06:28

Тестируем Revit с GPU. Что показывают A16 и L40S +5

04:27

Как я прокачал английский до B2 в США, разработав своё языковое приложение +5

08:05

Дизайн за 5 минут. Дайджест июня +4

08:00

Десять распространенных заблуждений, связанных с RISC-V +4

05:33

in-аргументы в C#: чем они отличаются от ref, out, и где реально полезны +4

04:17

Почему n8n важен в автоматизации бизнеса: примеры успешной автоматизации +4

08:44

(Не) безопасный дайджест: бабушка-хакер, псевдо-ТП и клондайк краденных кредов +3

07:16

Как мы научили ИИ читать PDF и экономить сотни рабочих часов: полный кейс создания корпоративного ChatGPT +3

04:40

Аналитика зарплат в IT, симулятор бэкенд разработчика — и ещё 8 российских стартапов +3

09:01

«Тупой ИИ» с нами надолго. Почему в новых моделях больше галлюцинаций +105

08:48

Как я убедил виртуальную машину, что у неё есть кулер +78

16:18

NoDPI4Android. Решаем проблему «деградации» YouTube теперь и на Android +67

23:59

Синдром бога: когда ты просто кодишь, а ждёшь миллионы и поклонения +54

07:01

Федеративные возможности YDB: масштабируем разработку вместе со студентами +45

08:04

Я сплю на рабочем месте и вам советую +44

08:08

Регулярные выражения простыми словами. Часть 3 +39

13:01

Радость создания хобби-программ +32

07:43

Как я использую терминал +31

15:01

Большое испытание тюменских кальциевых аккумуляторов: часть 1 — циклирование по ГОСТ +26

12:31

Дайджест новостей из мира науки за прошедшую неделю +24

12:00

Lisuan G100: первый игровой графический чип из Китая. Возможности новинки +21

13:40

Мой худший образец полезного кода +20

01:54

О векторном вычислении экспоненциальной функции +19

13:04

POLLUX: оценка генеративных способностей моделей для русского языка +18

07:35

Продакты в Китае: как мы искали вдохновение для 2ГИС в стране, где навигация — это искусство +17

14:22

Как я проектирую и разрабатываю реальные расширения для Python на Rust +16

08:15

Подводные камни у материнских плат из Поднебесной +16

18:13

После 13 лет разработки ReFS так и не готова заменить NTFS +15

06:25

Какое мрачное(?) будущее нас ждёт по версии Илона Маска +15

08:46

Запускаем настоящую DeepSeek R1 671B на игровом ПК и смотрим вменяемая ли она на огромном контексте (160к) +119

18:14

Подтверждение ИТ-компетенций на ГосУслугах, стоит ли доверять? +60

12:15

Нейробиология восприятия: почему мы никогда не увидим мир «глазами» животного +58

08:00

SoundBlaster AWE32: как звуковая карта из 90-х получила обновление спустя 30 лет +54

09:01

Вычисляем коэффициент популярности крейтов Rust для работы и для хобби-проектов +43

07:57

Кромешная темнота: почему случился блэкаут 2025 года в Испании и Португалии +41

07:05

Ностальгические игры: Fallout +36

13:01

«The Legend of Zelda: Breath of the Wild» — идеальный открытый мир, но какой ценой? +31

11:41

Право на ошибку: история изобретательницы замазки +29

07:08

Анджелина Джоли была права насчёт компьютеров +23

08:57

Project Vend: может ли языковая модель продавать чипсы и вольфрам? +20

02:54

Почему Россия не сможет переломить упадок демографии? +20

15:15

MVP vs MLP: почему минимально жизнеспособного продукта уже недостаточно в 2025 году +18

10:15

Полный гид по 50 идеям, которые формируют современное мышление: от А до Я +17

15:14

Джейлбрейкаем чатботы: ChatGPT без фильтров +12

05:10

Готовим формулы красиво (Libre Office, MS Office и LaTeX) +11

09:00

Как в СССР придумали настольную игру про фондовый рынок +10

15:59

Caddy и 100к доменов: автоматический SSL при одностраничном конфиге +9

13:56

Базы данных. Как выбрать идеальное решение? Полный гид по SQL, NoSQL и не только +9

07:15

ИИ-ассистент программиста: есть ли риск для студентов? Об опыте применения ассистента в образовательном процессе +9

ОБСУЖДАЕМОЕ

  • Почему Россия не сможет переломить упадок демографии? +20

    • 836   32000

    В айти нет денег и повышений -39

    • 299   37000

    Кромешная темнота: почему случился блэкаут 2025 года в Испании и Португалии +41

    • 184   9000

    Мы всё чаще не отличаем реального автора от AI +8

    • 156   1900

    Нейробиология восприятия: почему мы никогда не увидим мир «глазами» животного +58

    • 133   120000

    Подтверждение ИТ-компетенций на ГосУслугах, стоит ли доверять? +61

    • 126   31000

    Польза от «качалок» — любительского бодибилдинга +14

    • 113   22000

    «Тупой ИИ» с нами надолго. Почему в новых моделях больше галлюцинаций +105

    • 79   17000

    Почему тебя поймают списывающим на собеседовании (а ты об этом даже не узнаешь) +2

    • 74   14000

    Анджелина Джоли была права насчёт компьютеров +23

    • 68   21000

    Я сплю на рабочем месте и вам советую +44

    • 64   27000

    Новый двигатель, способный работать на любом топливе, мог бы составить конкуренцию электромобилям +2

    • 57   8700

    Какое мрачное(?) будущее нас ждёт по версии Илона Маска +15

    • 55   5000

    Запускаем настоящую DeepSeek R1 671B на игровом ПК и смотрим вменяемая ли она на огромном контексте (160к) +119

    • 52   27000

    Досмотр мемов на границе США, а также ипотека под залог фарткоина +15

    • 49   8100
  • Главная
  • Контакты
© 2025. Все публикации принадлежат авторам.