交易签名失败问题

oxy9LoYX 水手 发布在 疑难解答
 48696  17

想实现btc离线签名-测试链

代码传到了github上 代码点击直达
代码执行生成的结果在 bitcoin core 控制台执行

sendrawtransaction 0100000001932fd8f9e8644bd8aa72e0079bb3f13334991507d3d69f118bdd378304d8b26a010000008b483045022100c5f737aef48b2eae3442c8dd96211aec496f137c9980fb7d9793398a401fb4d30220449ec2e495e0379c66a50a5837be447dfb4e81c3d0beb770f5e81f617c6a657f014104071c5a58bf0181f2fcc9563264551203a13cc80e90bb5325c34b62ff2ad29409a1d35862beacd3750e59c3511884fc7a45e6533fa135ce3c5d39cfc9d3bc8bd8ffffffff01282300000000000017a9145a9acdf9ac5b5cd0dfbfbd72717f4f8a442c8b708700000000

报错:

mandatory-script-verify-flag-failed (Script evaluated without error but finished with a false/empty top stack element) (code 16) (code -26)

搜了下,貌似是脚本问题?不知道怎么改…新手入门,大佬们请赐教.

  • 正序
  • 最新
只看帖主 楼层直达
  • BurntCoins 副船长 2020-03-31 22:26:28 只看该作者 沙发
    你要花掉的UTXO,看上去是P2SH输出,不知道你为啥用P2PKH去签名它。我也不知道你这个P2SH里封装了什么。
    而且你还用了非压缩公钥来生成地址,现在一般都用压缩公钥了,这样生成的是另一个不同的地址,可以节省字节数。
  • BurntCoins 副船长 2020-03-31 22:50:23 只看该作者 板凳
    报错信息,就是验证不通过而已。
  • BurntCoins 副船长 2020-03-31 23:00:05 只看该作者 地板
    冷钱包签名这方面可以了解一下PSBT,PSBT就是要统一交易格式(里面还包括了前一个交易的信息,这样可以避免这类搞错UTXO类型的错误,或者说避免黑客偷换这方面的信息导致资金受损),这样A钱包软件生成的未签名交易可以交给B钱包软件进行签名。
    还有……我不是程序员,但我知道连《精通比特币》里的示例代码都出现过严重bug,所以我觉得在这方面需要特别小心,最好还是直接用很完善的解决方案。
  • oxy9LoYX 水手 2020-03-31 23:06:08 只看该作者 5楼
    BurntCoins 发表于2020-03-31 23:00:05 冷钱包签名这方面可以了解一下PSBT,PSBT就是要统一交易格式(里面还包括了前一个交易的信息,这样可以避免这类搞错UTXO类型的错误,或者说避免黑客偷换这方面的信息导致资金受损),这样A钱包软件生成的未签名交易可以交给B钱包软件进行签名。
    还有……我不是程序员,但我知道连《精通比特币》里的示例代码都出现过严重bug,所以我觉得在这方面需要特别小心,最好还是直接用很完善的解决方案。
    感谢大佬指点,最近因为工作刚入币圈,对交易原理不是特别了解,有推荐的入门文档(最好电子书..)吗?
    楼层直达
  • oxy9LoYX 水手 2020-04-01 10:59:23 只看该作者 6楼
    BurntCoins 发表于2020-03-31 22:26:28 你要花掉的UTXO,看上去是P2SH输出,不知道你为啥用P2PKH去签名它。我也不知道你这个P2SH里封装了什么。
    而且你还用了非压缩公钥来生成地址,现在一般都用压缩公钥了,这样生成的是另一个不同的地址,可以节省字节数。
    我看这个库的方法自动判断类型了啊,为什么您说是`用P2PKH去签名`的呢
    楼层直达
  • BurntCoins 副船长 2020-04-01 11:11:57 只看该作者 7楼
    oxy9LoYX 发表于2020-03-31 23:06:08 感谢大佬指点,最近因为工作刚入币圈,对交易原理不是特别了解,有推荐的入门文档(最好电子书..)吗?
    我也推荐不好……只能说说尽人皆知的。

    其实 bitcoin.org 官网就有个文档资源列表:https://bitcoin.org/en/developer-documentation
    bitcoincore.org Core开发组官网,上面有隔离见证钱包的简要开发指南:https://bitcoincore.org/en/segwit_wallet_dev/

    《精通比特币》这个不用多说了。貌似中译本版本还有滞后,可以直接看这里(不过是英文的):https://github.com/bitcoinbook/bitcoinbook
    里面有个代码错误:https://www.solidot.org/story?sid=55390

    比特币维基当然也可以参考:https://en.bitcoin.it/
    有什么问题可以去Bitcoin StackExchange搜一搜:https://bitcoin.stackexchange.com/
    当然还有Reddit、bitcointalk这些社区可以参考,不少大佬都在这里逛。
    楼层直达
  • BurntCoins 副船长 2020-04-01 11:42:24 只看该作者 8楼
    oxy9LoYX 发表于2020-04-01 10:59:23 我看这个库的方法自动判断类型了啊,为什么您说是`用P2PKH去签名`的呢
    前一个交易的输出脚本,应该是从前一个交易里拿出来的。
    你没有这么做,而是直接搞了一个(非压缩公钥的)P2PKH地址,从它得到输出脚本,如果这样做对上了还好,实际上不对,因为那个输出是P2SH输出,不是P2PKH。

    我也不知道那个P2SH输出里封装的是什么、到底能不能用你的私钥花出去。

    我对这个也不太熟。但如果那个P2SH输出对应的是P2SH-P2WPKH这种“兼容隔离见证”地址,那也应该用WitnessSignature而不是SignatureScript。
    楼层直达
  • BurntCoins 副船长 2020-04-01 11:47:57 只看该作者 9楼
    oxy9LoYX 发表于2020-04-01 10:59:23 我看这个库的方法自动判断类型了啊,为什么您说是`用P2PKH去签名`的呢
    隔离见证的交易签名和传统交易不一样,隔离见证签名时还需要提供被花掉的交易输出金额,签名哈希是要覆盖这个金额的。
    之所以要覆盖金额,是为了给硬件钱包和冷钱包提供方便,既是免去验证整个先前交易的麻烦,也是保证安全。
    如果不验证先前交易的内容,也可以直接进行签名,但是这样就会有安全风险,可能会签名巨额矿工费交易,而且在某些情况下(据我所知,是一笔交易花掉了不止一个人的钱,所以涉及多个人签名,但又不是多重签名这种)相当于额外多付钱(支出的总额不会有假,但是受害者只付了其中一部分,他以为自己付的只是比较小的一部分,但实际上他签名的交易可能是他付出了很大的一部分),
    楼层直达
  • BurntCoins 副船长 2020-04-02 00:11:03 只看该作者 10楼
    啊,那个P2SH输出果然和你贴出来的私钥符合,就是P2SH-P2WPKH……
  • oxy9LoYX 水手 2020-04-02 09:47:06 只看该作者 11楼
    BurntCoins 发表于2020-04-02 00:11:03 啊,那个P2SH输出果然和你贴出来的私钥符合,就是P2SH-P2WPKH……
    大佬真的很赞?我现在还没折腾出来,不知道怎么改...
    楼层直达
  • oxy9LoYX 水手 2020-04-02 10:46:53 只看该作者 12楼
    BurntCoins 发表于2020-04-01 11:42:24 前一个交易的输出脚本,应该是从前一个交易里拿出来的。
    你没有这么做,而是直接搞了一个(非压缩公钥的)P2PKH地址,从它得到输出脚本,如果这样做对上了还好,实际上不对,因为那个输出是P2SH输出,不是P2PKH。

    我也不知道那个P2SH输出里封装的是什么、到底能不能用你的私钥花出去。

    我对这个也不太熟。但如果那个P2SH输出对应的是P2SH-P2WPKH这种“兼容隔离见证”地址,那也应该用WitnessSignature而不是SignatureScript。
    按照大佬的指示,修改了代码,https://github.com/liyaojian/btc-sign/blob/master/main.go,但是还是报错
    mandatory-script-verify-flag-failed (Operation not valid with the current stack size)
    楼层直达
  • oxy9LoYX 水手 2020-04-02 14:10:51 只看该作者 13楼
    BurntCoins 发表于2020-04-01 11:47:57 隔离见证的交易签名和传统交易不一样,隔离见证签名时还需要提供被花掉的交易输出金额,签名哈希是要覆盖这个金额的。
    之所以要覆盖金额,是为了给硬件钱包和冷钱包提供方便,既是免去验证整个先前交易的麻烦,也是保证安全。
    如果不验证先前交易的内容,也可以直接进行签名,但是这样就会有安全风险,可能会签名巨额矿工费交易,而且在某些情况下(据我所知,是一笔交易花掉了不止一个人的钱,所以涉及多个人签名,但又不是多重签名这种)相当于额外多付钱(支出的总额不会有假,但是受害者只付了其中一部分,他以为自己付的只是比较小的一部分,但实际上他签名的交易可能是他付出了很大的一部分),
    这个btcd中的签名似乎不支持隔离见证?
    楼层直达
  • BurntCoins 副船长 2020-04-02 14:19:40 只看该作者 14楼
    你可以参考一下这个:
    https://github.com/btcsuite/btcwallet/blob/237a3ee7726c1a3fd4647790159f11a51db954b2/wallet/txauthor/author.go#L306
  • oxy9LoYX 水手 2020-04-02 23:07:03 只看该作者 15楼
    BurntCoins 发表于2020-04-02 14:19:40 你可以参考一下这个:
    https://github.com/btcsuite/btcwallet/blob/237a3ee7726c1a3fd4647790159f11a51db954b2/wallet/txauthor/author.go#L306
    非常感谢大佬!按照您的耐心指导终于搞定了,谢谢!再次感谢!
    楼层直达
  • BurntCoins 副船长 2020-04-03 01:25:17 只看该作者 16楼
    oxy9LoYX 发表于2020-04-02 23:07:03 非常感谢大佬!按照您的耐心指导终于搞定了,谢谢!再次感谢!
    你没把交易广播出去么?我看那个输出还没动呢。
    楼层直达
  • 1
  • 2
登录 账号发表你的看法,还没有账号?立即免费 注册