Bitcoin-Cash

無法為比特幣現金測試網建構正確的原始交易

  • May 8, 2018

我正在嘗試為比特幣現金測試網建構原始交易。對於如何建構原始交易,我已經充分利用了這個非常好的答案,但我自己仍然無法建構正確的交易。我想用第一個輸出7098b2735336c85077e9704cb8ba521f5c2d92f768081345c5ded26c52fcc1a9

這是我所做的:

  1. 使用之前的交易雜湊和索引創建交易,其中 scriptSig 填充了我要兌換的輸出的 scriptPubKey。原始交易如下所示:
01000000
01
a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870
00000000
19
76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac
ffffffff
01
80d6e34c00000000
19
76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac
00000000
  1. 為此,我附加了一個四字節雜湊碼類型 41000000。
01000000
01
a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870
00000000
19
76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac
ffffffff
01
80d6e34c00000000
19
76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac
00000000
41000000
  1. 現在我計算這兩次的 sha256 雜湊值:
f6b38f93c859db4920f22a1cd07d6c615a503ce89a7b2a3d90babad521b26062
  1. 現在我在 3 中籤署結果。這可能是我做錯了什麼。簽名結果:
r = 767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa6131
s = 6dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136

然後我將它編碼為DER格式

30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136

這看起來對嗎? 5. 在此簽名中,我附加了單字節雜湊碼類型 41:

30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
  1. 然後我在前面加上 5 的結果長度:
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
  1. 2103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72然後我將(公鑰的長度 + 實際公鑰)附加到 6 的結果:
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136412103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
  1. 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

引用自:https://bitcoin.stackexchange.com/questions/74875