Bitcoin-Cash
無法為比特幣現金測試網建構正確的原始交易
我正在嘗試為比特幣現金測試網建構原始交易。對於如何建構原始交易,我已經充分利用了這個非常好的答案,但我自己仍然無法建構正確的交易。我想用第一個輸出7098b2735336c85077e9704cb8ba521f5c2d92f768081345c5ded26c52fcc1a9。
這是我所做的:
- 使用之前的交易雜湊和索引創建交易,其中 scriptSig 填充了我要兌換的輸出的 scriptPubKey。原始交易如下所示:
01000000 01 a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870 00000000 19 76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac ffffffff 01 80d6e34c00000000 19 76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac 00000000
- 為此,我附加了一個四字節雜湊碼類型 41000000。
01000000 01 a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870 00000000 19 76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac ffffffff 01 80d6e34c00000000 19 76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac 00000000 41000000
- 現在我計算這兩次的 sha256 雜湊值:
f6b38f93c859db4920f22a1cd07d6c615a503ce89a7b2a3d90babad521b26062
- 現在我在 3 中籤署結果。這可能是我做錯了什麼。簽名結果:
r = 767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa6131 s = 6dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136
然後我將它編碼為DER格式
30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136
這看起來對嗎? 5. 在此簽名中,我附加了單字節雜湊碼類型 41:
30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
- 然後我在前面加上 5 的結果長度:
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
2103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
然後我將(公鑰的長度 + 實際公鑰)附加到 6 的結果:4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136412103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
- 7 的結果是我的簽名,它的長度是 0x6a,所以現在我將 1 中的 scriptSig_length 和 scriptSig 替換為以下數據:
01000000 01 a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870 00000000 6a 4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136412103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72 ffffffff 01 80d6e34c00000000 19 76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac 00000000
這是我的原始交易,但是當我嘗試發送它時,我收到以下錯誤:
16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation)
誰能告訴我我做錯了什麼?非常感謝!
比特幣現金不使用原始的比特幣 sighash 方案(看起來就像你在這裡嘗試做的那樣)。
相反,它使用了 BIP143 中提出的 sighash 方案的變體(用於比特幣中的隔離見證交易)。
儘管您已正確執行了這些步驟,但您正在嘗試通過 python 腳本自己簽名來“重新發明輪子”。比特幣現金軟體,就像比特幣會為你提供 JSON RPC API 一樣。這些 API 遵循參考實現,並且已經為您提供了您剛剛執行的所有內置步驟。作為範例/教程,您可以瀏覽bitcoin.org 上的教程,該教程非常簡明易懂。
請注意,您需要一個正在執行的節點才能訪問 API