跳至主要內容
高級

Script Validation

深入了解 Bitcoin Core 的腳本驗證過程,包括解釋器、操作碼執行和驗證規則。

15 分鐘

腳本驗證概覽

Bitcoin 使用基於堆棧的腳本語言來定義交易的花費條件。 每當花費一個 UTXO 時,節點必須執行腳本驗證以確保花費者有權使用這些資金。

驗證流程

腳本驗證過程:

┌─────────────────────────────────────────────────────────────┐
│ 輸入(花費者提供)          輸出(UTXO 中定義)              │
│                                                             │
│  scriptSig                  scriptPubKey                    │
│  (解鎖腳本)                 (鎖定腳本)                       │
│                                                             │
│  ┌─────────────┐           ┌─────────────┐                 │
│  │        │    +      │ OP_DUP      │                 │
│  │     │           │ OP_HASH160  │                 │
│  └─────────────┘           │       │                 │
│                            │ OP_EQUALVERIFY│                │
│                            │ OP_CHECKSIG  │                 │
│                            └─────────────┘                 │
│                                                             │
│  執行順序(Legacy):                                        │
│  1. 執行 scriptSig,結果留在堆棧                            │
│  2. 執行 scriptPubKey,使用堆棧                             │
│  3. 堆棧頂部為 true → 驗證通過                              │
└─────────────────────────────────────────────────────────────┘

堆棧機器

堆棧操作示例(P2PKH):

初始堆棧(scriptSig 執行後):
┌─────────────┐
│     │  ← 頂部
├─────────────┤
│        │
└─────────────┘

執行 OP_DUP:
┌─────────────┐
│     │  ← 複製頂部
├─────────────┤
│     │
├─────────────┤
│        │
└─────────────┘

執行 OP_HASH160:
┌─────────────┐
│  │ ← 雜湊頂部
├─────────────┤
│     │
├─────────────┤
│        │
└─────────────┘

推入 :
┌─────────────┐
│   │
├─────────────┤
│ │
├─────────────┤
│     │
├─────────────┤
│        │
└─────────────┘

執行 OP_EQUALVERIFY:
(比較並移除頂部兩個元素)
┌─────────────┐
│     │
├─────────────┤
│        │
└─────────────┘

執行 OP_CHECKSIG:
┌─────────────┐
│    true     │  ← 簽名有效
└─────────────┘

結果:true → 驗證通過

腳本類型驗證

不同腳本類型的驗證:

1. P2PKH (Pay to Public Key Hash)
   ├── scriptPubKey: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG
   ├── scriptSig:  
   └── 驗證:公鑰哈希匹配 + 簽名有效

2. P2SH (Pay to Script Hash)
   ├── scriptPubKey: OP_HASH160  OP_EQUAL
   ├── scriptSig:  
   └── 驗證:
       ├── 第一階段:redeemScript 哈希匹配
       └── 第二階段:執行 redeemScript

3. P2WPKH (Native SegWit)
   ├── scriptPubKey: OP_0 <20-byte-hash>
   ├── witness:  
   └── 驗證:類似 P2PKH,使用 witness 數據

4. P2WSH (Native SegWit Script)
   ├── scriptPubKey: OP_0 <32-byte-hash>
   ├── witness:  
   └── 驗證:類似 P2SH,使用 witness 數據

5. P2TR (Taproot)
   ├── scriptPubKey: OP_1 <32-byte-pubkey>
   ├── Key Path: witness = 
   └── Script Path: witness =    
已複製到剪貼簿