首页 文章

无法正确冷签,然后使用冷/在线节点分离发送比特币tx

提问于
浏览
1

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

我正在使用的架构是:

  • 一个BTC全节点(核心v0.16.1),只能在本地网络中访问 . 此节点具有完整的钱包数据,包括私钥,但没有区块链,也不执行任何P2P活动 . 这是我的离线节点 .

  • 具有公共可用P2P端口的一个BTC全节点(核心v0.16.1)与比特币网络同步,并具有只读钱包 . 这是我的在线节点 .

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

我所做的是:

在脱机节点中生成新地址:

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

将此新创建的地址作为仅限监视导入在线节点:

{
    "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具有ABC的txid,vout 0和0.002的数量 .

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

这是我创建的一个tranaction,发送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" }    
        ]
    ]
 }

这再一次返回我的事务十六进制,返回的JSON中的 complete 字段设置为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仅作为监视的地址有关吗?但这应该不重要,因为我要么在冷钱包上签名 . 我怎样才能使它工作?

1 回答

  • 0

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

相关问题