Miniscript 是一種以結構化方式編寫比特幣腳本子集的語言,允許解析、組合、通用簽名等。
什麼是比特幣腳本?
比特幣一直有一種機制可以通過複雜的策略使硬幣消費,而不僅僅是一個單一的密鑰,這被稱為腳本系統。
雖然比特幣腳本主要用於簡單的密鑰支付,但它也可用於多重簽名錢包、原子交換構建和閃電網絡。
但這不是你唯一能做的。 Script 語言可用於表示釋放事務時的複雜條件,例如需要3 個密鑰中的2 個,或者需要1 個密鑰加上任何其他2 個。此外,還可以檢查原像的哈希、時間鎖等異國情調的建築。
這種語言存在的問題
使用腳本沒有充分發揮其潛力的一個原因是構建它們並不像你想像的那麼容易。它們很難驗證它們是否被正確寫入並且是安全的,並且更難找到一種方法來以一種便宜的方式編寫它們。
但這只是問題的一部分,即使你知道如何正確編寫腳本、應用程序設計和協議來與之協商和構建事務,每次設計新東西時都需要大量的開發工作。
任何一種靈活性總是需要能夠檢測兼容腳本的模板,而我們所做的每一個新添加都需要更多的工程資源來分析和確保質量。
這就引出了一個問題,如果比特幣應用程序可以使用任何腳本,而不僅僅是它設計的腳本,會發生什麼。
在這種情況下,我們不會局限於使用單一設計,而是可以根據特定的用戶需求,使用動態生成的腳本開始設計應用程序。
錢包創建者還可以引入更多基於腳本的選項,同時保持與其他錢包的互操作性。
Miniscript 中的解決方案
這就是Miniscript 的用武之地,它是一種以結構化方式表示比特幣腳本的語言,允許有效的解析、組合、通用簽名等。
例如,如下所示的比特幣腳本:
OP_CHECKSIG OP_IFDUP OP_NOTIF OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_CSV OP_ENDIF
其中A 和B 是公鑰,可以像這樣轉換為Miniscript:
or_d(c:pk(A),and_v(vc:pk_h(B),older(144)))
這個符號更清楚地告訴我們,腳本允許在A 簽名或B 在144 個區塊後簽名時使用加密貨幣。它以更有限的方式這樣做。
這使得腳本更易於人類閱讀,儘管這只是該語言提供的好處和用例之一。
用例
今天使用比特幣腳本來構建複雜的支出條件比它應該的要困難得多,需要特殊的軟件來為每個新的用例開發、測試和部署。
Miniscript 可以通過一組任意支出條件以更通用的方式解決這些用例。在大多數情況下,它會比專用解決方案更簡單、更可靠。
1.優化腳本
一種這樣的情況是找到一個優化的腳本來實現支出條件集。
在比特幣腳本中,有許多不同的方式來要求籤名、描述合取或析取,或者實現閾值。
即使你有使用比特幣腳本的經驗,正確的選擇也可能取決於滿足不同條件的相對機會,並且難以計算。
在線編譯器也提供C++ 源代碼,或作為rust-miniscript 庫的一部分實現,可以立即找到與給定支出策略相對應的最佳Miniscript。
我們在編譯費用條件時看到了前面的示例:
或者([email protected](一種),[email protected](pk(B),老(144)))
這是一種書寫方式,左側(簽名A)有99% 的機會被選中,右側(簽名B)有1% 的機會。
2. 提高互操作性
一旦找到了有效的腳本,許多腳本用戶就會遇到另一個常見的障礙。這是不同支出機制之間缺乏互操作性。
想要實現長期時間鎖或複雜的多重簽名要求的用戶可能會擔心交易的其他方可能沒有軟件來識別和花費控制該策略的硬幣。
Miniscript 通過直接表示支出條件,允許你以如下方式表達政策:
計算與腳本關聯的地址。確定在任何給定時間哪些簽名是必要或充分的。給定足夠的簽名集,產生一個有效的交易。
用戶不必擔心是否所有參與者都使用兼容軟件,或者它是否會隨著時間的推移繼續存在,特別是對於時間鎖定的要求。
他們也不必擔心由於比特幣腳本施加的限制,他們的需求可能與簽名軟件不兼容。
3. 預訂證明
與這個簽名問題相關的是提供儲備的問題,這是一個公司證明它可以花費一系列比特幣而不實際花費它們的過程。
對於託管服務來說,這是一個非常酷的功能,它可以向他們的用戶證明他們可以控制BTC,而無需將其發送到任何地方。
雖然存在類似的工具,例如Blockstream Proof of Reserve 工具,但行業沒有可以使用的通用標準。
在Miniscript 之前,可能不可能實現一個標準,可以涵蓋當今使用的託管解決方案的多樣性。
資訊來源:由0x資訊編譯自CRIPTOTARIO。版權歸作者Criptotario所有,未經許可,不得轉載