瞭解 Minicsript 時間鎖錢包的取捨

作者:Tom Honzik

來源:https://www.unchained.com/blog/examining-the-tradeoffs-of-miniscript-timelock-wallets

TimelockWalletsMiniscript

多種比特幣錢包軟件和託管服務開始探索基於時間的安全模式和復原選項。這些產品激起了一些比特幣持有者的興趣,他們希望瞭解這背後的工作原理、確定這是不是一種保護他們的比特幣儲蓄的一種好選擇。

在本文中,我們會解釋這些保管裝置要實現什麼設計目標,並介紹實現這些目標的基礎技術 —— 時間鎖和 Miniscript 。我們會了解一些實踐案例,並討論這些錢包的取捨,幫助你在使用與否的決策上作出明智的決定。

什麼是 “時間鎖錢包”?

在本文中,“時間鎖錢包” 一詞指的是一種比特幣錢包,其中的地址使用了 時間鎖 作為它們的安全模式的一部分。時間鎖錢包在市場營銷中可能使用各種術語,比如這樣的錢包提供了 “基於實踐的復原密鑰”、“帶有時延的繼承密鑰”、“高級的 Miniscript 安全性”,或者其它類似詞語的組合。

時間鎖讓時間成為了一種決定花費比特幣的必要條件的因素。一個簡單的例子是一個地址,它內在地防止存入其中的比特幣在某個日曆日期或時間點之前被花掉(也可以是阻止資金在區塊鏈抵達某個區塊高度之前被花掉)。

一個更高級的案例是一種地址,它被設計成帶有一個默認的花費路徑,但還有另一條花費路徑,僅在經過一段時間之後才變得可用。像這樣的結構,在默認花費路徑不再能使用時(不論因為丟失密鑰還是設備損毀),都是很有用的。地址和其中資金的主人只需等待後面那條花費路徑變得可用,就可以取回資金;這條復原路徑可以設計成帶有更加款蘇的花費要求,或者要求完全不一樣的私鑰。對這種復原機制的興趣,就是推動比特幣保管市場出現時間鎖錢包產品的主要催化劑。

時間鎖錢包如何工作?

時間鎖錢包是理由兩個主要工具來實現的。第一個是比特幣協議的時間鎖功能自身,它有不同的製作方法,也各有侷限性。第二個是 Miniscript ,一種更先進的開發工具,提供了更加安全的方式來開發複雜的花費條件,比如多條花費路徑(這些花費條件就是比特幣地址的前身)。接下來,我們細緻第瞭解一下這些技術。

時間鎖功能

有兩種不同的方式可以將時間鎖做進一個比特幣地址。一種是 “CLTV(CheckLockTimeVerify)”,它帶來的是 絕對時間鎖,意思是這種時間鎖會在一個預先指定的時間點過期(解鎖),比特幣進入這樣的地址的時間並不影響其中時間鎖的解鎖時間。這種方法會給使用帶有時間鎖的寬鬆復原路徑的錢包帶來一個問題:隨著我們逐漸接近乃至越過預定的時間點,錢包的安全模式會完全改變(譯者注:即這樣的時間鎖將逐漸失去限制復原路徑可用性的作用)。如果你希望新的存款擁有很遠的未來才能使用的復原路徑,你將不得不周期性地遷移到一個全新的錢包(一組新的地址,其錢包配置與原錢包配置不同),就為了使用另一個絕對時間鎖。

另一種方式是 “CSV(CheckSequenceVerify)”,它會建立 相對時間鎖,即時間鎖將從每一筆資金進入這樣的地址的時間點開始倒計時。因此,(錢包中)每一個 UTXO 都有不同時間鎖過期時間。這對於使用基於時間的復原機制的錢包來說是更好的方法,因為錢包的安全模型在時間流逝中保持恆定 —— 只需將(舊地址中的)比特幣轉入同一錢包的新地址中,就可以重設倒計時,而不是隻能構造和備份一個全新的錢包。

locktime-diag

