Двойная трата Double-spending - пошаговая инструкция с картинками

MikeySwipe

Premium
Joined
11.03.22
Messages
64
Deposit BTC
0
В связи с тем, что время от времени у пользователей "зависают" транзакции из-за низкой или неправильно указанной комиссии - возникает проблема повторной отправки платежа.
Это можно сделать, например, через Bitcoin Core клиент, но для этого его нужно как минимум скачать и подождать пока синхронизируется весь Блокчейн (около 150 Гб на конец 2017 года).
Другой вариант - вручную собрать транзакцию и отправить ее в сеть, это можно сделать онлайн имея только приватный ключ. Далее описывается именно такой способ.

Различные сервисы предоставляют онлайн кошельки, но многие из них хранят приватный ключ у себя - это далеко не лучший вариант, в один прекрасный момент можно остаться с нулевым балансом, поэтому к выбору онлайн-кошелька стоит отнестись с особой тщательностью.

В данном примере будет использоваться сервис https://txid.io/wallet/ , основанный на Open-Source решении Coinb.in, который не хранит Ваш приватный ключ и даже не передает его по сети, а все действия с ним выполняются в браузере, приватный ключ никогда не передается за пределы вашего компьютера.

1) Нужно знать свой приватный ключ, без него ничего нельзя сделать. В случае, если вы используете онлайн кошелек типа blockchain.info - там этот ключ можно экспортировать. В случае использования core клиента - есть команда dumpprivkey. Этот пример показан для простого случая, когда используется один вход и один выход. Сравнительно новая фича Replace-by-Fee (RBF) в данном конкретном примере не используется.

1а) В случае использования популярного Онлайн-кошелька https://blockchain.info отдельная инструкция по получению приватного ключа для нужного адреса есть в этом сообщении (предпочтительный вариант) или вот в этом сообщении.

2) Для наглядного примера используем следующую транзакцию
https://www.blocktrail.com/BTC/tx/c3c63dbcf7777b4a10473dd59318ad1433abe454276b7a5369e3870a8174a380


post-26542-0-53328500-1483811184_thumb.jpg

С адреса 1AuN48871owVr3SRbidwxMRACsi2QoqekD на адрес 12m5oXmDzY4Ad7rKuF88sFf29bEDiyEEPL было отправлено 0.01019000 BTC (191 байт) с очень низкой комиссией 0.00001000 BTC. Такая транзакция практически никогда не будет подтверждена, вероятность очень низкая.

Задача сделать двойную трату - Double Spending, обычный клиент этого сделать не позволит, но если мы будем собирать транзакцию вручную, то это не проблема. Приступим.

3) Нам нужны данные о входах, для этого нам необходима указанная транзакция в шестнадцатеричном raw-формате.
Взять ее можно, например, на blockchain.info, добавив в адресную строку браузера ?format=hex

https://blockchain.info/tx/c3c63dbcf7777b4a10473dd59318ad1433abe454276b7a5369e3870a8174a380?format=hex

01000000012abae037dd7687ca4b91455f1b48f21c24d193e830bb170d6a3c66ca48509e6f020000006a47304402205ffb001b226e86485b808e972f4b114db4916009752b711cdab29e082ae608c70220712ef618bd4dfd2c7bd8c581ba55ed794e09b866c68f0330d56f659cf7cfc41b012102809dc03bef8fa77bb15407e065c50fb5855372ed374eb05db4266c9011474645ffffffff01788c0f00000000001976a914134e6fd3425fd01c8de1dd75570e942ce39eccfd88ac00000000
Открываем https://txid.io/wallet/ и в меню выбираем Verify, вставляем текст транзакции и нажимаем Submit

post-26542-0-03929300-1483811185_thumb.jpg

Нас интересует только вход, а именно Txid (6f9e5048ca663c6a0d17bb30e893d1241cf2481b5f45914bca8776dd37e0ba2a), номер выхода N (2).

4) Также нам понадобится подписанный скрипт предыдущего выхода, его мы получаем таким же образом. Для этого получаем предыдущую hex транзакцию, которая была входом для адреса, с которого мы отправляли монеты.
https://blockchain.info/tx/6f9e5048ca663c6a0d17bb30e893d1241cf2481b5f45914bca8776dd37e0ba2a?format=hex

