Bitcoin-Core

關於使用 OP_CHECKLOCKTIMEVERIFY 執行複雜腳本的說明

  • October 10, 2019

我引用這個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 可以解鎖交易

  • 現在有了這個 ScriptSig0 <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 密鑰提供有效的簽名,就會執行。

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