高級
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 =
已複製到剪貼簿