0100000001030f1a5d236253755393f3fa79405b77bebb9678653cb0371210fec33ded146f070000008b483045022100f7841029295f33782e6a7e0c3715a59a7db601148f5c56640c7675541be15eec02200adabfda318f417a2c51fb0a2bc152ad9ad67f065ed73a77cf7b0852d3959ab30141047146f0e0fcb3139947cf0beb870fe251930ca10d4545793d31033e801b5219abf56c11a3cf3406ca590e4c14b0dab749d20862b3adc4709153c280c2a78be10cffffffff15a4cc0100000000001976a9146324e56e4df5f8b8ae15e39c7c674deb67f550a888acf3eb0700000000001976a9144b993d0e6587c927c02e39ad3182ccc10a67a61b88ac60900f00000000001976a9146ca05640f6e89a50a27fe09f453bc3db9bcd064488acf18d1200000000001976a9144ebea438ff16b3286e7998a4299d29fde64fb3de88acdf9b1500000000001976a91456a86a5cffa4ae3d07b211b0c5f40f08b8cab7a188ac57d219000000000017a914ab40626275feee23341fbd1fff593bcfaad7a2f48722b024000000000017a914df829efb120fdd8910947ffd4505bb3f7904d4d687213c3000000000001976a914162d1d879ace28171e411e17ee299969bed2ce1488ac104e3800000000001976a914a49ba60dbb898a6508d252631d756cf154fb9fee88acec1d3b00000000001976a91410271bd45e3e3289ae5041a4edabacba1749da9888ac007c92000000000017a9146a8743c6fb7679a7d5f65dc7f020c478291d2c0a875365dc00000000001976a914b8fed54a741a3b25243781372798ac03e1486e5f88ac603c1701000000001976a914afe7c0ebed0013b35ac6a53a108bfd5e0fdb326f88acec609d01000000001976a914e5fe2f7ae1ce179294b452be8dac9140dd766ff888ac619678070000000017a914871ca8a083161999a7fcea6077fca65d0d9d8da687f01358080000000017a914f95b152273931b61ba1078fc3288fb6844e41c04874744440d000000001976a914ff4c10afb6d0ffd58f2a8490ebd1068a4a24d53588acf07be111000000001976a91433602f31035f03f0c541bbd5b797501492402da188ac70f0b32c000000001976a9147bda6b0d53273b256731e97e1c2ef2c206cfe85688acf0d10295000000001976a914ec212c35086ed5242b268db7d95391402b1a58d388acc04e8a170b0000001976a91443849383122ebb8a28268a89700c9f723663b5b888ac00000000
Открываем https://txid.io/wallet/ и в меню выбираем Verify, вставляем текст транзакции и нажимаем Submit

post-26542-0-40905400-1483811185_thumb.jpg

Находим наш адрес 1AuN48871owVr3SRbidwxMRACsi2QoqekD и сохраняем значение Script (76a9146ca05640f6e89a50a27fe09f453bc3db9bcd064488ac)

Все те же самые данные можно получить и из других блокчейн-эксплореров, не обязательно использовать blockchain.info.

Например,
https://bitaps.com/api/raw/transact...7bb30e893d1241cf2481b5f45914bca8776dd37e0ba2a
{"hex": " __raw transaction text__ "", "hash": "..."}

Также, например, по ссылке https://live.blockcypher.com/btc/decodetx/ можно всю информацию получить в одном месте, порядковый номер выхода посчитать, начиная с нуля.


5) Открываем https://txid.io/wallet/ и в выпадющем меню выбираем New -> Transaction

post-26542-0-73454400-1483811185_thumb.jpg

6) Нам нужно указать данные как о входах, так и о выходах.
Сначала в закладке Inputs (входы) указываем данные, которые мы получили в пунктах 3 и 4.

post-26542-0-13033100-1483811186_thumb.jpg

7) Далее указываем Outputs (выходы), можно указать тот же самый адрес получателя, а можно указать другой. В поле Amount указываем сумму к отправке за вычетом комиссии за перевод, комиссия автоматически посчитается и отобразится ниже в поле Transaction Fee. В данном конкретном примере 0.0002 будет вполне достаточно.

Нажимаем Submit, видим новую сгенерированную транзакцию, а также ее размер. Этот размер неподписанной транзакции.
Копируем hex-текст транзакции в буфер обмена.

post-26542-0-43892000-1483811186_thumb.jpg
01000000012abae037dd7687ca4b91455f1b48f21c24d193e830bb170d6a3c66ca48509e6f020000001976a9146ca05640f6e89a50a27fe09f453bc3db9bcd064488acffffffff0140420f00000000001976a914134e6fd3425fd01c8de1dd75570e942ce39eccfd88ac00000000
8) Подписываем. Идем в меню Sign, указываем приватный ключ (он никуда не передается, вся работа с ключом происходит в браузере), нажимаем Submit и получаем уже подписанную транзакцию.

