Miniscript 應用

比特幣 Miniscript 應用場景

Miniscript 應用完全指南

概述

Miniscript 是一種用於比特幣腳本的高級表示法,由 Bitcoin Core 貢獻者 Pieter Wuille 提出。Miniscript 使得複雜的比特幣腳本可以被人類可讀的方式編寫、驗證和分析,同時保留了比特幣腳本的全部功能。

為什麼需要 Miniscript?

傳統比特幣腳本的問題

傳統的比特幣腳本(Bitcoin Script)使用底層操作碼(OP_CODE)編寫,存在以下問題:

  1. 難以閱讀:原始腳本字串對人類不友好
  2. 難以驗證:難以確認腳本是否安全或正確
  3. 無法靜態分析:無法在簽名前分析腳本行為
  4. 錢包相容性差:不同錢包對複雜腳本的支持程度不同

Miniscript 的優勢

Miniscript 解決了這些問題:

Miniscript 語法基礎

基礎片段(Fragments)

Miniscript 使用「片段」來構建腳本。每個片段都有明確的類型和參數:

片段語法說明
PKpk(key)公鑰簽名驗證
PkHpk_h(key)公鑰雜湊驗證
Multimulti(k, key1, key2, ...)多簽名閾值
Threshthresh(k, expr1, expr2, ...)K-of-N 閾值
Afterafter(n)時間鎖定
Olderolder(n)區塊高度鎖定
Sha256sha256(h)SHA256 雜湊預映證
Hash256hash256(h)Double SHA256
Ripemd160ripemd160(h)RIPEMD160 雜湊預映證
Hash160hash160(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 為每個片段分配類型,用於靜態分析和安全性驗證:

類型標記

類型標記說明
BBoolean返回布爾值
VValue需要值才能滿足
KKey需要簽名
WWrapped包裝的條件

類型組合

常見類型組合:

實際應用場景

場景一:時間鎖定遺產

// 立即可以使用任何一個私鑰
// 或者 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 轉換為比特幣腳本:

  1. 訪問 miniscript.fun
  2. 輸入 Miniscript 表達式
  3. 選擇目標地址類型(P2WSH 或 P2TR)
  4. 獲取編譯後的腳本和地址

Bitcoin Core

Bitcoin Core 24.0+ 內建 Miniscript 支援:

# 解析 Miniscript
getminiscript "pk(key)"

# 從 Miniscript 獲取腳本
toderawminiscript "pk(key)"

程式庫

語言
Rustrust-miniscript
C++Bitcoin Core 內建
Pythonpython-miniscript
JavaScriptminiscript-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 的重要性將進一步提升。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!