Bitcoin-Core
關於使用 OP_CHECKLOCKTIMEVERIFY 執行複雜腳本的說明
我引用這個BIP65 的例子
BIP 65 有這個比特幣腳本程式碼
IF <now + 3 months> CHECKLOCKTIMEVERIFY DROP <Lenny's pubkey> CHECKSIGVERIFY 1 ELSE 2 ENDIF <Alice's pubkey> <Bob's pubkey> 2 CHECKMULTISIG
有了這個比特幣 scriptSig 可以解鎖交易
- 現在有了這個 ScriptSig
0 <Alice's signature> <Bob's signature> 0
- 使用此 ScirpSig 3 個月後
0 <Alice/Bob's signature> <Lenny's signature> 1
但是我不明白 If-then-else 的這一部分
ELSE 2
它何時執行以及在 if-then-else 條件中我不明白什麼?
比特幣使用基於堆棧的語言,因此執行 IF 或 ELSE 語句的邏輯條件位於運算符 IF 或 ELSE 之前。讓我們一個一個地處理你的兩個案例,看看它是如何在堆棧上執行的。
情況1:
ScriptSig: 0 <Alice's signature> <Bob's signature> 0
- 堆棧開始於
0 <Alice's signature> <Bob's signature> 0
- 由於 0 在堆棧頂部,ELSE 條件將執行並刪除 0
- 數字 2 被壓入堆棧
- 堆棧現在
0 <Alice's signature> <Bob's signature> 2
- IF/ELSE 語句之外的腳本被推入堆棧
- 堆棧現在
0 <Alice's signature> <Bob's signature> 2 <Alice's pubkey> <Bob's pubkey> 2 CHECKMULTISIG
- 這是一個正常的 2-of-2 Multi-sig 操作,將通過驗證 Alice 和 Bob 對公鑰的簽名來執行
案例二:
ScriptSig: 0 <Alice/Bob's signature> <Lenny's signature> 1
- 堆棧開始於
0 <Alice/Bob's signature> <Lenny's signature> 1
- 由於 1 在棧頂,IF 語句將執行並丟棄 1
<now + 3 months> CHECKLOCKTIMEVERIFY
被壓入棧中,驗證是否已經過了 3 個月。如果是,則執行將繼續。DROP
如果驗證成功,運算符將 TRUE 放在堆棧頂部<Lenny's pubkey> CHECKSIGVERIFY
被壓入堆棧- 堆棧現在
0 <Alice/Bob's signature> <Lenny's signature> <Lenny's pubkey> CHECKSIGVERIFY
CHECKSIGVERIFY
將消耗堆棧的頂部 2 項。它將檢查 Lenny 的簽名是否與 Lenny 的公鑰匹配。如果是,則執行將繼續。- 堆棧現在
0 <Alice/Bob's signature>
- 1 被壓入堆棧
- 堆棧現在
0 <Alice/Bob's signature> 1
- IF/ELSE 語句之外的腳本被壓入堆棧
- 堆棧現在
0 <Alice/Bob's signature> 1 <Alice's pubkey> <Bob's pubkey> 2 CHECKMULTISIG
- 現在這是一個正常的 1-of-2 多重簽名操作,如果 Alice 或 Bob 為其 pub 密鑰提供有效的簽名,就會執行。