Как ускорить транзакцию в биткоинах с функцией Replace-By-Fee
Если в период зарождения биткоина почти любая транзакция проходила в рамках 10 минут, а комиссия сети отсутствовала, то теперь подтверждения иногда приходится ждать часами или сутками. Надеяться на улучшение ситуации в ближайшем будущем не приходится, так как. спрос на биткоин продолжает расти. Из этой статьи вы узнаете, от чего зависит время проведения транзакции и как можно ускорить зависшую транзакцию в биткоинах.
Ниже описаны факторы, которые влияют на скорость транзакции в BTC.
«Вес» транзакции
Каждая планируемая транзакция в биткоинах имеет определенный «вес» в байтах, что напрямую влияет на величину комиссии, необходимой для быстрого подтверждения.
«Вес» транзакции включает (справа примерное количество байтов):
Каждый из входов (адресов, с которых пришли криптоактивы):
Каждый из выходов (адресов, на которые переводятся криптоактивы):
То есть, если 1 BTC вам пришел с десяти адресов, то количество входов определяется так: Input (в байтах) = 148*10 = 1480 байт.
Количество выходов (output) считается аналогично, также надо помнить про «сдачу». Если вы отправляете часть имеющихся монет на 1 адрес, то в ваш кошелек вернется сдача. Таким образом, количество выходов будет не меньше двух: один для отправки и второй для сдачи. Сдачи не будет, если отправляется сумма в BTC, точно совпадающая с суммой одного или нескольких входов. Сложив все параметры, пользователь может определить количество байтов, то есть «вес» транзакции.
Mempool и скорость транзакции
Каждая транзакция в биткоинах должна быть подтверждена майнерами, которые получают за это комиссию. Пользователь или программа кошелька определяет актуальную стоимость передачи объема данных в сети (сатоши/байт), формирует транзакцию и отправляет ее в сеть, в результате она попадет майнерам в мемпул (mempool).
Далее все транзакции в mempool ранжируются в зависимости от размера выставленной комиссии и формируют очередь на подтверждение. Поэтому скорость подтверждения зависит от общего количества транзакций и размера комиссии: чем выше в очереди она находится, тем быстрее будет включена в блок.
Как определить оптимальный размер комиссии
Из вышеописанного становится ясно, что для быстрой транзакции комиссия, которую устанавливает пользователь (кошелек) при отправке, играет ключевую роль. Общая комиссия за транзакцию будет произведением «веса» транзакции на стоимость передачи объема данных в сети (сатоши за байт). И если «вес» транзакции — величина постоянная, то цена в сатоши за байт динамична и, по большому счету, имеет рыночную природу — чем выше спрос на транзакции, тем выше стоимость подтверждения за байт информации.
Например, транзакция размером в 374 байта при стоимость 138 сатоши/байт будет стоить 374*138=51612 сатоши, или 0.00051612 BTC, или 5.16$ при цене биткоина $10 000.
Актуальную стоимость за байт всегда можно посмотреть в обозревателе блоков, например, в Blockchair. Стоит отметить, что комиссия в сети Биткоина не зависит от суммы отправки, то есть с одинаковой комиссией можно отправить как 0.001 BTC, так и 10 BTC.
Различные сервисы по-разному предлагают оплатить пользователям комиссию сети. Одни сразу ставят фиксированную комиссию, которая зачастую выше актуальной, другие перекладывают решение на пользователя. Например, в Trustee Wallet пользователю предлагается три типа комиссии, а также возможность установить комиссию сети вручную.
При отправке пользователь может выбрать любую из предлагаемых комиссий, естественно это будет напрямую влиять на скорость транзакции — Медленно, Средне, Быстро. В вариантах указана цена за байт, стоимость комиссии в биткоине и фиате($).
Эти варианты автоматически рассчитываются приложением исходя из индивидуальной информации о «весе» транзакции и актуальной загруженности сети, которая берется из публичных источников. В этой же вкладке можно установить комиссию вручную, при этом пользователь может поставить любое значение, как выше рекомендованного так и ниже. После выбора комиссии достаточно нажать кнопку Отправить и транзакция попадет в мемпул.
Стоит заметить, что рекомендованная комиссия рассчитывается приложением в момент создания транзакции, поэтому если за время формирования нового блока в сети произойдет всплеск активности, то транзакция может сдвинуться в очереди — она будет оттеснена более привлекательными для майнеров транзакциями. При небольшой загрузке сети транзакция просто попадет в следующий блок, то есть подтвердится за 5-30 минут, в наихудшем случае за несколько часов. Однако, в моменты резкой активности, при резких изменениях курса биткоина комиссия может вырасти мгновенно в несколько раз и на длительное время. При этом транзакция может зависнуть на несколько часов или суток, что совсем неприятно, так как монеты остаются заблокированными все это время.
Варианты событий при «зависании» транзакции
Существуют следующие варианты:
ждать подтверждения (это может занять дни, недели или даже вечность);
ждать отмены транзакции. Это происходит, когда большинство майнеров решают «выкинуть» транзакцию из мемпула. После этого биткоины становятся свободными и ими снова можно пользоваться (точного времени, когда это произойдет нет, но согласно статистике этот процесс занимает не менее 3-х суток);
увеличить комиссию в уже созданной транзакции, пока она находится в мемпуле (функция Replace-By-Fee).
Итак, Replace-By-Fee (RBF) — это редактирование существующей транзакции, которая находится в мемпуле. Это значит, что в новой транзакции будут использованы те же параметры (входы и выходы), что и в старой, но при этом будет изменена комиссия. Узлы сети Биткоина воспринимают отредактированную транзакцию как старую и она переносится в очереди мемпула на более привлекательные для майнеров позиции.
Таким образом, если транзакция «зависла» из-за небольшой комиссии, то оптимальным способом ускорения транзакции будет использование этой функции.
Как использовать функцию Replace By Fee
На самом деле функция Replace-By-Fee доступна в ограниченном количестве криптовалютных кошельков. Порядок действия у всех практически одинаковый, здесь будет рассмотрен процесс ускорения транзакции на примере кошелька Trustee Wallet.
По умолчанию все исходящие транзакции с BTC в Trustee могут быть ускорены. Однако перед отправкой биткоина лучше проверить эту надстройку. Для этого перейдите в Настройки во вкладке Bitcoin и проверьте, что “Редактирование неподтвержденных транзакций” активно. Также рекомендуется активировать и “Использование неподтвержденных транзакций” — это позволит использовать входящие биткоины, которые еще не подтверждены сетью, а также отправлять очередь исходящих транзакций (одну за другой).
Так как функция RBF сейчас находится в тестовом режиме и еще дорабатывается специалистами Trustee, то ее нужно активировать. Для этого следует выполнить простое действие:
На главном экране нажмите и удерживайте кнопку “Добавить актив” до появления специального уведомления. После чего функция RBF станет активной.
Процесс изменения комиссии:
Вернитесь в историю транзакций (вкладка Bitcoin);
Выберите нужную “зависшую” транзакцию и нажмите “Увеличить комиссию”
В открывшейся вкладке установите актуальную цену за байт вручную либо из предложенных вариантов. Актуальную цену можно проверить на сайте обозревателя.
Нажмите “Отправить”. Уведомление “Ваша транзакция успешно отправлена” означает, что увеличение комиссии прошло успешно.
Теперь в деталях транзакции будет два хэша, один старый (неактивный), а другой актуальный, с увеличенной комиссией. Это еще раз подтверждает факт надежности протокола Биткоина и отсутствие “двойных трат” при увеличении комиссии.
Обратите внимание, что блокчейн — это цепочка данных, и каждая транзакция ссылается на предыдущую. Если у вас несколько “зависших” транзакций, то ускорять нужно последнюю отправленную. При этом комиссию нужно установить с учетом ускорения всех “зависших” транзакций — то есть актуальную цену за байт умножить на количество транзакций.
Также рекомендуется использовать адреса Segwit для получения и отправки биткоина (начинаются на bc1 или 3), таким образом транзакции обойдутся дешевле, чем с Legacy адресами (начинаются на 1).
Автор статьи: Михаил Куценко, заместитель директора по развитию бизнеса в Trustee Wallet.
Источник
Разбираемся с Replace-By-Fee транзакциями Bitcoin
Всем привет! В этой статье мы разберемся что такое Replace-By-Fee транзакции и как их использовать. Бонус! Пара поучительных историй в конце.
Итак, представим ситуацию когда A посылает монеты B. Он создает и подписывает транзакцию, и выпускает ее в сеть для подтверждения. К сожалению, транзакция долго не подтверждается, у транзакции слишком маленькая комиссия (или комиссия нормальная в обычных обстоятельствах, но в данный момент очередь неподтвержденных транзакций слишком большая и майнеры предпочитают майнить транзакции с бОльшими комиссиями). Что делать пользователю A? Варианты: a) ждать подтверждения (ждать можно долго) б) ждать отмены транзакции (когда большинство нод решат наконец выкинуть из mempool транзакцию) и освобожденными монетами можно будет снова распоряжаться (то есть создавать транзакции и пулы не будут считать их даблспендами и отвергать) в) Заменить транзакцию с повышением комиссии (RBF)
Итак, RBF — замена существующей транзакции новой транзакцией с повышением комиссии. Замена означает что в новой транзакции будут использованы те же входы что и в старой транзакции, и это не будет считаться даблспендом (читай, мошенничеством). В итоге только одна транзакция будет добавлена в блокчейн (с большой вероятностью это будет транзакция с повышенной комиссией).
Какая транзакция может быть заменена? Это хороший вопрос. Замена транзакций была предусмотрена еще создателем системы Сатоши Накамото, но выключена в определенный момент. Затем она была доработана до RBF и включена в код Bitcoin Core 0.12 и старше. Для замены в данных транзакции предусмотрено специальное int поле nSequence, которое сигнализирует о том, какая транзакция старше какой. Чтоб транзакция была потенциально заменяемой, значение nSequence должно быть меньше (0xffffffff — 1).
По умолчанию, большинство современных кошельков nSequence сразу ставят максимальным, и возможность заменять транзакции надо включать в настройках. Вот так это выглядит в кошельке Electrum:
Пример декодированой транзакции:
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.
Транзакция создана. Обратите внимание на Transaction Fee — это разница между доступным количеством монет суммарно со всех входов МИНУС сумма всех выходов (в нашем случае 1 выход). Разница и будет комиссией которую майнер заберет себе. В этом примере она специально нулевая.
Жмем Sign, копипастим туда полученный hex транзакции, все тот же приватный ключ, и подписываем транзакцию:
Транслируем транзакцию в сеть (можно использовать любой ендпоинт):
Так транзакция выглядит:
Теперь давайте воспользуемся RBF. Создаем новую транзакцию, входы берем с того же WIF. Но выходы укажем совершенно иные! Один из выходов укажем 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg — донейт адрес создателя coinb.in
Amount укажем такие чтоб комиссия за транзакцию была достаточной для быстрого подтверждения.
Обратите внимание на вкладку Inputs — если исходный адрес многоразовый и на нем много транзакций, то нам придется во входах вручную прописать только те инпуты, которые входят в транзакцию которую мы хотим заменить (удалить лишние, оставить только нужные). Входов этих могут быть сотни, и в некоторых случаях это может быть достаточно кропотливая работа.
Вот так это теперь выглядит на blockchain.info. У новой транзакции есть все шансы быть включенной в блок раньше своей предыдущей версии.
Ждем. Есть подтверждение:
Мы только что заменили транзакцию с помощью RBF, причем монеты отправили совсем не на тот адрес который хотели изначально.
Опять о безопасности
Не всегда nSequence=MAX гарантирует что транзакция финальная и заменить ее нельзя. На самом деле галку “Make this a RBF transaction” можно было не ставить, но:
- При замене транзакции не все ноды согласятся ретранслировать новую версию, ссылаясь на mempool-conflict
- Некоторые ноды примут транзакцию, и таки ретранслируют ее в сеть
- Информационные ресурсы типа blockchain.info будут прямым текстом писать DOUBLE SPEND
- Не все пулы будут майнить эту транзакцию, справедливо считая её даблспендом. Некоторые пулы будут ее майнить, но это может занять больше времени (по сравнению со временем если вся сеть будет её майнить)
- Если новая транзакция будет таки включена в блок — это абсолютно валидно и не противоречит правилам сети. Любые претензии потенциально обманутых нигде не принимаются
Т.о. мы приходим к мысли что любые транзакции без подтверждения хотя бы в 2х блоках являются ненадежными. Почему в 2х а не 1м? Короткий ответ — orphaned blocks.
Ссылки и материалы:
Как-то один из проектов использующих мой биткоин платежный шлюз взломали, и поставили на вывод 2 BTC. В той версии шлюза была захардкоджена комиссия 0.0001 BTC, что было достаточно мало на тот момент. Времени оказалось достаточно чтобы во всем разобраться и заменить транзакцию на возврат средств, повысив комиссию до 0.1 BTC. Злоумышленники наверное расстроились. Мораль — используйте RBF во благо!
Я на bitmedia.io пополнял счет биткоином. Счет там пополняется засчитывая входящие транзакции на специальный top-up адрес пользователя, и прибавляя сумму транзакции к общему балансу пользователя. Засчитываются только транзакции с 6 подтверждениями.
Баланс я хотел пополнить поскорее, поэтому когда первая транзакция зависла, я несколько раз заменял транзакцию с помощью RBF. Когда транзакция подтвердилась — баланс мне приплюсовался в столько раз больше, сколько RBF замен я сделал. Я сразу написал в поддержку, чтобы баг исправили. В благодарность лишние 0.3 BTC мне подарили как bug bounty. Мораль — проверьте свои системы как они поведут себя с RBF!
Источник