Ошибка блочного шифра Неканоническая подпись: неверный маркер длины

Я пытаюсь подписать биткойн-транзакцию testnet с использованием blockcypher, но когда я отправляю транзакцию, я получаю сообщение об ошибке:

Error building input: Error generating scriptsig when building transaction: Invalid signature: Non-canonical signature: wrong length marker

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

var bitcoin = require("bitcoinjs-lib");
var buffer  = require('buffer');
var keys    = new bitcoin.ECPair.fromWIF('cMvPQZiG5mLARSjxbBwMxKwzhTHaxgpTsXB6ymx7SGAeYUqF8HAT', bitcoin.networks.testnet);

var newtx = {
  inputs: [{addresses: ['ms9ySK54aEC2ykDviet9jo4GZE6GxEZMzf']}],
  outputs: [{addresses: ['msWccFYm5PPCn6TNPbNEnprA4hydPGadBN'], value: 1000}]
};
// calling the new endpoint, same as above
$.post('https://api.blockcypher.com/v1/btc/test3/txs/new', JSON.stringify(newtx)).then(function(tmptx) {
 console.log(tmptx);
// signing each of the hex-encoded string required to finalize the transaction
 tmptx.pubkeys = [];
 tmptx.signatures = tmptx.tosign.map(function(tosign, n) {
 tmptx.pubkeys.push(keys.publicKey.toString("hex"));

var SIGHASH_ALL = 0x01;
return bitcoin.script.signature.encode(keys.sign(new buffer.Buffer(tosign, "hex")),SIGHASH_ALL,).toString("hex");

 });

// sending back the transaction with all the signatures to broadcast
 $.post('https://api.blockcypher.com/v1/btc/test3/txs/send', tmptx).then(function(finaltx) {
 console.log(finaltx);
 }).catch(function (response) {
 console.log(response.responseText);
});

}).catch(function (response) {
 console.log(response.responseText);
});

Это то, что он возвращает с точки зрения pubkeys, подписи, tosign

pubkeys: Array [ "0280eed82a88edb3c9e303c5bae330c95db41d9f92cafd6081efb6029c6bf38bc6" ]
​
signatures: Array [ "3044022009823c6cffc38b406322f507c36a3875b52a6151eaea80583821c7a5d1bf776d02203690252f20a4fc9a18350d77adc9c3ef0e6b3c5037dceb623aac38904e7062f701" ]
​
tosign: Array  [ "2ebdbde14f8bc2e6d949832e8dfd026147120ce60ff575c70c06f708be1e8556" ]

Как говорится и ошибка с подписью, я могу только думать, что это может быть эта строка

  var SIGHASH_ALL = 0x01;
  return bitcoin.script.signature.encode(keys.sign(new buffer.Buffer(tosign, "hex")),SIGHASH_ALL,).toString("hex");

Кто-нибудь знает, что это значит? и как это решить?

2 ответа

Пожалуйста, попробуйте это. В соответствии с новыми изменениями я адаптировал следующие вещи. Пожалуйста, попробуйте следующий ответ и проверьте его.

tmptx.pubkeys.push(keys.publicKey.toString('hex'));
let signature = keys.sign(Buffer.from(tosign, "hex"));
let encodedSignature = bitcoin.script.signature.encode(signature,bitcoin.Transaction.SIGHASH_ALL);
let hexStr = encodedSignature.toString("hex").slice(0, -2); return hexStr;

Причина сбоя в том, что BlockCypher автоматически добавляет SIGHASH_ALL. Вот быстрый способ исправить это.

      return bitcoin.script.signature.encode(keys.sign(new buffer.Buffer(tosign, "hex")), SIGHASH_ALL).toString("hex").slice(0, -2);
Другие вопросы по тегам