Почему инструмент подписи Blockcypher возвращает несколько дополнительных символов, чем пакет dart bip32?
Я пытаюсь подписать скелет транзакции, возвращаемый Blockcypher, чтобы отправить его, следуя https://www.blockcypher.com/dev/bitcoin/.
Для этого примера я буду использовать полностью небезопасный "сырой сырой сырой сырой сырой сырой сырой сырой сырой сырой сырой сырой" мнемонические, который с помощью дротика bip32 пакета создает BIP32 с закрытым ключом 0x05a2716a8eb37eb2aaa72594573165349498aa6ca20c71346fb15d82c0cbbf7c и адресом mpQfiFFq7SHvzS9ebxMRGVohwHTRJJf9ra для BTC testnet.
Blockcypher Tx Скелет 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 есть только несколько дополнительных символов, чем у 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 содержит 140 символов, то есть на 12 символов больше, чем первый, что становится ясно, если рассматривать его как разделенное на строки, как указано выше.
Я был бы очень благодарен всем, кто пролил свет на эту проблему, которую мне нужно понять и исправить. Мне нужно реализовать решение в dart, я не могу использовать скрипт подписавшего, кроме как для тестирования.
1 ответ
Пакет dart bip32, похоже, кодирует подпись не в формате DER, а в простой кодировке (r, s). Однако для Биткойна требуется DER. Для получения дополнительной информации см.:
https://bitcoin.stackexchange.com/questions/92680/what-are-the-der-signature-and-sec-format
Вы можете либо добавить дополнительные байты DER в соответствии с вашими r и s, либо проверить, есть ли кодировка DER в библиотеке dart bip32.