首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >块密码错误非规范签名:错误的长度标记

块密码错误非规范签名:错误的长度标记
EN

Stack Overflow用户
提问于 2019-06-01 19:12:37
回答 2查看 282关注 0票数 4

我正在尝试使用blockcypher签署比特币testnet交易,但当我发送交易时,我收到错误消息:

代码语言:javascript
复制
Error building input: Error generating scriptsig when building transaction: Invalid signature: Non-canonical signature: wrong length marker

下面是im用来创建和签名事务的完整代码

代码语言:javascript
复制
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);
});

这是它在pubkey、签名和签名方面返回的内容

代码语言:javascript
复制
pubkeys: Array [ "0280eed82a88edb3c9e303c5bae330c95db41d9f92cafd6081efb6029c6bf38bc6" ]
​
signatures: Array [ "3044022009823c6cffc38b406322f507c36a3875b52a6151eaea80583821c7a5d1bf776d02203690252f20a4fc9a18350d77adc9c3ef0e6b3c5037dceb623aac38904e7062f701" ]
​
tosign: Array  [ "2ebdbde14f8bc2e6d949832e8dfd026147120ce60ff575c70c06f708be1e8556" ]

由于它声明和签名错误,我只能认为它可能是下面这一行

代码语言:javascript
复制
  var SIGHASH_ALL = 0x01;
  return bitcoin.script.signature.encode(keys.sign(new buffer.Buffer(tosign, "hex")),SIGHASH_ALL,).toString("hex");

有人知道这是什么意思吗?如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2020-04-26 15:44:42

请试一下这个。根据新的变化,我已经适应了以下内容。请尝试以下答案并对其进行测试。

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2021-06-24 14:41:27

失败的原因是因为BlockCypher会自动添加SIGHASH_ALL。这里有一个快速修复它的方法。

代码语言:javascript
复制
return bitcoin.script.signature.encode(keys.sign(new buffer.Buffer(tosign, "hex")), SIGHASH_ALL).toString("hex").slice(0, -2);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56406198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档