作者:Shinobi
來源:https://bitcoinmagazine.com/technical/bitcoin-layer-2-statechains
“Statechain” 是一個原創的二層協議,最初由 Ruben Somsen 在 2018 年提出;初版提議依賴於 “eltoo(或者說 LN Symmetry)”提議。在 2021 年,CommerceBlock 團隊開發除了初版提議的一個變種:“Mercury”。2024 年,最初的 Mercury 又迭代了一個版本,成為 “Mercury Layer”。
Statechain 提議講起來要比其它系統(比如 Ark(中文譯本) 或閃電通道)要複雜,因為從初版提議的設計到兩個已經實現的變種,再到曾被零散提議的設計,它允許的變異範圍很大。
與 Ark 實例一樣,Statechain 實例也依賴於一箇中心化的協調服務商。但與Ark 協議不同的是,statechain 的信任模型與 Ark 批次中的一個 vUTXO 略有不同。Statechain 依賴於協調服務商刪去以往生成的一個私鑰的碎片,以保持免信任性;但只要服務商遵循了定義好的協議,他們就提供了一個強大的安全性保證。
Statechain 的總體想法是,通過協調者的幫助,讓一整個 UTXO 的所有權在鏈下不同用戶間轉移。它不像閃電通道那樣要求收款方有收款額度,協調服務商也不需要像在 Ark 協議中那樣提供流動性。
我們還是先來看看 Ruben Somsen 提出的初版協議吧。
最初的 Statechain 提議
對於一個 Statechain 的最新所有權人來說,這筆資金由兩部分組成:(1)一筆預簽名的交易,讓 TA 可以隨時在鏈上單方面取出資金;(2)一筆密碼學簽名的歷史消息,證明以往的所有權人以及他們所授權的 statechain 轉賬的接收方。
最初的設計建立在使用 ANYPREVOUT 的 eltoo 協議上,但當前關於如何啟用相同功能的一種想法是利用 CHECKTEMPLATEVERIFY(CTV)和 CHECKSIGFROMSTACK(CSFS)(具體做法的一個概要解釋可在關於 CSFS 的文章結尾找到)。它們背後的基本想法是,產生一種腳本,使得一筆預簽名的交易可以花費任何帶有此腳本且具有一定價值的 UTXO,而不是讓預簽名交易只能花費某一個 UTXO。
在 statechain 協議中,希望將資金存為 Statechain 的用戶先聯繫一個協調服務商,然後走存款流程。這個存錢的用戶我們稱為 Bob,會生成一個只有他自己知道的密鑰(“唯一密鑰”),以及一個最終會被分享出去的 “臨時密鑰” (詳情我們後面再說)。然後,他們可以構造一筆存入交易,將 Bob 的資金鎖入一個需要協調員密鑰以及臨時密鑰的簽名才能花費的多簽名地址中。
基於這個多簽名地址,Bob 和協調員簽名一筆交易,花費這筆資金、創建一個 UTXO:它既可以被臨時密鑰和協調員密鑰使用 LN Symmetry 協議簽名的任何交易花費,也可以被 Bob 唯一密鑰在一個時間鎖過期後花費。現在,Bob 可以為上述的存入交易簽名並廣播出去,然後這個 Statechain 就創建好了。
為將一個 Statechain 轉移給 Charlie,Bob 必須完成一個多步驟的流程。首先,Bob 用自己的唯一密鑰簽名一條消息,表示自己準備將這個 Statechain 轉移給 Charlie。Charlie 必須也簽名一條消息,表明他已經從 Bob 處收到了這個 Statechain。最後,協調服務商必須簽名一條新的交易,允許 Charlie 單方面在鏈上取出這個 Statechain 上的資金,然後 Bob 給 Charlie 發送臨時密鑰的副本。
所有步驟都是使用 “適配器簽名” 來實現原子化的。這些簽名會以特殊方法修改:加入的一段隨機數據使它們成了無效簽名,然而,如果簽名的持有者得到了與那段隨機數據對應的一段信息,就可以再度產生一個有效的簽名。上述所有消息,以及新的預簽名交易,都使用了適配器簽名,並通過適配器數據的釋放,在同一時間原子化地成為有效消息。
Statechain 的持有者必須信任協調服務商永不會跟前任所有權人勾結、簽名立即關閉 Statechain 的交易(從而盜取屬於當前所有權人的資金),但是,如果這個協調員這麼做了,預簽名消息的鏈條可以證明 TA 參與了盜竊活動。如果一個前任所有權人嘗試使用自己手上的預簽名交易來盜竊資金,(資金的目的地依然包含前述的兩條花費路徑),僅需動用其密鑰的路徑帶有時間鎖,因此現任所有權人有時間提交自己手上的預簽名交易(其花費的是第一條使用 LN-Symmetry 的路徑),從而正確地在鏈上取走資金。
Mercury 和 Mercury Layer
最初的 statechain 架構需要軟分叉(添加 ANYPREVOUT 或類似功能)才能工作。CommerceBlock 則設計了不需要軟分叉的 statechain 變種,但功能性便有所犧牲。
其基本的思路與原始設計保持一致,所有用戶都持有一筆預簽名交易,允許他們單方面取出資金,而且協調員服務商依然在協調鏈下轉賬時扮演重要角色,用戶們需要信任 TA 會誠實行動。兩個重大區別是用戶得到的交易的簽名方式,以及這些預簽名交易的結構。
首先是簽名。用戶之間不再傳遞臨時私鑰。相反,Mercury 使用一種多方計算(MPC)協議,使得用戶和協調員可以合作生成一個私鑰,但各自都只有該私鑰的一部分,沒有哪一方知道完整的私鑰。這個私鑰就用來簽名預簽名交易。這個 MPC 協議還允許現任所有權人和協調員與第三方(轉賬的接收者)參與第二輪協議,讓協調員和第三方能生成 另一份 碎片但得到相同的私鑰。在 Mercury 和 Mercury Layer 協議中,在完成一次轉賬之後,誠實的協調員需要刪除對應於上一任所有權人的密鑰材料。只要這麼做了,協調員就不再能夠跟前任所有權人合作簽名,因為協調員手上僅剩的碎片與任何一個前任所有權人的碎片都不匹配,無法生成正確的私鑰。這是比原始提議更強的安全性保證,只要協調員誠實的話。
Mercury 和 Mercury Layer 的預簽名交易無法使用 LN Symmetry(還沒有軟分叉添加這個功能)。因此,CommerceBlock 選擇了使用遞減的時間鎖。最早一位所有權人的預簽名交易使用了 nLocktime 字段,也即絕對時間鎖,在足夠遠的未來才能動用。隨著每一次轉賬發生,後續一位用戶獲得這個 Statechain,其獲得的預簽名交易的絕對時間鎖就比前一任所有權人的短出一個預定義的長度(可以更快動用)。這就保證了前任所有權人甚至沒法搶先在鏈上提交預簽名交易(最新的所有權人的預簽名交易總是最快能夠廣播的),但這也意味著,到了某個時間點,最新的所有權人就 必須 在鏈上關閉自己的 Statechian,否則上一任所有權人就有機可乘。
Mercury 與 Mercury Layer 的主要區別在於交易簽名的方式。在 Mercury 中,協調員服務商可以看到當前用戶提議的轉賬,能夠驗證和簽名。而在 Mercury Layer 中,由於使用了盲簽名協議,協調員無法看到他們簽名的交易的任何細節。因此,服務商必須使用匿名記錄以及當前所有權人的一個特殊授權密鑰來跟蹤各個 Statechain,以保證只會簽名有效的轉賬。
與其它方案的協同
Statechain 可以跟基於預簽名交易的其它 Layer 2 方案協同工作。舉個例子,初版提議的一部分提議結合 statechian 和閃電通道。因為兩者都使用預簽名交易,所以可以在一個 Statechain 中封裝一條閃電通道。這隻要求當前所有權人的單方退出密鑰是一個多簽名,並創建預簽名交易將其 Statechain 花到一條閃電通道中。這讓閃電通道可以完全在鏈下開啟和關閉。
類似地,可以在一個 Ark 輪次的一個 vUTXO 中封裝一條 Statechain。這隻需要構建對 statechain 必要的、花費該 vUTXO 輸出的預簽名交易。
總結
Statechain 不是完全免信任的,但它已經很接近信任最小化;其流動性效率非常高,而且允許任何願意接受 statechain 的信任模式的用戶在鏈下轉移 UTXO。
雖然初版提議還未實現,由 CommerceBlock 設計的兩個變種已經完全實現。兩者在現實世界中都只獲得了邊緣用戶。這是因為用戶們不願意接受其中的信任模型,亦或只是因為營銷不力、關注不高,很難下定論。
但不管怎麼說,給定有兩種完整的實現,而且只要 LN Symmetry 在比特幣上實現就可以設計出更靈活的變種,這是一種永遠可用的選擇。開源軟件好的地方就在於,它總是在那裡,無論人們是現在就使用,還是等待未來。




