Почему инструмент подписи Blockcypher возвращает некоторые дополнительные символы, чем пакет dart bip32?

Я пытаюсь подписать скелет транзакции, возвращаемый 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, я не могу использовать скрипт подписавшего, кроме как для тестирования.


person Bruno Calmels    schedule 16.05.2020    source источник


Ответы (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.

person Matthieu    schedule 17.05.2020
comment
Отлично, Матье, это наставило меня на верный путь. Я применил подпись DER, и она отлично сработала. Я подумываю даже сделать пиар о bip32 dart, может быть, кто-то еще воспользуется этим. Спасибо! - person Bruno Calmels; 19.05.2020