如何通过Bitcoin Core RPC调用创建含自定义P2SH地址的交易?
用Bitcoin Core RPC创建自定义P2SH地址交易的完整流程
嘿,你的思路方向完全正确!确实需要先创建指向P2SH地址的未签名交易,再通过签名接口传入redeemScript完成验证签名。下面是一步步的具体操作:
1. 准备自定义redeemScript(十六进制格式)
首先你得先有自己的自定义脚本(比如多签、时间锁脚本等),并把它转换成十六进制编码。举个例子,如果你要做2-of-2多签脚本,可以用createmultisig生成:
createmultisig 2 '["公钥1","公钥2"]'
返回结果里的redeemScript字段就是你需要的十六进制脚本。如果是自己编写的自定义脚本,也可以用decodescript验证格式是否正确。
2. 获取对应的P2SH地址
有了redeemScript后,调用decodescript传入脚本十六进制,就能得到对应的P2SH地址:
decodescript "你的redeemScript十六进制"
返回结果中的p2sh字段就是你要用来作为交易输出的目标地址。
3. 创建未签名原始交易
用createrawtransaction指定你的UTXO作为输入,输出设置为刚才拿到的P2SH地址:
createrawtransaction '[{"txid":"你的UTXO交易ID","vout":输出索引}]' '{"P2SH地址": 转账金额}'
执行后会得到一串未签名的交易十六进制字符串,记下来(比如叫unsigned_tx)。
4. 传入redeemScript完成签名
这一步是关键!你需要用signrawtransactionwithkey(新版本推荐,替代旧的signrawtransaction)来签名,并且在解锁参数里传入redeemScript,这样节点才能验证签名是否符合P2SH的解锁规则。命令格式如下:
signrawtransactionwithkey "unsigned_tx" '["你的私钥"]' '[{"txid":"UTXO的txid","vout":输出索引,"scriptPubKey":"UTXO对应的脚本公钥","redeemScript":"你的自定义redeemScript十六进制"}]'
- 第二个参数是用来签名的私钥列表(如果是多签,需要对应数量的私钥)
- 第三个参数是输入的解锁详情,必须包含
redeemScript,否则节点无法识别P2SH的解锁条件
执行后会返回签名后的交易数据,其中hex字段就是已签名的交易十六进制。
5. 广播交易
最后用sendrawtransaction把已签名的交易广播到比特币网络:
sendrawtransaction "已签名的交易十六进制"
几个关键注意事项
- 确保你的私钥满足redeemScript的验证要求(比如多签需要对应数量的私钥签名)
- 旧版
signrawtransaction也可以用,但参数格式略有不同,建议优先用signrawtransactionwithkey - 如果是嵌套隔离见证的P2SH-P2WSH交易,流程类似,但需要在签名时额外指定
witnessScript字段
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

