比特幣遠不只是數位黃金或簡單的支付系統。在它的表面之下,隱藏著一個強大的可程式化層,稱為比特幣腳本(Bitcoin Script),它能夠實現複雜的金融安排。然而,原生比特幣腳本以極難處理而聞名——這就像是在大多數開發者更偏好高階抽象語言時,卻必須用組合語言(Assembly)來編寫程式。這正是比特幣 Miniscript(Bitcoin Miniscript)登場的契機,它將比特幣的可程式化能力從「專家專屬領域」轉化為一種觸手可及的工具,用以創建安全、高效且人類可讀的支出條件。
在這本全面性的指南中,我們將探討 Miniscript 如何讓比特幣的智慧合約功能變得易於使用、檢視其技術基礎、看看現實世界中的錢包實作,並提供創建您專屬自定義金融安排的實用範例。無論您是開發者、比特幣愛好者,還是對自託管解決方案感興趣的金融專業人士,Miniscript 都為保護您的數位資產開闢了全新的可能性。
一、 什麼是比特幣 Miniscript?從策略到安全腳本
從核心來看,比特幣 Miniscript 是比特幣腳本的一個結構化子集,專為可組合性(Composability)與靜態分析(Static Analysis)而設計。它充當了人類可讀的支出策略(Spending Policies)與實際在區塊鏈上運行的複雜、低階比特幣腳本之間的橋梁。
│
▼ 編譯為 (Compiles to) / 使用其表達 (Expressed using)
Miniscript
│
▼ 編譯為 (Compiles to)
比特幣腳本 (Bitcoin Script)
1. 人類可讀的支出策略
使用 Miniscript 的起點是「支出策略」——一個简单、具邏輯性的陳述,描述了誰可以在什麼條件下花費比特幣。例如:
「Alice 可以在任何時間花費這筆資金,或者 Bob 在等待 1 年後可以花費它們。」
這個直觀的策略可以在 Miniscript 的策略語言中表達為:
在這裡,52560 代表一年的區塊數量(大約為每天 144 個區塊 × 365 天)。這種策略語言使得表達複雜條件變得輕而易舉,而不會迷失在比特幣腳本所要求的堆疊操作(Stack Manipulation)細節中。
2. 編譯過程
一旦您定義好了策略,Miniscript 就會處理將其轉換為高效比特幣腳本的複雜任務。這個過程類似於 C++ 程式如何被編譯成機器碼:
- 策略 (Policy):描述支出條件的人類可讀邏輯。 (用戶編寫)
- Miniscript:帶有型態資訊(Type Information)的結構化表示法。 (編譯器生成)
- 比特幣腳本 (Bitcoin Script):低階的、基於堆疊的指令。 (在區塊鏈上執行)
針對我們範例中的策略,編譯器可能會產生如下的 Miniscript:
而這最終會變成以下的底層比特幣腳本碼:
<Alice_pubkey>OP_CHECKSIGOP_IFDUPOP_NOTIFOP_DUPOP_HASH160<Bob_pubkey_hash>OP_EQUALVERIFYOP_CHECKSIGVERIFY52560OP_CHECKSEQUENCEVERIFYOP_ENDIF
二、 比特幣 Miniscript 的核心優勢
- 安全性(Safety):Miniscript 允許在腳本部署之前進行靜態分析。這意味著您可以在將任何資金置於風險之中前,先驗證其正確性、檢查安全漏洞,並確保您的腳本不會受到第三方可延展性(Malleability)的影響。
- 可組合性(Composability):Miniscript 使得將不同的條件(簽章、時間鎖、雜湊原像等)結合以建立複雜邏輯變得非常容易。這種可組合性意味著您可以創建高階的金融安排,而不需要每次都從頭開始。
- 高效性(Efficiency):Miniscript 編譯器會為您的策略尋找經濟效益最高的比特幣腳本表示法,並針對體積(Size)和執行成本進行優化。這能節省交易手續費,並確保您的腳本保持在比特幣的資源限制之內。
三、 技術基礎:描述符與 Taproot
1. 輸出描述符 Output Descriptors (BIPs 380-386)
輸出描述符提供了一種標準化的方式,用以告訴錢包如何生成地址以及如何創建支出地址所需的腳本。它們本質上是一種用於描述比特幣輸出(Outputs)應如何被建構和支出的語言。
當使用 Miniscript 時,您的策略會被嵌入到一個描述符字串中。例如,使用我們前面提到過的 Miniscript,一個 P2WSH (Pay-to-Witness-Script-Hash) 輸出看起來可能像這樣:
這個描述符告訴了錢包它所需知道的一切資訊:包含如何為該支出條件生成地址,以及如何建構交易來支出它。描述符的標準化,意味著不同的錢包都能理解並與相同的複雜腳本進行互動。
2. Taproot 的角色 (BIP 341)
於 2021 年 11 月激活的 Taproot,讓基於 Miniscript 的複雜策略變得更具隱私性且使用成本更低。它引入了兩條支出路徑:
- 密鑰路徑(Key Path):在區塊鏈上看起來就像一個簡單的單人簽章支出。這會在所有參與者達成共識時使用,使得複雜的安排與常規交易無法區別。
- 腳本路徑(Script Path):僅在需要時(例如在糾紛解決或使用後備備用條件時)才揭露複雜的邏輯。這能讓您的支出條件在實際被使用之前保持隱密。
配合 Taproot,一個 Miniscript 策略可以被嵌入至腳本路徑(Script Path)中,這意味著 Alice 可以透過簡單的簽章進行支出(密鑰路徑);或者如果 Alice 無法處理,則可以使用腳本路徑,讓 Bob 與 Carol 在時間鎖過後共同簽章支出。
四、 現實世界:現代錢包實作
| 錢包/工具名稱 | 核心應用場景與機制 | Miniscript 實際策略範例 |
|---|---|---|
| Liana Wallet (Wizardsardine) |
專注於具備內建繼承(Inheritance)與遺失保護功能的自託管方案。利用 Miniscript 實作「主密鑰」以及「帶有時間鎖的恢復密鑰」,建立起一個簡單但高效的保險庫系統。 | or(pk(MyKey), and(older(105120), pk(HeirKey))) |
| Nunchuk Wallet | 為家庭、企業和去中心化自治組織(DAO)創建高階的共同託管(Shared Custody)安排。它的協同方法允許跨多個設備的多個用戶共同參與託管架構。 | thresh(2, pk(AlicePhone), pk(AliceHW), pk(BobPhone), pk(BobHW)) |
| Sparrow Wallet | 提供 Miniscript 支援,透過使用者友好的介面來創建自定義支出策略,讓非開發者也能直觀地建構並調試進階比特幣腳本。 | 自定義多路徑策略支援 |
| Specter DIY | 開源硬體錢包項目,融入了 Miniscript 以支持複雜支出條件的解析與校驗,同時仍能保持隔離防彈(Air-gapped)簽章的安全優勢。 | 硬體級多簽與時間鎖防護 |
五、 進階應用場景:受保的多實體保險庫
Miniscript 最具前景的應用之一,是實現受保的比特幣託管解決方案。這些安排將安全責任分散在資產所有者與可信賴的第三方之間,並由正式的保險政策作為後盾。
1. AnchorWatch 模型
AnchorWatch 代表了一種將自託管與保險保障相結合的創新比特幣託管方法。該模型使用了一種 5 簽 3 的多重簽章安排:用戶持有 3 把私鑰(保持完全的自主權);AnchorWatch 持有 1 把私鑰(作為受保事件的共同簽署者);中立的第三方密鑰代理人(Key Agent)持有 1 把私鑰(用於恢復)。
這種安排創造了多條可以透過 Miniscript 來精確定義的支出路徑:
- 標準路徑(Standard Path):用戶可以使用其 3 把私鑰正常花費資金,維持對資產的完整控制。
thresh(3, pk(UserKey1), pk(UserKey2), pk(UserKey3), pk(AnchorWatchKey), pk(AgentKey)) - 緊急路徑(Emergency Path):如果用戶遺失了部分私鑰,一條帶有時間鎖的恢復路徑允許在延遲一段時間後,使用不同的私鑰組合來恢復資金。
or(thresh(3, pk(UserKey1), pk(UserKey2), pk(UserKey3), pk(AnchorWatchKey), pk(AgentKey)), and(older(10080), thresh(2, pk(UserKey1), pk(AnchorWatchKey), pk(AgentKey))))
2. 保險層的角色
讓這個模型特別強大的原因在於,Miniscript 策略具備正式、可審計的特性,這允許保險公司對私鑰遺失或被盜的風險進行承保。由於支出條件被精確定義且可以進行靜態分析,保險人可以準確地評估風險並相應地提供保額覆蓋。這為比特幣託管創造了全新的範式:帶有安全網的自託管。
六、 動手實作:自定義支出策略實用範例
範例 1:帶時間鎖的遺產繼承計劃
策略口語描述:「主要所有者 Alice 可以花費這筆資金,或者在 5 年後,繼承人 Bob 可以花費它們。」
Miniscript 表示法:or(pk(Alice), and(older(262800), pk(Bob)))
範例 2:企業財務庫
策略口語描述:「需要 3 位高階主管(CEO、CFO、CTO)中的 2 位簽章;或者在 90 天後,需要董事會 5 位成員中的 3 位共同簽章。」
Miniscript 表示法:or(thresh(2, pk(CEO), pk(CFO), pk(CTO)), and(older(12960), thresh(3, pk(Board1), pk(Board2), pk(Board3), pk(Board4), pk(Board5))))
範例 3:非託管第三方代管(Escrow)
策略口語描述:「3 位參與者(買方、賣方、仲裁者)中的任意 2 位簽章即可釋放資金。」
Miniscript 表示法:thresh(2, pk(Buyer), pk(Seller), pk(Arbiter))
七、 在您的專案中實作 Miniscript
對於希望將 Miniscript 整合到其專案中的開發者,目前有數個程式庫與工具可供使用:Bitcoin Core (C++ 實作)、Rust-Miniscript 以及前端 JavaScript 程式庫。
JavaScript 基礎實作範例
const { compilePolicy, satisfier } = require('@bitcoinerlab/miniscript');
// 1. 定義一個支出策略
const policy = 'or(and(pk(A),older(8640)),pk(B))';
// 2. 將其編譯為 Miniscript 與底層比特幣腳本
const { miniscript, asm, issane } = compilePolicy(policy);
console.log("Miniscript:", miniscript);
// 3. 生成可能的滿足條件 (Satisfactions)
const { nonMalleableSats } = satisfier(miniscript);
八、 常見問答集 (FAQ)
問:比特幣腳本(Bitcoin Script)與比特幣 Miniscript 有何不同?
答:比特幣腳本是內置於比特幣中、用以定義支出條件的低階程式語言,功能強大但極難安全地使用。而比特幣 Miniscript 是比特幣腳本的一個結構化子集,它使創建、分析和組合支出條件變得更容易,同時確保它們能被編譯成有效且高效的底層比特幣腳本。
問:我需要成為程式設計師才能使用 Miniscript 嗎?
答:雖然理解程式設計概念會有所幫助,但您不需要是程式設計師也能使用 Miniscript。像 Liana 和 Nunchuk 這樣的現代錢包提供了使用者友好的圖形介面,讓您可以直接創建常見的支出策略而無需編寫任何程式碼。
問:Miniscript 是否與所有比特幣錢包相容?
答:目前尚未普及。Miniscript 支援需要錢包開發者實作特定的功能。目前包括 Liana、Nunchuk 和 Sparrow 等專業錢包提供支援。不過,任何錢包都可以發送資金到基於 Miniscript 的地址;只有在創建地址以及從該地址花費資產時,才需要錢包具備 Miniscript 功能。
問:Miniscript 與 Taproot 的關係是什麼?
答:兩者是互補的技術。Taproot 提供了一種讓複雜支出條件在區塊鏈上更具隱私且更高效率的方法;而 Miniscript 則提供了一種安全創建這些支出條件的方法。Miniscript 已經適應並全面支援 Taproot 的腳本路徑(Script Path)。
沒有留言:
張貼留言