Hash

為什麼此腳本無效,如何生成有效的公鑰/數字簽名對?

  • April 23, 2018

為什麼<http://bitcoin-script-debugger.visvirial.com/>上的預設 P2PKH 交易返回 NULL 而不是 true?我還沒有嘗試吞下 OP_CHECKSIG 的血腥細節,但其他一切看起來都很可靠。

有沒有辦法手動驗證範例數字簽名/公鑰對是否匹配,或者生成不包含或連結到我的實際比特幣地址的匹配對,以便嘗試使用腳本調試器?

我已經使用該工具幾個小時了,但無法使用單個簽名。這是我為著名的PIZZA 交易輸入的內容:

# &lt;sig&gt;
OP_PUSHDATA1 71 0x30450221009908144CA6539E09512B9295C8A27050D478FBB96F8ADDBC3D075544DC41328702201AA528BE2B907D316D2DA068DD9EB1E23243D97E444D59290D2FDDF25269EE0E
# &lt;pubKey&gt;
OP_PUSHDATA1 65 0x042E930F39BA62C6534EE98ED20CA98959D34AA9E057CDA01CFD422C6BAB3667B76426529382C23F42B9B08D7832D4FEE1D6B437A8526E59667CE9C4E9DCEBCABB

OP_DUP OP_HASH160
# &lt;pubkeyHash&gt;
20 0x46af3fb481837fadbb421727f9959c2d32a36829
OP_EQUALVERIFY OP_CHECKSIG

腳本的內容將正確執行 OP_DUP 和 OP_HASH160,因此堆棧上的結果與 OP_EQUALVERIFY 匹配。然後 OP_CHECKSIG 返回 false… 使用 openssl 檢查返回 true。

有沒有辦法手動驗證範例數字簽名/公鑰對是否匹配,或者生成不包含或連結到我的實際比特幣地址的匹配對,以便嘗試使用腳本調試器?

是的,我通常有 OPENSSL 來幫助我。但是任何 ECDSA 庫都應該這樣做。一個普通的 P2PKH tx 被轉換為無符號格式,輸入腳本被替換為之前的 tx 輸出腳本(並且調整了長度)。然後這個原始 tx 是雙 sha256’d,結果簽名。可以使用 openssl、簽名和 pubkey 輕鬆檢查此雜湊值。我在2 年前發布了這個,並得到了 Dave 的幫助。

@amaclin 在第一個連結中的回答解釋瞭如何進行未簽名交易(–> ECDSA 驗證如何…)。Openssl 需要 PEM 密鑰進行驗證,因此會發生從 pubkey 到 PEM 格式的一些轉換。然後比特幣使用原始(十六進制)數據,而不是字元串。因此努力在 Linux 系統上使用 xxd 進行轉換,或者在 BSD 類型系統上使用 sed 和 [:xdigit:] 進行轉換。如果你在 unixoide 系統上,我可以提供一個腳本。

如何生成有效的公鑰/數字簽名對?

也許“生成”在這裡不是正確的詞,但是可以從區塊鏈中獲取任何 tx,並提取元素(原始 tx、sig、pubkey、prev tx pubkey hash),然後通過上述過程將其推送。

AFAICT,腳本不是無效的。相反,該網站未能正確驗證腳本。

OP_CHECKSIG 根據公鑰(第二個堆棧項)檢查數字簽名(解釋為第一個堆棧項)。然而,數字簽名需要第三個組件:被簽名的消息。在比特幣中,該消息就是交易本身(經過一些修改)。

這裡的問題是網站上的腳本解釋器沒有任何地方可以輸入正在簽名的交易或消息。因此,在沒有消息的情況下,對於任何具​​有 OP_CHECKSIG 的有效比特幣腳本,OP_CHECKSIG 將始終驗證為 false。

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