Форум о криптовалютах | Майнинг криптовалют | Торговля криптовалютой | Инвестиции в криптовалюту
Вернуться   Форум о криптовалютах | Майнинг криптовалют | Торговля криптовалютой | Инвестиции в криптовалюту > Библиотека криптовалюты > Полезные статьи. Разработка. Безопасность

Полезные статьи. Разработка. Безопасность Полезные статьи о криптовалюте. Терминология блокчеин.

Advertising

Ответ
Опции темы
Непрочитано 20.05.2018, 22:15   #1
ADMINISTRATOR
 
Регистрация: 01.01.2018
Сообщений: 168
По умолчанию Двойная трата (Double-spending) в Bitcoin - пошаговая инструкция

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

Двойная трата (Double-spending) в Bitcoin - пошаговая инструкция. Как провести дабл спенд?

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

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

В данном примере будет использоваться сервис 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/c3...e3870a8174a380



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

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

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

https://blockchain.info/tx/c3c63dbcf...380?format=hex

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



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

4) Также нам понадобится подписанный скрипт предыдущего выхода, его мы получаем таким же образом. Для этого получаем предыдущую hex транзакцию, которая была входом для адреса, с которого мы отправляли монеты.

https://blockchain.info/tx/6f9e5048c...a2a?format=hex

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



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

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

Например,

https://bitaps.com/api/raw/transact....8776dd37e0ba2a

{"hex": " __raw transaction text__ "", "hash": "..."}

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

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



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



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

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



Код:
01000000012abae037dd7687ca4b91455f1b48f21c24d193e830bb170d6a3c66ca48509e6f020000001976a9146ca05640f6e89a50a27fe09f453bc3db9bcd064488acffffffff0140420f00000000001976a914134e6fd3425fd01c8de1dd75570e942ce39eccfd88ac00000000
8) Подписываем. Идем в меню Sign, указываем приватный ключ (он никуда не передается, вся работа с ключом происходит в браузере), нажимаем Submit и получаем уже подписанную транзакцию.



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


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



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



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

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

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







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



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

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

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

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




Текущее время: 10:49. Часовой пояс GMT +2.