post-26542-0-81878200-1483811186_thumb.jpg

01000000012abae037dd7687ca4b91455f1b48f21c24d193e830bb170d6a3c66ca48509e6f020000006a47304402202492709f4d4a420b237615cb00b85e6a7fa6b5f08b397aeefb806a16c382684f0220348d7ff0d92ff8c628c01a79888da6cba4691da37808f07e82ceeffa71f4711f012102809dc03bef8fa77bb15407e065c50fb5855372ed374eb05db4266c9011474645ffffffff0140420f00000000001976a914134e6fd3425fd01c8de1dd75570e942ce39eccfd88ac00000000
Смотрим ее размер, убеждаемся, что указанной ранее комиссии достаточно для 191 байт.

9) У нас есть новая и уже подписанная транзакция для двойной траты. Чтобы убедиться, что все сделали правильно,
еще раз открываем в новом окне страницу Verify https://txid.io/wallet/#verify , вставляем текст транзакции из п.8 и нажимаем Sumbit.
Проверяем выход - адрес и сумму.

post-26542-0-08478900-1483811187_thumb.jpg

10) Осталось только отправить транзакцию в сеть.
В меню выбираем Broadcast https://txid.io/wallet/#broadcast , вставляем текст подписанной транзакции и отправляем в сеть.

post-26542-0-52019000-1483811187_thumb.jpg

В результате получаем номер новой транзакции с двойной тратой - Txid: 1cd32dd0cadbd8b01027729314af182136053850f51c665cea00ac8b6232cc47

11) В случае какой-либо ошибки, если транзакцию отправить не удалось через пункт Broadcast - пытаемся отправить ее в сеть через
любые другие Push-сервисы, наиболее популярные можно найти на данной странице https://en.bitcoin.it/wiki/Transaction_broadcasting

12) Так как это double-spending транзакция, то не все ноды и, соответвенно, Блокчейн-Эксплореры смогут сразу отобразить ее корректно до подтверждения сетью, поэтому рекомендуется проверять новую транзакцию в разных местах.

post-26542-0-81303200-1483811195_thumb.jpg

post-26542-0-29927000-1483811196_thumb.jpg

post-26542-0-78422500-1483811196_thumb.jpg

После того, когда новая транзакция будет подтверждена и включена в блок - все встанет на свои места и она будет доступна в любом блок-эксплорере.

post-26542-0-27060600-1483811197_thumb.jpg


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

Чтобы пул захотел включить вашу транзакцию в блок и предпочел ее всем остальным, нужно чтобы комиссия вашей транзакции была как минимум столько же, сколько текущие актуальные комиссии в сети, а лучше чтобы комисссия транзакции двойной траты превышала актуальную комиссию на 10-20-30%

Так как для того, чтобы транзакция двойной траты разошлась по сети, нужно ощутимо больше времени, чем просто для обычной транзакции, о которой все ноды знают уже через 5-10-15 секунд, то за это время, пока транзакция разойдется, количество транзакций в мемпуле может существенно вырасти и как следствие вырастет величина комиссии.

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

MikeySwipe

Premium
Joined
11.03.22
Messages
64
Deposit BTC
0
У некоторых возникают вопросы по использованию сервиса двойной траты

https://txid.io/wallet/#double

Постараюсь объяснить по шагам и на русском языке.

image.thumb.png.e7c986229d74e8ee3bddb7b57125dd57.png

Все основные вещи Гугл Переводчик переводит вполне сносно, так что можете пользоваться и просто выбрать перевод в браузере Гугл Хром, это очень просто.

image.thumb.png.f4abb2ab5489973692adb60f6e9b7daa.png


1) Сервис не бесплатный, комиссия 10%, но не менее 0.005 BTC, но не более 0.05 BTC
Для совсем мелких транзакций комиссия составляет от 0.0001 до 0.004 и считается автоматически, за вычетом комиссии сети.
Комиссия считается только от конкретного входа или конкретного адреса, который вы тратите, а не от всей транзакции. Если у вас завис платеж на сумму 1 BTC с трех адресов с суммами 0.05, 0.15 и 0.8, то вы выбираете любой из них и комиссия считается только от него. Например, выбираете адрес с 0.05 и платите только 0.005, но не 0.1 BTC. Но если вход всего один, тогда вариантов нет.

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

