Я пытаюсь подписать скелет транзакции, возвращаемый Blockcypher, чтобы отправить его, следуя https://www.blockcypher.com/dev/bitcoin/#creating-transactions.
В этом примере я буду использовать совершенно небезопасную мнемонику 'raw raw raw raw raw raw raw raw raw raw raw raw' ', которая с использованием пакета dart bip32 создает BIP32 с закрытым ключом 0x05a2716a8eb37eb2aaa72594573165349498aa6ca20c71346fb15d82c0cbbf7c и адресом mpQfiFFq7SHvzS9ebxMRGVohwHTRJJf9ra для теста.
Blockcypher Tx Skeleton tosign: 1cbbb4d229dcafe6dc3363daab8de99d6d38b043ce62b7129a8236e40053383e.
Используя инструмент подписи Blockcypher:
$ ./signer 1cbbb4d229dcafe6dc3363daab8de99d6d38b043ce62b7129a8236e40053383e 05a2716a8eb37eb2aaa72594573165349498aa6ca20c71346fb15d82c0cbbf7c
304402202711792b72547d2a1730a319bd219854f0892451b8bc2ab8c17ec0c6cba4ecc4022058f675ca0af3db455913e59dadc7c5e0bd0bf1b8ef8c13e830a627a18ac375ab
С другой стороны, используя bip32, я получаю:
String toSign = txSkel['tosign'][0];
var uToSign = crypto.hexToBytes(toSign);
var signed = fromNode.sign(uToSign);
var signedHex = bufferToHex(signed);
var signedHexNo0x = signedHex.substring(2);
где fromNode
- это узел bip32.BIP32. Выход signedHexNo0x = 2711792b72547d2a1730a319bd219854f0892451b8bc2ab8c17ec0c6cba4ecc458f675ca0af3db455913e59dadc7c5e0bd0bf1b8ef8c13e830a627a18ac375ab
.
На первый взгляд, они кажутся совершенно разными буферами, но после детального рассмотрения вывод Blockcypher signer содержит только несколько дополнительных символов, чем у bip32:
Blockcypher signer output (I split it into several lines for you to see it clearly):
30440220
2711792b72547d2a1730a319bd219854f0892451b8bc2ab8c17ec0c6cba4ecc4
0220
58f675ca0af3db455913e59dadc7c5e0bd0bf1b8ef8c13e830a627a18ac375ab
bip32 output (also intentionally split):
2711792b72547d2a1730a319bd219854f0892451b8bc2ab8c17ec0c6cba4ecc4
58f675ca0af3db455913e59dadc7c5e0bd0bf1b8ef8c13e830a627a18ac375ab
Я ожидал, что два 64-значных числа дадут 128-символьную подпись, что и выполняет вывод bip32. Следовательно, вывод Blockcypher signer состоит из 140 символов, то есть на 12 символов больше, чем в предыдущем, что очевидно, если рассматривать его как разделенное на строки, как указано выше.
Я был бы очень благодарен всем, кто пролил свет на эту проблему, которую мне нужно понять и исправить. Мне нужно реализовать решение в dart, я не могу использовать скрипт подписавшего, кроме как для тестирования.