Miniscript 應用
比特幣 Miniscript 應用場景
Miniscript 應用完全指南
概述
Miniscript 是一種用於比特幣腳本的高級表示法,由 Bitcoin Core 貢獻者 Pieter Wuille 提出。Miniscript 使得複雜的比特幣腳本可以被人類可讀的方式編寫、驗證和分析,同時保留了比特幣腳本的全部功能。
為什麼需要 Miniscript?
傳統比特幣腳本的問題
傳統的比特幣腳本(Bitcoin Script)使用底層操作碼(OP_CODE)編寫,存在以下問題:
- 難以閱讀:原始腳本字串對人類不友好
- 難以驗證:難以確認腳本是否安全或正確
- 無法靜態分析:無法在簽名前分析腳本行為
- 錢包相容性差:不同錢包對複雜腳本的支持程度不同
Miniscript 的優勢
Miniscript 解決了這些問題:
- 可讀性:類似程式語法的表示法
- 可分析性:可以在簽名前預知腳本行為
- 可組合性:可以組合多個條件
- 錢包相容:有明確的編譯策略
Miniscript 語法基礎
基礎片段(Fragments)
Miniscript 使用「片段」來構建腳本。每個片段都有明確的類型和參數:
| 片段 | 語法 | 說明 |
|---|---|---|
| PK | pk(key) | 公鑰簽名驗證 |
| PkH | pk_h(key) | 公鑰雜湊驗證 |
| Multi | multi(k, key1, key2, ...) | 多簽名閾值 |
| Thresh | thresh(k, expr1, expr2, ...) | K-of-N 閾值 |
| After | after(n) | 時間鎖定 |
| Older | older(n) | 區塊高度鎖定 |
| Sha256 | sha256(h) | SHA256 雜湊預映證 |
| Hash256 | hash256(h) | Double SHA256 |
| Ripemd160 | ripemd160(h) | RIPEMD160 雜湊預映證 |
| Hash160 | hash160(h) | RIPEMD160+SHA256 |
示例語法
// 2-of-3 多簽名
multi(2, key1, key2, key3)
// 2-of-3 多簽名加上時間鎖
and_v(v:multi(2, key1, key2, key3), after(1000))
// 任意一個公鑰或時間鎖
or_d(v:pk(key1), v:after(500))
Miniscript 類型系統
Miniscript 為每個片段分配類型,用於靜態分析和安全性驗證:
類型標記
| 類型 | 標記 | 說明 |
|---|---|---|
| B | Boolean | 返回布爾值 |
| V | Value | 需要值才能滿足 |
| K | Key | 需要簽名 |
| W | Wrapped | 包裝的條件 |
類型組合
常見類型組合:
- B:返回布爾值,如
and_b - V:需要值,如
a:pk - K:需要密鑰,如
pk - W:包裝類型,如
c:pk(包裹的條件)
實際應用場景
場景一:時間鎖定遺產
// 立即可以使用任何一個私鑰
// 或者 1 年後可以使用任何一個私鑰
or(
pk(key1),
and(older(525600), pk(key1))
)
轉換為比特幣腳本後:
OP_IF
<key1> OP_CHECKSIG
OP_ELSE
525600 OP_CHECKSEQUENCEVERIFY OP_DROP
<key1> OP_CHECKSIG
OP_ENDIF
場景二:閾值多簽名
// 3-of-5 多簽名
multi(3, key1, key2, key3, key4, key5)
場景三:需要額外條件的支出
// 需要 key1 簽名加上 1 天後冷卻期
// 或者 2-of-3 多簽名
or(
and_v(v:pk(key1), older(144)),
and_v(v:multi(2, key2, key3, key4), after(1000))
)
場景四:硬體錢包 + 手機錢包
// 手機錢包(日常使用)+ 硬體錢包(備份)
or(
pk(hardware_key),
and_v(v:pk(backup_key), older(1000))
)
Miniscript 編譯工具
miniscript.fun
線上工具可以將 Miniscript 轉換為比特幣腳本:
- 訪問 miniscript.fun
- 輸入 Miniscript 表達式
- 選擇目標地址類型(P2WSH 或 P2TR)
- 獲取編譯後的腳本和地址
Bitcoin Core
Bitcoin Core 24.0+ 內建 Miniscript 支援:
# 解析 Miniscript
getminiscript "pk(key)"
# 從 Miniscript 獲取腳本
toderawminiscript "pk(key)"
程式庫
| 語言 | 庫 |
|---|---|
| Rust | rust-miniscript |
| C++ | Bitcoin Core 內建 |
| Python | python-miniscript |
| JavaScript | miniscript-js |
安全性分析
提前終止(Earliest Termination)
Miniscript 可以分析腳本是否會提前終止(提前返回成功/失敗):
- 提前終止安全:腳本在中間狀態不會意外返回成功
- 非提前終止:腳本總是執行到最後
滿足性(Satisfiability)
分析腳本是否可以被滿足(即是否存在有效的解鎖方式):
// 總是可以滿足的(總有分支可以達成)
or(pk(key1), pk(key2))
// 可能無法滿足的(兩個條件都無法達成)
and(pk(key1), after(999999999))
完美隱私
某些 Miniscript 結構可以提供「完美隱私」—— 外部觀察者無法從腳本結構推斷出內部邏輯:
// 使用 thresh 提供完美隱私
thresh(1, pk(key1), pk(key2), pk(key3))
這與 multi(1, ...) 行為相同,但結構更複雜。
Miniscript 與 Taproot
Taproot 地址
Miniscript 可以編譯為 P2TR(Taproot)地址:
# 編譯為 Taproot
toderawminiscript "pk(key)" - tapped
腳本樹
Taproot 允許腳本樹結構,Miniscript 可以表示:
// Taproot 腳本樹
or(
pk(key_main),
and(older(1000), pk(key_backup))
)
這會創建一個展示為單一公鑰的 Taproot 地址,但包含備份支出路徑。
常見問題
Miniscript 與普通腳本有什麼區別?
Miniscript 是比特幣腳本的可讀表示,兩者在區塊鏈上的表現完全相同。Miniscript 只是讓編寫和驗證比特幣腳本變得更容易。
Miniscript 是否需要新的比特幣升級?
不需要。Miniscript 完全相容現有的比特幣共識層,可以直接在任何現代比特幣腳本中使用。
使用 Miniscript 是否有額外費用?
沒有。Miniscript 編譯後產生的腳本與手寫腳本的大小相同,不會產生額外的區塊空間費用。
Miniscript 是否支援智能合約?
是的。Miniscript 可以實現各種複雜的支出條件,包括時間鎖、多簽名、雜湊預映證等,這些是比特幣智能合約的基礎。
總結
Miniscript 是比特幣腳本開發的重要工具,它使得複雜的比特幣腳本變得可讀、可分析和可驗證。通過 MinisScript,開發者可以安全地構建多簽名、時間鎖和其他高級腳本,同時錢包和工具可以更好地理解和處理這些腳本。隨著 Taproot 的採用,Miniscript 的重要性將進一步提升。
相關文章
- 比特幣腳本編程進階實戰:從理論到部署 — 深入講解比特幣腳本指令集、腳本類型開發流程、腳本調試方法,透過多個實際案例展示如何構建安全的比特幣腳本應用,包括多簽名、時間鎖、HTLC 等。
- 比特幣腳本語言入門 — 理解 Bitcoin Script 的基本指令與運作原理。
- Miniscript 應用完全指南 — 理解比特幣腳本的高級表示法 Miniscript,包括語法、類型系統與實際應用場景。
- 比特幣腳本語言深度教學 — 深入理解比特幣腳本語言的運作原理、常見腳本類型與進階應用場景。
- OP_CAT 操作碼提案 — 理解 OP_CAT 提案與比特幣腳本可表達性的提升。
延伸閱讀與來源
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!