Segregated-Witness

CHECK(MULTI)SIG 操作失敗 - BIP143 雜湊原像

  • April 9, 2019

使用Blockstream 的 api 將原始交易廣播到比特幣測試網,我遇到了以下錯誤:

sendrawtransaction RPC error: {"code":-26,"message":"non-mandatory-script-verify-flag (Signature must be zero for failed CHECK(MULTI)SIG operation) (code 64)"}

我注意到很多人之前遇到過類似的問題。但是,所有建議的解決方案都沒有解決我的問題。我查看了Github 上的比特幣原始碼,並確定我送出給我的雜湊以進行簽名的數據不正確。

下面是我為 bip143 創建的雜湊原圖p2sh(p2wpkh)

   nVersion:     01000000
   hashPrevouts: 4f3c0f6726ec7f020da2a01598d1741225ea429a34bfdd4c4af2a1c9e45a9bed
   hashSequence: 3bb13029ce7b1f559ef5e747fcac439f1455a2ec7c5f09b72290795e70665044
   outpoint:     b9d615615976600739be12a67f326836e4256d7d1c4fe50163536ad8dd7647c301000000
   scriptCode:   1976a91499f27cf1ecb8c1a4c20bdbcdc7992cdb12c9ee5d88ac
   amount:       6981680000000000
   nSequence:    ffffffff
   hashOutputs:  57dbf9cb180c89fe35000b693ea089e521097e6d3f504cfec1620325fcec0036
   nLockTime:    00000000
   nHashType:    01000000

經過一段時間的調試,我能夠找到問題所在。

我之前的假設是我向雜湊送出了錯誤的數據是正確的。

構造所需的事務 IDhashPrevoutsoutpoint正確。我需要反轉該值的字節以使雜湊正確。

例如:

  • b9d615615976600739be12a67f326836e4256d7d1c4fe50163536ad8dd7647c3(可txid在比特幣測試網上搜尋)

變成……

  • c34776ddd86a536301e54f1c7d6d25e43668327fa612be39076076596115d6b9.

總之,我的建議是逐步檢查解釋器並重新評估您對送出給散列以進行簽名的所有數據的假設。

一點點程式碼永遠不會傷害,

打字稿Buffer.from(transactionId, "hex").reverse().toString("hex");

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