首页 > 解决方案 > 无法正确冷签名,然后使用冷/在线节点分离发送比特币 tx

问题描述

这是我在堆栈上的第一个帖子之一,如果我做错了什么,请原谅我。我要做的是通过 RPC 实现比特币交易的正确冷签名。我在最后一步被“64:非强制脚本验证标志(签名必须为零,失败的 CHECK(MULTI)SIG 操作)”卡住了,无法继续进行。

我正在使用的架构是:

我想做的是使用在线节点创建原始交易,然后将其转发到离线一个进行签名,然后使用在线节点广播到网络。不幸的是,我无法完成它。与节点的所有交互都是通过 RPC 完成的。

我要做的是:

在离线节点生成新地址:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getnewaddress",
    "params": []
}

将这个新创建的地址作为 watch-only 导入到在线节点:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "importaddress",
    "params": ["address","",false]
}

然后我向这个地址发送一些 BTC 并等待确认。我使用以下方法检查在线节点上的 UTXO 数据:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "listunspent",
    "params": [3]
}

在该调用的结果中,我找到了之前发送的交易的输出。我复制相应 UTXO 的 txid、vout、scriptPubKey 并继续在在线节点上创建原始交易。假设我的 UTXO 的 txid 为 ABC,vout 为 0,数量为 0.002。

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "createrawtransaction",
    "params": [
        [
            {"txid":"ABC","vout": 0}    
        ],
        {
            "someChangeAddress": "0.0005",
            "someOtherAddress": "0.001"   
        }
    ]
}

这是我创建的交易,用于将 0.001 BTC 发送到 someOtherAdress,为此支付 0.0005 BTC,并将剩余的 0.0005 BTC 发送到 someChangeAddress。此调用返回我有效的事务十六进制。我跳过fundrawtransaction,因为我不需要自动费用估算,然后我尝试将此原始交易发送到离线节点进行签名:

 {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "signrawtransaction",
    "params": [
        "transHex",
        [
            {"txid":"ABC","vout":0,"scriptPubKey":"utxoPubKey" }    
        ]
    ]
 }

这再次返回我的事务十六进制,complete返回的 JSON 中的字段设置为 true,因此它应该准备好广播。我采用返回的十六进制并尝试通过在线节点发送:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "sendrawtransaction",
    "params": [
        "signedTransHex"
    ]
}

我希望此时返回 txid ,然后我可以观察到,但我得到的是:

{
    "result":null,
    "error":{
        "code":-26,
        "message":"64: non-mandatory-script-verify-flag (Signature must be zero for failed CHECK(MULTI)SIG operation)"
    },
    "id":1
}

我做错了什么?问题是否与我在单线节点上将 UTXO 用作仅监视的地址有关?但这不重要,因为我要么在冷钱包上签名。我怎样才能让它工作?

标签: bitcoin

解决方案


我能够找到问题并解决问题。我的问题的答案是,从 v0.16 开始,需要将金额与相应的 UTXO 一起传递给signrawtransaction命令。这已在https://github.com/bitcoin/bitcoin/issues/12429中作为错误提交。


推荐阅读