- 一個可視案例,對比使用絕對時間鎖的地址和使用相對時間鎖的地址。在創造錢包時,兩種時間鎖都設為 12 個月長。在使用絕對時間鎖的錢包中,不同地址中的時間鎖會在同一時間點到期;而相對時間鎖則會使每一筆存入資金擁有獨立的倒計時(只是時長相同)。 -

CLTV 和 CSV 的另一個重要區別是鎖定時間的範圍。CLTV 可以用來將比特幣鎖定幾個世紀,意味著在設置鎖定時間時,任何事物都可能產生災難性的後果。但 CSV 的最大鎖定時間要麼是 65535 個區塊(大概 15 個月),要麼是 65535 * 512 秒(大約 13 個月)。因為 CSV 是絕大部分時間鎖錢包所用的方法,這個侷限性是相當重要的。

Miniscript

比特幣的共識規則,使用一種簡單的、基於堆棧的編程語言,叫做 “Script” 來編程一筆比特幣可被花費的條件。不過,對有志於開發比標準的單簽名和多簽名錢包更復雜花費條件的人來說,Script 用些難用。組合、驗證和解釋使用多個條件式花費路徑的腳本,可能難以安全地實現,效率也難以保證。這就是 BIP379 Miniscript 的動機。

“Miniscript” 使用更加有用的方式來表達腳本,使得更加複雜的花費要求可以更安全地組合及分析。雖然當前的時間鎖錢包,從技術上來說只需 Script 就可以實現,但 Miniscript 鋪平了道路、使它們更加實用。下面是一個例子,對比了表達相同花費條件的 Script 代碼和 Miniscript 代碼,可以看出形態相當不同,Miniscript 代碼更為簡潔。

Script:

<A> OP_CHECKSIG OP_IFDUP OP_NOTIF  <B> OP_CHECKSIGVERIFY <50c300> OP_CHECKLOCKTIMEVERIFYOP_ENDIF

Miniscript:

or_d(pk(A),and_v(v:pk(B),after(50000)))

(譯者注:這裡要額外說明的是,引入 Miniscript 並不需要改變比特幣的共識規則,因為實際上,Miniscript 只是 Script 表達能力的一個子集,它只是運用特定的結構來使用 Script 的片段,使我們可以在 Miniscirpt 層面完成對代碼的組合、分析和驗證。也就是說,它沒有改變比特幣本身(實際表達花費條件的依然是 Script 代碼),它改變的只是開發者的編程環境。)

時間鎖錢包案例

我們已經介紹了時間鎖錢包的基本前提、它們是如何構造的,現在,我們來看看人們曾經為之設想的幾種用途。雖然可以定製化,時間鎖錢包一般來說會有一個主花費路徑(通常是一個多簽名裝置),然後是一個復原花費路徑,由時間鎖來限定。復原路徑的想法包括遞減式多簽名、拓展式多簽名以及替代密鑰。

遞減式多簽名

遞減式多簽名是一種為一個多簽名錢包創建一個隨時間解鎖的、更寬鬆的花費路徑的方法。給定一個 k-of- n 的多簽名裝置,遞減式多簽名會隨時間推移而使 “k” 逐漸下降,從而更少密鑰就能授權取款。比如說,你可以搭建一個錢包,其比特幣控制在一個 3-of-3 的多簽名裝置中,但如果地址中的比特幣一段時間沒有移動,則可以遞減為 2-of-3 的多簽名裝置。這也許能在丟失一個密鑰的時候發揮作用。

拓展式多簽名

拓展式多簽名是另一種構造帶有時間鎖的復原路徑的方法。給定一個 k-of-n 的多簽名裝置,拓展式多簽名將隨著時間推移逐漸提高 “n” 的值,從而額外的公鑰能夠提供有效的簽名來幫助取出比特幣。比如說,你可以搭建一個 2-of-2 的多簽名裝置,然後在地址中的比特幣一段時間沒有移動之後,開啟允許一個 2-of-3 的多簽名裝置來取出比特幣。如果最初的兩個密鑰的其中之一丟失了,額外的密鑰可以提供更新的訪問比特幣的能力。