2) В строке Private Key указываете свой приватный ключ от того адреса, с которого вы отправляли монеты.
В разных кошельках существуют разные способы получения приватных ключей, например, в Bitcoin Core это команда в консоли dumpprivkey, в Электруме приватные ключи можно найти в меню Wallet -> Private Keys -> Export, в Онлайн кошельке blockchain.info приватный ключ можно найти в Настройках -> Адреса или извлечь из резервной фразы 12 слов, один из вариантов получения ключей - через Электрум, подробная инструкция здесь (предпочтительный вариант). Альтернативный вариант получение приватного ключа описан здесь.

Приватный ключ никуда не передается, он используется только в вашем браузере, таким образом если у вас на компе нет вирусов и прочих непонятных программ, то использование данного способа вполне безопасно.

3) После ввода приватного ключа автоматически декодируется адрес (три варианта - Legacy, Segwit, Bech32), с одного из которых и будет происходить двойная трата. Перед тем как отправить транзакцию - вы сможете убедиться, что это то самый адрес, который вам нужен.

4) В строке Unconfirmed TXID to Doublespend указываете номер неподтвержденной транзакции, которая у вас зависла и которую вы хотите "отменить" или переделать. Среди входов данной транзакции будут выбраны все, которые соответствуют вашему приватному ключу, если входов несколько. После чего среди них будет автоматически выбран один вход, который будет потрачен.

5) В строке New Output address указываете адрес, куда вы желаете отправить монеты с того адреса, который вы тратите дважды. Это может быть совершенно новый адрес, адрес получателя из предыдущей транзакции или даже адрес отправителя, никакой разницы нет, для BTC нет ограничений, куда отправлять монеты.

6) Комиссия в строке New Network Fee рассчитывается автоматически с учетом актуальной ситуации и загруженности сети Bitcoin. Если вы не понимаете как считать, то ничего не трогайте и используйте автоматически режим, это оптимальный и рабочий вариант. Но если вы продвинутый пользователь, то можете убрать галочку и поставить любую комиссию которую хотите. Имейте ввиду, в большинстве случае не получится поставить низкую комиссию и потом протолкнуть в акселераторах, так двойная трата не работает, объяснение можно прочитать вот здесь.

7) Нажимаете кнопку Submit.
В этот момент происходит создание новой транзакции двойной траты на сервере, после чего она возвращается к вам в браузер для подписи и автоматически подписывается, используя указанный приватный ключ.

8 ) Новую подписанную транзакцию вы увидите в окошке в зеленой рамке и появится кнопка Broadcast, только после нажатия этой кнопки транзакция будет отправлена в сеть. До нажатия ничего не происходит, новая транзакция никуда не отправляется, поэтому если вас не устраивает комиссия - вы просто можете закрыть окно в браузере и не отправлять транзакцию.

9) Перед нажатием на кнопку Broadcast у вас есть возможность проверить новую транзакцию и увидеть, на какой адрес и какая сумма будет отправлена. Для этого копируете новую транзакцию из окошка с зеленой рамкой в буфер обмена, открываете в новом окне закладку Verify, вставляете туда текст и нажимаете Submit. В результате видите 2 адреса: один адрес ваш, который вы указали в пункте 5, второй адрес - адрес сервиса, он добавляется автоматически. Также вы видите все суммы. Если все устраивает, то возвращаетесь на страницу в п.7 и жмете Broadcast.

10) Все! Ожидаете какое-то время. После того, как новая транзакция подтвердится, то старая пропадает из сети. Все непотраченные входы, если их было несколько, вернуться в ваш кошелек и вы сможете потратить их уже обычным способом.

Нужно понимать, что двойная трата это не моментальный процесс. Суть двойной траты в том, чтобы вытеснить из сети вашу старую транзакцию и заменить ее новой транзакцией. В связи с особенностями работы сети Bitcoin это невозможно сделать моментально, новая транзакция будет подтверждена за время от 5 минут до 24 часов. Иногда бывает так, что двойная трата может не сработать и подтвердится ваша оригинальная транзакция, особенно если вы пытались использовать разные ускорители. Еще раз, это особенность работы сети Bitcoin, никто не может повлиять на эту ситуацию. Сервисом предусмотрены все возможные необходимые меры, чтобы ваша транзакция подтвердилась как можно быстрее.

Если есть вопросы, то не стесняйтесь спрашивать и учиться!