使用Ruby的bitcoin gem签名比特币交易遇类型错误求助
解决bitcoin-ruby签名交易时的Script类型错误
看起来你在使用bitcoin-ruby签名比特币交易时遇到了脚本类型不兼容的问题,结合你的代码和错误堆栈,我整理了几个关键的排查方向和解决办法:
1. 先检查前置交易的加载方式是否正确
你代码里用了Bitcoin::P::Tx.from_hash(...),但这个方法是用来从**交易哈希(txid)**创建Tx对象的,而不是加载完整的交易数据。如果你的参数是前置交易的十六进制字符串,应该改用Bitcoin::P::Tx.from_hex(...)来加载完整的交易信息。
如果加载的交易对象不完整(只有哈希没有实际的输出脚本),库就无法识别脚本类型,自然会抛出这个错误。修正后的代码片段应该是这样:
# 替换成你的前置交易完整十六进制字符串 prev_tx = Bitcoin::P::Tx.from_hex('0100000001...') txn = build_tx do |tx| tx.input do |i| i.prev_out(prev_tx) i.prev_out_index(0) i.signature_key(key) # 直接用之前定义的key即可,不用重复from_base58 end tx.output do |o| o.value(50000) o.to('1GzqkR2zNQUzHLpE7PLPjVNJ51FHC3bpDH') end end
2. 确认前置交易的输出脚本类型在支持范围内
错误提示明确说明只支持hash160(即P2PKH)、pubkey、p2wpkh或multisig这几种脚本类型。你可以先打印出前置交易输出的脚本类型,确认是否符合要求:
prev_tx = Bitcoin::P::Tx.from_hex('你的前置交易十六进制') puts "脚本类型: #{prev_tx.out[0].script.type}"
如果输出是p2sh、p2wsh这类不在列表里的类型,你用的0.0.19版本(确实非常老旧)的builder模块不支持自动签名这类脚本,需要手动处理:
- 对于P2SH,你需要提供对应的redeem脚本,并在签名时明确指定
- 对于隔离见证的复杂脚本,建议直接升级库版本来获得支持
3. 升级bitcoin-ruby到最新版本
你当前使用的0.0.19版本是多年前的旧版本,对新的比特币脚本类型支持有限。升级到最新版本能解决很多兼容性问题:
gem update bitcoin-ruby
新版本的库不仅支持更多脚本类型的自动签名,还修复了不少旧版本的bug,大概率能解决你的问题。
4. 确认签名密钥与前置交易输出匹配
虽然你提到换密钥也报错,但还是要确认签名密钥对应的公钥确实能解锁前置交易的输出。比如如果前置交易是P2PKH类型,那密钥的公钥哈希必须和输出脚本里的hash160值完全一致。
希望这些方法能帮你顺利解决问题!
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

