Segregated-Witness
CHECK(MULTI)SIG 操作失敗 - BIP143 雜湊原像
使用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
經過一段時間的調試,我能夠找到問題所在。
我之前的假設是我向雜湊送出了錯誤的數據是正確的。
構造所需的事務 ID
hashPrevouts
不outpoint
正確。我需要反轉該值的字節以使雜湊正確。例如:
b9d615615976600739be12a67f326836e4256d7d1c4fe50163536ad8dd7647c3
(可txid
在比特幣測試網上搜尋)變成……
c34776ddd86a536301e54f1c7d6d25e43668327fa612be39076076596115d6b9
.總之,我的建議是逐步檢查解釋器並重新評估您對送出給散列以進行簽名的所有數據的假設。
一點點程式碼永遠不會傷害,
打字稿:
Buffer.from(transactionId, "hex").reverse().toString("hex");