進階
腳本系統基礎
了解比特幣的腳本語言,這是實現各種支付條件的基礎。
18 分鐘
什麼是 Bitcoin Script?
Bitcoin Script 是一種基於堆疊的、圖靈不完備的腳本語言。它用於定義 UTXO 的花費條件, 是比特幣「可程式化貨幣」特性的基礎。每筆交易都包含腳本,決定了誰可以花費這些比特幣。
為什麼使用腳本?
腳本系統為比特幣提供了靈活性:
- 靈活的支付條件 可以創建多重簽名、時間鎖定等複雜條件
- 安全性 圖靈不完備確保腳本必定終止,避免無限迴圈
- 可驗證性 任何人都可以驗證腳本的執行結果
堆疊式執行
Script 使用後進先出(LIFO)的堆疊來處理數據。操作碼從堆疊中取出數據,處理後將結果推回堆疊。
執行流程範例:
Stack: []
PUSH 2 → Stack: [2]
PUSH 3 → Stack: [2, 3]
OP_ADD → Stack: [5]
PUSH 5 → Stack: [5, 5]
OP_EQUAL → Stack: [true]
腳本結構
比特幣交易包含兩種腳本:
scriptPubKey(鎖定腳本)
定義在輸出中,指定花費這個 UTXO 需要滿足的條件。類似於一把「鎖」。
scriptSig(解鎖腳本)
定義在輸入中,提供滿足鎖定腳本條件的數據。類似於一把「鑰匙」。
常見操作碼
| 操作碼 | 功能 |
|---|---|
| OP_DUP | 複製堆疊頂部的元素 |
| OP_HASH160 | 對頂部元素執行 SHA256 + RIPEMD160 |
| OP_EQUALVERIFY | 比較兩個元素是否相等,失敗則終止 |
| OP_CHECKSIG | 驗證簽名是否有效 |
| OP_CHECKMULTISIG | 驗證多重簽名 |
| OP_IF / OP_ELSE | 條件分支 |
| OP_CHECKLOCKTIMEVERIFY | 絕對時間鎖定 |
| OP_CHECKSEQUENCEVERIFY | 相對時間鎖定 |
P2PKH 腳本詳解
Pay to Public Key Hash 是最常見的腳本類型:
scriptPubKey (鎖定):
OP_DUP OP_HASH160 <公鑰哈希> OP_EQUALVERIFY OP_CHECKSIG
scriptSig (解鎖):
<簽名> <公鑰>
執行過程:
1. 推入 <簽名> 和 <公鑰>
2. OP_DUP: 複製公鑰
3. OP_HASH160: 計算公鑰哈希
4. OP_EQUALVERIFY: 驗證哈希匹配
5. OP_CHECKSIG: 驗證簽名
多重簽名範例
2-of-3 多重簽名腳本需要三個公鑰中的任意兩個簽名:
scriptPubKey:
OP_2 <公鑰A> <公鑰B> <公鑰C> OP_3 OP_CHECKMULTISIG
scriptSig:
OP_0 <簽名1> <簽名2>
注意: OP_0 是因為 OP_CHECKMULTISIG 的一個著名 bug
時間鎖定
比特幣支持兩種時間鎖定機制,是閃電網絡和其他二層方案的基礎:
CLTV(絕對時間鎖)
OP_CHECKLOCKTIMEVERIFY - 指定一個絕對的區塊高度或時間戳, 在此之前 UTXO 無法被花費。
CSV(相對時間鎖)
OP_CHECKSEQUENCEVERIFY - 指定從 UTXO 創建開始需要等待的區塊數, 用於閃電網絡的承諾交易。
延伸學習: 想要深入了解更多操作碼和高級腳本技巧, 請查看 Script 語言進階 章節。
延伸閱讀
已複製連結