替代密鑰

復原路徑跟默認花費路徑的區別可以更大 —— 使用完全不同的密鑰。比如,你可以先搭建一個包含公鑰 A、B、C 的 2-of-3 多簽名裝置,但在一個時間鎖過期後,就可以用公鑰 D、E、F 所組成的多簽名裝置來花費資金。此外,復原密鑰也可以只要求公鑰 D,或者任何其它你想要的結構。這個方法在遺產規劃中會有作用 —— 遺囑執行人手上的密鑰要等到時間鎖過期之後才會有用。

關於時間鎖錢包的顧慮

乍看起來,隨時間鎖過期而啟用的復原機制是非常吸引人的。但是,有一些取捨,也許不會立即顯現出來,卻是值得考慮的。

比如說,將一個時間鎖錢包從一個軟件遷移到另一個軟件,就只有非常少的選項,那就意味著,錢包復原的整體難度可能更大。時間鎖錢包的用戶也可能會面臨高得多的交易手續費,因為他們的交易的體積更大、更有可能需要在相對不理想的費率條件下移動比特幣。定期轉移比特幣、刷新時間鎖的壓力,可能會讓你進入艱難的密鑰管理局面 —— 你必須記得移動比特幣,不然安全性就要降級。接下來,我們會更細緻地瞭解這些顧慮。

錢包遷移選項有限

普通的單簽名和多簽名錢包在比特幣保管生態系統中無處不在。數十個聲譽良好的錢包軟件支持這些標準化的錢包類型,而且都可以互操作,所以用戶可以輕鬆地從一個軟件遷移到另一個軟件。這就意味著,如果你的錢包軟件界面(你查看和管理比特幣餘額的界面)除了問題,你只需導入你的錢包配置信息中文譯本)到另一個接口中,就可以繞開這些故障、繼續使用你的比特幣。

與此同時,時間鎖錢包擁有更加複雜的錢包配置信息 —— 通常以 描述符 格式來表示 —— 包含了關於這些時間鎖和多種花費路徑的 Miniscript 細節。截至本文撰寫之時,很少錢包軟件已經採用了導入這樣的描述符的功能。如果你在某一個軟件(或者協作服務)中構造了一個時間鎖錢包,而你的賬戶出現了問題,在復原錢包時你可能只有極少數的軟件選擇。這樣的選項確實存在(比如 Bitcoin Core),但對於不那麼瞭解技術的用戶,可能很困難。

如果描述符和 Miniscript 被更多聲譽良好的錢包軟件採用,缺乏遷移選項也將隨著時間推移不復成為問題。另一方面,在導入一個獨特深度定製的 Miniscript 錢包(比如一個時間鎖錢包)時,可能也會遇到問題。理想情況下,一個錢包軟件應該能夠理解一個被導入的錢包的設計、並在界面中為用戶展示有用的信息,比如每個 UTXO 的時間鎖狀態。這又要求開發者為當前絕大多數流行的錢包軟件開發實質性的增強功能,因為當前,這些軟件還沒有設計為能夠解釋和顯示這些信息。

更高的交易手續費

決定一筆比特幣交易手續費的主要變量之一,就是這筆交易的數據體積。交易數據包含了關於資金轉移的基本信息,但也必須包含描述被滿足的花費條件的腳本,以保證交易是有效的。更復雜的花費條件就有更大的腳本,因此就傾向於有更多的交易數據、更高的手續費。

帶有多個花費路徑的時間鎖錢包就是這樣一個例子。為了研究多花費路徑裝置與普通的比特幣錢包的差異,我們對比了一個標準的 2-of-3 多簽名錢包與多種時間鎖錢包(全部使用 P2WSH 的腳本類型)。一種多時間鎖錢包設計成以 2-of-2 多簽名為基礎,在 15 個月後拓展成 2-of-3 多簽名;我們發現,在從錢包種取款時,每多一個輸入(多花費一個 UTXO),時間鎖錢包的交易的體積(以 vB 為單位)就比標準的多簽名錢包交易多出 13% 。第二種時間鎖錢包設計成以 3-of-3 多簽名為基礎,在 15 個月後遞減為一個 2-of-3 多簽名。對於這種錢包,每多一個輸入就會多出 38% 的數據體積。

