Я ищу, в частности, пошаговый пример транзакции отправки биткойнов, которая использует реальную транзакцию ( How To Redeem A Basic Txn , несколько лет назад, отлично описывает большинство шагов отправки необработанного txn, но не не используйте настоящий TxID ).
Я поиграл с библиотекой Python pybitcointools, библиотекой SX и выводом JSON из клиента Bitcoin Core (Bitcoin-QT, Bitcoin-cli, биткойн-демон), но еще не нашел фактического пошагового руководства с использованием необработанного вывода транзакции ( однократный ввод/вывод Bitcoin txn, т.е. не мультиподпись).
Надеюсь, награда принесет пошаговый пример транзакции (с закрытыми ключами для адреса отправки) и принесет ответ, показывающий, как это делается, и, в частности:
РЕДАКТИРОВАТЬ: я думаю, что лучший ресурс — это биткойны Кена Ширриффа , но, опять же, нет ни одного источника в Интернете, который бы ответил на мой вопрос, не просматривая прошлые области, такие как scriptPubKey, подпись и т. д.
Когда я активирую вознаграждение, если вы можете ответить на этот вопрос, обратитесь к этому Tx , поскольку он может служить фактическим примером (т.е. я предоставлю ~ 1 доллар в BTC и закрытые ключи для 1From/1MBngSqZbMydscpzSoehjP8kznMaHAzh9y, если интересно)
РЕДАКТИРОВАТЬ 2: Блог RoyalFork: Деконструкция Txn предоставляет невероятно хороший справочник для интерактивного создания Txn.
Пошаговое описание:
Мы начинаем создавать новую транзакцию, которую хешируем и подписываем.
01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19
76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
(посмотрите на нижнюю строку на https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true )ffffffff
01
23ce010000000000
19
76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
(это перевод средств обратно на адрес 1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc)00000000
01000000
ОК, результат
01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
ffffffff
01
23ce010000000000
19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
00000000
01000000
Теперь мы дважды хешируем всю эту структуру с помощью SHA256, что дает хэш1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f
Теперь мы должны создать подпись ECDSA... 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y
это мозговой кошелек "mrbubbymrbubbymrbubby!" , который просто кодирует адрес, начинающийся с «MB» (что упрощает связывание 2; см. комментарий @WizardOfAussie ниже для получения сведений о происхождении фраз). Закрытый ключ в WIF:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
В шестнадцатеричном формате закрытый ключ имеет вид 0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d
. В каждой криптобиблиотеке есть метод знака (ключа, дайджеста). Он вернет массив байтов. Этот массив будет иметь размер не более 72 байт и начинаться с шестнадцатеричного кода 30. Давайте представим, что подпись 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e
К этой подписи мы добавляем однобайтный хеш-код типа: 01
. Открытый ключ для 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
scriptSig будет
49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
первая строка — «push подпись, объединенная с 01», вторая строка — «push pubkey». Длина scriptSig составляет 140 байт (0x8c в шестнадцатеричном формате).
Затем мы заменяем однобайтовое поле длины varint из шага 5 на длину данных из шага 16. Длина составляет 140 байтов или 0x8C байтов:8c
И мы заменяем фактический scriptSig структурой данных, созданной на шаге 16.
Мы заканчиваем удалением четырехбайтового типа хэш-кода, который мы добавили на шаге 13, и получаем следующий поток байтов, который является финальной транзакцией:
01000000 01 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 00000000 8c 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 ffffffff 01 23ce010000000000 19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac 00000000
Это отличный ответ от amaclin и Wizard of Ozzie. Я просто хотел бы добавить некоторые подробности о транзакции Волшебника Оззи на blockchain.info .
Правильные входные данные для процесса подписи для этой транзакции:
01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
ffffffff
01
23ce010000000000
19 76 a9 14 2bc89c2702e0e618db7d59eb5ce2f0f147b40754 88 ac
00000000
01000000
Хэш с двойным SHA256 вычисляется bx
как
d304448dff517bcf677cd36f3491e9ef2ccfdf40fb63af5782d9b768640af130
но это написано в «обратном» порядке по какой-то особой исторической причине (я слышал, что это должно было быть совместимо с M * soft CRAPi). Поэтому при использовании этого с sign(key, digest)
наиболее разумными криптографическими инструментами вам может потребоваться изменить хеш-значение на «правильный» порядок дляSHA256(SHA256(m))
30f10a6468b7d98257af63fb40dfcf2cefe991346fd37c67cf7b51ff8d4404d3
Вышеупомянутые входные данные действительно будут проверяться на соответствие подписи, указанной в фактической транзакции блокчейна.
3045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e
используя данный открытый ключ
042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
Чтобы сгенерировать воспроизводимую подпись для тех же данных, следующая подпись была сделана детерминированным методом RFC6979 .
30450220587ce0cf0252e2db3a7c3c91b355aa8f3385e128227cd8727c5f7777877ad772022100edc508b7c14891ed15ab38c687019d7ebaf5c12908cf21a83e8ae57e8c47e95c
используя соответствующий закрытый ключ, предоставленный Wizard of Ozzie
0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d
Эта подпись также проверяет указанные данные с использованием открытого ключа и должна быть воспроизводимой.
Ник Оделл
морсекодер
Волшебник Оззи
Волшебник Оззи
морсекодер
Волшебник Оззи
Волшебник Оззи
Дэвид А. Хардинг
k
), а одним из методов создания секретного значения является одноразовое случайное число. Если вам нужны идеально воспроизводимые шаги, вы должны указать, что либо значениеk
должно быть предоставлено в инструкциях, либо что будет использоваться детерминированная генерация RFC6979k
.