bitcoin - 无法正确冷签名,然后使用冷/在线节点分离发送比特币 tx
问题描述
这是我在堆栈上的第一个帖子之一,如果我做错了什么,请原谅我。我要做的是通过 RPC 实现比特币交易的正确冷签名。我在最后一步被“64:非强制脚本验证标志(签名必须为零,失败的 CHECK(MULTI)SIG 操作)”卡住了,无法继续进行。
我正在使用的架构是:
- 一个 BTC 全节点(核心 v0.16.1),只能在本地网络中访问。该节点拥有完整的钱包数据,包括私钥,但没有区块链,也不执行任何 P2P 活动。这是我的离线节点。
- 一个 BTC 全节点(核心 v0.16.1),具有公开可用的 P2P 端口,同步到比特币网络,并具有只读钱包。这是我的在线节点。
我想做的是使用在线节点创建原始交易,然后将其转发到离线一个进行签名,然后使用在线节点广播到网络。不幸的是,我无法完成它。与节点的所有交互都是通过 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 用作仅监视的地址有关?但这不重要,因为我要么在冷钱包上签名。我怎样才能让它工作?
解决方案
我能够找到问题并解决问题。我的问题的答案是,从 v0.16 开始,需要将金额与相应的 UTXO 一起传递给signrawtransaction
命令。这已在https://github.com/bitcoin/bitcoin/issues/12429中作为错误提交。
推荐阅读
- sql - SQL 检查是否添加了新的商店组,然后相应地标记他们的商店
- reactjs - React: setState 与 spad 运算符似乎直接修改状态
- .net - Swashbuckle.AspNetCore Swagger [5.0.0 | OpenAPI 3.0] 过滤器来设置消费/生产
- c - getchar() != ' ' 和 getchar() = ' '
- ruby-on-rails - 如何分离开发和生产sidekiq工人
- c - 带有条件的循环中的scanf()不起作用
- wordpress - 当 the_content 正常工作时,为什么过滤器 the_title 不起作用?
- node.js - 如何从猫鼬模型中的数组中删除对象
- javascript - Swiper js,将 currentTime 重置为 0 幻灯片的视频
- android - 构建失败并出现异常 java.io.IOException: Permission denied