交易數據的差異可能跟時間鎖錢包構造的具體細節高度相關(利用了 taproot 的錢包會從交易數據減少種獲得好處)。這種崇義可能已經足以一項 UTXO 管理決定,例如導致建議為錢包的 UTXO 設置更高的面額下限。除了更大的交易體積,時間鎖錢包還可能有更多的在高費率環境下發起交易的需要,這是我們將要討論的另一個顧慮。

定期移動比特幣的壓力

基於時間的復原路徑的錢包,有意設計成讓這些花費條件在一開始是禁用的,而在地址中的比特幣靜置一段時間沒有移動之後,才啟用 —— 並不是一開始就提供可用的另外路徑。復原路徑的激活提高了資金的可訪問性,這在處理丟失密鑰的威脅時,是非常有用的,但是,它同時也降低了應對偷盜威脅的保護。因此,一個時間鎖錢包的用戶,要保證復原路徑永久處於時間鎖的約束之下,直到真的要用到它。

在本文的開頭,我們提到,絕大部分時間鎖錢包都使用 CSV,它最長的時間鎖也就是 15 個月。因此,為了保證時間鎖不過期,最少每 15 個月要重置一次時間鎖。重置 CSV 時間鎖並不難,只需將比特幣轉移到同一錢包內的一個新的地址,但是,這樣做就要觸及所需的私鑰、將它們從安全的存儲位置取出、簽名一筆或更多筆交易來移動整個錢包的餘額。在時間壓力之下采取這些敏感的行動,可能會產生慌張和十五。此外,如果還要考慮隱私性,可能需要更加頻繁的重置交易(每個 UTXO 分別處理),來避免影響隱私性的地址關聯

另一個重要考慮是交易手續費率的波動。交易手續費不僅取決於交易數據(如上一節所述),也取決於手續費率環境 —— 快速移動比特幣的全球需求。手續費率環境可能在比特幣價格大幅波動時產生無法餘氯的波動。如果你設置了一個時間鎖錢包,計劃每 14 個月(在 15 個月的倒計時還剩一個月的時候)重置一次時間鎖,你可能會發現在這最後一個月力,手續費率是非常高的。那麼你就會面臨一些不舒服的抉擇:你可以支付額外更高的手續費(可能是費率較低時候的幾百倍),也可以等待、之網手續費率下降。如果你等了,費率卻繼續上升,你就會感覺自己被逼到了牆角,要麼讓錢包的安全性隨著時間鎖過期而降級,要麼拿出一大筆比特幣來支付手續費。

結論:時間鎖錢包更安全嗎?

利用了 Miniscript 的時間鎖錢包可以為比特幣資金的安全模式加入額外的複雜性。它們可以定製成實現一些巧妙的結構,但也有一些取捨。交易手續費、UTXO 管理、外部的錢包遷移選項,對於用戶來說都更具挑戰性。持續採取行動的模式,也不同於許多標準的多簽名錢包用戶的保管策略 —— 直接鎖定比特幣儲備長達數年。

時間鎖以獨特的方式處理了密鑰丟失和被盜的風險、預留了額外的盜竊保護,它隨時間自動解除限制,以應對密鑰丟失的概率。這種創造性的複雜性,是其吸引力的主要來源。然而,標準的多簽名錢包已經被廣泛認為是對丟失和失盜符合風險的強大解決方案。使用由密鑰代理持有後備密鑰的聯合保管多簽名錢包,功能也非常類似於拓展式多簽名時間鎖錢包,但在錢包遷移和及時行動上更少顧慮。因此,將時間鎖錢包視為不必要的過度複雜方案,也有一些道理。

(完)

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論