作者:Saravanan Mani
什麼是 “Ark”?
“Ark” 是一種比特幣 Layer 2 協議,支持即時且便宜的比特幣支付。
它的操作大部分發生在鏈外(off-chain),也就是說,基於 Ark 協議的支付是在比特幣區塊鏈之外發生的。Ark 是一種支持自主保管的協議,用戶可以在需要時自主在鏈內(on-chain)取出資金,雖然跟基於排他性輸出的自主保管方案有區別(我後面會講到)。
與閃電網絡不同,Ark 協議不依賴於發票、支付通道、HTLC(哈希時間鎖合約)、路由等概念。相反,它使用一種 服務商-客戶 模式,所有用戶都跟自己的服務商交互,而不是通過點對點網絡(跟其他用戶)交互。
Ark 遵循了一種樂觀設計,也即用戶假設服務商會正確地協調交易。如果這個服務商變得無動於衷、開始審查交易、行為不軌,用戶就可以回敬以單方面退出。常規條件下,退出操作會在服務商和用戶協同之下在鏈外處理,即單方面退出只用於非常規情形。
Ark 支付跟鏈內支付模式相似:它們是在鏈外處理的預簽名比特幣交易,接收者不需要在線來接收支付,用戶也不需要提前鎖定流動性。
Ark 是比特幣專屬的(Bitcoin-only)。它不包含山寨幣、token、側鏈和新區塊鏈。它在當前的比特幣共識規則上就能工作。不過,“限制條款(covenant)”(一類比特幣共識規則升級)可以顯著加強這個協議。
與所有的 Layer 2 協議一樣,Ark 也有自身的取捨,這使得它更適合於某一些場景,而不適合另一些場景。
入場和支付
有兩種方法加入一個 Ark:
使用一筆常規的比特幣交易,在區塊鏈內移動你的比特幣到一個 Ark 中
收取 Ark-to-Ark 支付,也能讓你進入一個 Ark,並且是即時的 。這是在鏈外發生的,並不需要付出區塊鏈確認手續費,也不需要前置操作。
(譯者注:此處講的這種支付形式是一般稱為 “Arkoor(Ark out-of-round)” 的支付。)
所有的 Ark-to-Ark 支付都是即時、低手續費的,而且完全發生在鏈外。
如何通過鏈內存款進入一個 Ark?
在這個案例中,Alice 使用自己的鏈內 UTXO(在圖中表示為 “Alice input utxo”)創建一筆注資交易。該交易隨時可以被 Alice 和目標 Ark 的服務商(AS)一起花費,也可以在 30 天后被 AS 獨自花費。在簽名和廣播這筆注資交易之前,Alice 和 AS 要一起簽名一筆暫不廣播的 “退出虛擬交易(exit virtual transaction)”。這筆退出交易花費注資交易的輸出(“output UTXO”);而它的輸出又可以被雙方隨時一起花費,或者被 Alice 在該退出交易得到區塊確認的一天之後獨自花費。這套裝置給了 Alice 在加入這個 Ark 後的 30 天內單方面退出的選擇。
這些沒有廣播的交易都包含一個額外的錨點輸出,用於允許通過 CPFP(子為父償)方法為交易追加手續費。為了簡潔,上圖中省略了這樣的錨點輸出。(譯者注:“CPFP” 即是用一筆新交易來花費一筆尚未得到區塊確認的交易的某個輸出,並在這筆新交易中攜帶足夠多的手續費,從而吸引礦工同時確認這兩筆交易。)
但是,為什麼 AS 可以在 30 天的絕對時延之後獨自取走注資交易中的資金,而 Alibe 必須等待 1 天的相對時延之後才能單方面取走退出交易中的資金?為什麼 CPFP 是這些交易的唯一一種手續費支付機制?我們後面再解釋。
在 Ark 協議中,未廣播的交易和 UTXO 相應被稱作 “虛擬交易” 和 “VTXO(虛擬 UTXO)”。
(譯者注:可以看出,不同作者對 “VTXO” 的定義會有些許不同,但核心意思是一致的。)
Ark 協議使用基於 Schnorr 簽名的 Taproot 腳本來強制執行這些花費條件。Alice+AS 的多簽名裝置遵循 N-of-N 的 MuSig2 多方計算協議,最終產生單個聚合公鑰和單個聚合簽名。
如何通過 Ark 支付進入一個 Ark?
在這種情況下,Alice 給 Bob 支付 100k 聰(見黃色的 “bob vtxo”),具體做法是花費自己的 VTXO(即 “alice vtxo”)。她跟 AS 一起簽名,解鎖 “Alice+AS” 花費條件。她會收到 900k 聰作為找零(“alice change vtxo”)。Bob 的 VTXO 中的花費條件跟 Alice 的 VTXO 是完全一樣的(唯一區別是使用 Bob 的公鑰而非 Alice 的公鑰)。Alice 的找零 VTXO(“alice change vtxo”)維持跟她原來的 VTXO 一樣的花費條件。
現在,Bob 就可以使用自己的 VTXO 來發起 Ark 支付了,就像 Alice 做的一樣。不過,Bob 的 VTXO 帶有被重複花費的風險:因為支付是在鏈外發生的,這些交易沒有得到區塊鏈確認,也就沒有區塊鏈提供的重複花費保護;AS 和 Alice 可以串通起來,在別的地方再次花費 Alice 原本的 VTXO,從而在 Bob 一無所知的情況下作廢掉 Bob 的 VTXO 。但 Alice 的找零 VTXO 就沒有這樣的風險,因為她沒有欺詐自己的動機。
如果 Alice 和 AS 都作風正派(沒有簽名和廣播與此次支付相沖突的交易),Bob 就可以通過廣播他的 “支付虛擬交易(payment virtual transaction)” 以及退出虛擬交易,單方面退出這個 Ark 。他自己必須使用 CPFP 為這兩筆交易支付區塊確認手續費。
帶有重複花費風險的 VTXO 被塗成黃色,而沒有這樣的風險的 VTXO 則被塗成綠色。
深入觀察 Ark 支付
如你所見,就像 Alice 可以給 Bob 支付一樣,Ark 的用戶可以彼此支付。然而,任何從帶有重複花費風險的 VTXO 創建的新 VTXO 都會帶有同樣的風險。實際上,這種風險會越來越大,因為這個 VTXO 鏈條上的任何一個前任都可能跟 AS 勾結從而傷害最新 VTXO 的持有人。找零 VTXO(或者說自我支付的 VTXO)最初是從一個 exit VTXO(比如 Alice 的 exit VTXO)中派生的,可以認為是沒有這種風險的,因為同一個用戶既控制著輸入又控制著輸出,所有沒有激勵去創建與之衝突的交易(參與勾結)。
此外,從長鏈條的支付虛擬交易中創建的 VTXO 在單方面退出時會面臨更高的區塊鏈確認費用。這是因為用戶必須為(從最初一筆退出虛擬交易開始的)鏈條上的每一筆虛擬交易支付手續費。
我們會在後續章節中演講如何緩解重複花費風險以及長鏈條 VTXO 的高昂單方面退出成本。
因為 Ark 支付是隻由發送者和 AS 簽名、完全離鏈的交易,所以它們是即時的,而且不會有區塊確認手續費。
Ark 協議如何為入場和支付擴容?
任何用戶都可以使用自己的鏈內資金加入某個 Ark,就像 Alice 一樣。在上圖中,Wendy 也用類似的方式加入了一個 Ark 。為了簡化,只展示出了可以被花費的 VTXO 。
鏈內入場的吞吐量受到比特幣的區塊空間限制。相反,Ark 支付是完全在鏈外發生的,並不受區塊空間的約束。它的吞吐量完全取決於 Ark 服務商處理和協調這些交易的能力。
合作式退出
什麼是 “合作式退出”?
在 “合作式退出” 中,一位用戶向自己的 AS 表明,自己希望用一個 VTXO 交換一個鏈內的 UTXO 。這位用戶將自己的 VTXO 餘額轉移到一個由 AS 控制的地址中,而 AS 則同時轉移相等數額的鏈內資金到該用戶所控制的地址。這種互換具有原子性,從而保證了公平。
如上圖所示,Bob 和 Wendy 都希望合作式退出這個 Ark 。那麼,AS 就構造一筆交易,稱作 “批量處理交易”,將 AS 的鏈內資金轉移給這兩位用戶。同時,這兩位用戶各自準備一筆 “棄權交易(forfeit transaction)”,將自己的 VTXO 餘額轉移給由 AS 控制的一個地址。
在這個階段,這三筆交易都還沒簽名。這是因為,不管 AS 還是用戶,都不想先把自己的餘額交給對方,因為這樣會帶來對手方風險:對方可能拒絕簽名對應的交易。為了保證退出是公平的,我們需要一種機制來原子化地簽名這些交易、保證 VTXO 和 UTXO 公平交換。
這裡的想法是:如果僅在批量處理交易變得可以花費之後,棄權交易才能被花費,那麼交換就是原子化的。
如上圖所示,當我們把來自批量處理交易的一個輸出(稱為 “連接器”)作為一筆棄權交易的一個輸入之後,就只有在批量處理交易被簽名和區塊確認之後,棄權交易才能被花費。連接器輸出的價值並不重要。只要它超過了粉塵數額,就可以保證,只有在批量處理交易得到區塊確認之後,棄權交易才可能被區塊確認。
現在,簽名順序的重要性就體現出來了。用戶必須先簽名自己的棄權交易 —— 這個步驟對他們來說是絕對安全的,因為除非 AS 簽名批量處理交易,棄權交易是不會生效的。
在收到用戶發來的棄權交易之後,這個 AS 再完成簽名和廣播批量這筆處理交易、讓它得到區塊確認的流程。
為什麼要在 VTXO 中添加 “用戶 1 天之後才能取走資金” 的條款?
如果 Wendy 嘗試欺騙這個 Ark 服務商,也就是說,在已經簽名了棄權交易、從批量處理交易中收到了一筆資金之後,又發起單方面退出、嘗試領取自己(已經棄權的)VTXO 中的價值,這個 AS 就可以廣播這筆棄權交易、阻止 Wendy 。
這就是在 VTXO 中添加為期 1 天的相對時間鎖的目的。這個時延給了 AS 充足的時間來廣播和確認棄權交易;該交易已經得到了 Wendy 的簽名,可解鎖 Wendy+AS 條件,因此不受時間鎖限制。時間鎖讓A S 可以搶在 Wendy 之前,取走 VTXO 中的資金。
這個相對時間鎖的長度可以由服務商來配置。
連接器輸出可能會變得很多,有辦法優化它嗎?
在上圖的做法中,批量處理交易中的連接器輸出的數量,是跟使用它來合作式退出的 VTXO 的數量一樣多的。因為批量處理交易是要得到區塊確認的,隨著連接器輸出的數量增加,它的體積也就增大,區塊確認手續費也會上升。
而在這裡,我們加入一筆緩衝交易,叫做 “連接器交易(connector tx)”,它使批量處理交易只需要準備 1 個連接器輸出,就能(產生出足夠數量的連接器)為所有的棄權交易服務。這就消除了(在批量處理交易中)為每一筆棄權交易準備一個連接器輸出的需要,將連接器輸出數量的線性增加替換為單個輸出,極大地減少了批量處理交易的體積和確認成本。
理想情況下,VTXO 的虛擬交易,以及棄權交易和連接#器交易,都是不會廣播到區塊鏈上的。它們只是一種後備手段,只會在用戶嘗試欺詐時使用(這時候用戶會廣播全部的虛擬交易以及被棄權的 VTXO,而 AS 會廣播連接器交易和棄權交易)。
但如何阻止用戶通過廣播一個已經棄權的 VTXO、向 AS 發動 DoS(拒絕服務式攻擊)?答案是,因為所有的虛擬交易都依賴 CPFP 來支付手續費(自身並不攜帶任何手續費),嘗試欺詐的用戶必須為整個交易鏈條支付手續費。即使這個用戶能接受這一點,AS 也依然能夠通過預簽名的棄權交易來搶先取走被棄權的 VTXO 中的資金。這使得這樣的攻擊昂貴而且沒有意義,也就在實質上阻止了用戶嘗試欺詐。
那又為什麼要在輸出 UTXO 中加入 “AS 可在 30 天絕對時延後取款” 的條件呢?
在現實生活中,一個 Ark 服務商(AS)的任何一部分用戶都可能隨時請求合作式退出。
從一筆注資交易的輸出中創建的 VTXO,是直接或間接派生自這個輸出的,形成了一個多層的、前後相接的交易結構。這意味著,多個用戶實際上共同分享來自注資交易的同一個鏈內 UTXO 。
然而,AS 無法在某一用戶請求合作式退出時,就強迫共享同一個祖先交易的所有其他用戶也跟著一起退出。這樣做會形成糟糕的用戶體驗,而且也是不切實際的,因為一些用戶會離開互聯網,或者說在合作式退出流程期間無法響應。
為了處理一些用戶的退出請求而不打擾另一些用戶,AS 臨時使用自己的鏈內資金來協助希望合作式退出的用戶批量退出。
但是,AS 自己為批量處理交易注入資金(為用戶服務)之後,該如何從用戶棄權的 VTXO 中回收資金呢?一種選擇是廣播棄權交易。但是,這將強迫許多共享相同祖先交易的無關 VTXO 也退出。而且,這種辦法還會引入不必要的交易確認成本和時延,在實質上背離了 Ark 的鏈外設計的初衷。
與此同時,AS 也不能讓自己提供的流動性永久鎖定、直到共享一筆注資交易的每一位用戶都合作式退出,這代價也太昂貴了。這樣做會給 AS 施加一種無法承受的負擔、讓這樣的系統無法擴容。
一種更加務實的做法是,給共享一筆注資交易的所有用戶施加一個最終期限,在這個最終期限到來之前,用戶們必須發起合作式退出。但是該怎麼實現呢?
這就是 “AS 可在 30 天絕對時延後取款” 的作用了。在 30 天的絕對時延之後,AS 就可以獨自花費這個 UTXO 。在這個窗口期內,用戶可以隨時請求合作式退出。不過,如果一個用戶沒有在此期間退出,TA 的 VTXO 就會被 AS 拿走 —— 無論 TA 是否明確簽名過棄權交易。
這一機制讓 AS 可以在一個可預期的時間框架內回收流動性,並持續高效地運行。這個過期時間的長度也是可以由服務商來配置的。
缺點是,沒能在最終期限到來之前行動的用戶會丟失自己的 VTXO 餘額(由 AS 取走)。
三個尷尬的問題
我們已經指出了三種可能讓 Ark 協議不實用或者缺乏吸引力的尷尬問題:
- 從 Ark 支付中創建的 VTXO 所伴隨的重複花費風險
- 因為沒有在 30 天的最終期限之前退出而丟失 VTXO 餘額的風險
- 單方面退出的難度和高成本,尤其是對其 VTXO 處於長長的虛擬交易鏈條末端的用戶
Ark 協議可以如何解決這些問題?
幸運的是,這三種問題都可以用一種方案來解決:AS 回收受影響的 VTXO,為相關的用戶發放刷新了的退出虛擬交易的 VTXO。
我們可以使用批量處理交易來解決這些問題,就像合作式退出流程一樣。只是,AS 不需要為每個用戶協調一個鏈內 UTXO,而只需要為他們每人發放一個來自新的退出虛擬交易的新 VTXO 。這個新 VTXO 是更加安全的,因為它沒有重複花費風險,也不處在長長的虛擬交易鏈條的末端,而且過期時間點重設成了從此刻開始的 30 天之後。
在上面這個案例中,Dave 原子化地將自己的舊 VTXO(帶有重複花費風險)換成了一個新的、沒有風險的 VTXO 。他沒有用批量處理交易來執行合作式退出(獲取一個鏈內 UTXO),而是安全地獲得了一個新的、來自一筆退出虛擬交易的 VTXO 。
如果你再看仔細些,你會發現,上圖的批量處理交易的第一個輸出,其花費條件跟前述注資交易的輸出是一樣的。Dave 的退出虛擬交易也是數次。關鍵區別是資金的來源:前面提到的注資交易的資金來自用戶自己的 UTXO,而這裡的批量處理交易的資金則來自 AS 自己的 UTXO 。為什麼呢?原因跟 AS 要給合作式退出注資是一樣的 —— TA 臨時注入自己的資金,幫助用戶將舊的 VTXO 換成新的。一旦舊 VTXO 的過期時間點到來,AS 就可以一次性回收資金,跟合作式退出的情形是一樣的。
當這個新 VTXO 的過期時間點臨近,這個用戶必須依照相同的流程、執行另一次互換。這防止了 AS 侵奪過期的 VTXO 。如果 AS 清掃了過期(而沒有明確棄權)的 VTXO,用戶實際上就是將自己的資金交給了 AS 。Ark 協議並不保證這樣被清掃的 VTXO 的價值會歸還給用戶。不過,在現實中,AS 可能會在用戶回到互聯網上的時候,為 TA 發放一個相同價值的新的 VTXO ,作為一種禮貌。
自然,這些週期性的互換會需要用戶付出一定的手續費,因為批量處理交易需要獲得區塊確認。但這一費用一般來說是低的,因為每個用戶只需分攤一部分區塊確認手續費。
Ark 協議如何擴大 VTXO 互換的吞吐量?
這一設計的關鍵優勢是可擴展性。在上面這個例子中,Carol 和 Dave 都將自己的帶有重複花費風險的 VTXO 換成新的來自退出虛擬交易的 VTXO 。一筆批量處理交易可以支持幾千個用戶,只需要在輸出的多簽名花費條件中加入用戶的公鑰、產生更多的退出虛擬交易和 VTXO 即可。主要的瓶頸在於 AS 和所有參與的用戶之間的交互式簽名流程。
批量處理交易和退出虛擬交易的細節
AS 創建批量處理交易的頻率
一般來,AS 會按日常的時間間隔,比如一個小時,創建一筆新的批量處理交易。希望合作式退出,或者將既有 VTXO 換成新的無風險 VTXO 的用戶可以向 AS 登記自己的意圖,然後 AS 會跟他們的錢包軟件協調交易。這個間隔是由 AS 自己決定的。在高需求期間,AS 可以按需啟動額外的批次。
退出虛擬交易有一些問題
在一種基礎的退出虛擬交易構造中,一旦一位用戶單方面退出,同一批次的所有其他用戶也會被迫退出。這就打破了鏈外處理設施的連續性、導致意料之外的手續費、時延,並且要求每個人都重新入場。
而且,單方面退出的區塊確認手續費會隨著同一批次 VTXO 數量的增加而線性增加。比如說,如果一個批次有 1000 個 VTXO,那麼退出的用戶就必須為全部 1000 個輸出支付區塊確認手續費,那麼單方面退出的成本當然是極為昂貴的。
如何解決這個問題?
我們可以使用一種類似於二叉樹的退出虛擬交易構造,而不是讓一筆退出虛擬交易攜帶所有的 VTXO 。在這種構造中,如上圖所示,如果 Carol (在同一批次的其他參與者之前)希望單方面退出,那麼她需要按順序廣播一系列的虛擬交易:首先,是錨定了整個批次的 “根虛擬交易(root virtual transaction)”;然後,是左邊的 “分支虛擬交易(branch virtual transaction)”,該交易通向她的 VTXO 所在的為止;最後,是她自己個人的 “退出虛擬交易(exit virtual transaction)”。
結果是,如果 Dave 也希望單方面退出,由於他跟 Carol 恰好在樹的同一分支上,那麼他只需要廣播他自己的退出虛擬交易,因為該交易在樹上的祖先交易 —— 根虛擬交易和分支虛擬交易,都已經在 Carol 的單方面退出期間得到區塊確認了。
樹結構的退出虛擬交易設計,相比於基礎設計,提供了幾種好處。在基礎設計中,一個用戶的單方面退出會強迫同一批次的所有其他用戶也跟著退出。而在樹結構設計中,沒有發起單方面退出的用戶不會受到其他人的退出操作的影響,既避免了被迫的退出,又保持了鏈外支付的使用體驗。
單方面退出的區塊確認手續費負擔,也因此大大減少。在樹結構設計中,區塊確認手續費不再隨著 VTXO 數量的增加而線性增加,只會隨著 VTXO 數量的增加而呈對數增加(與樹的深度呈線性增加),從而單方面退出也變得更加經濟。後發起操作得用戶還能進一步受益,因為他們只需要廣播自己的子分支和葉子交易,儘可能降低自己個人的區塊確認手續費。
樹結構也提升了可擴展性,允許單個批次容納更多的 VTXO 。不過,它也帶來了更多的複雜性:交互式簽名的次數會隨著樹的深度而增加,並且需要參與者之間的更多協調。
當一位用戶選擇單方面退出時,他們必須廣播從樹根到自己所在的葉子、整條路徑上的每一個連接(每一筆交易),所以這個過程是非常費時費力的。當然,樹根和分支交易(的輸出)使用相同的腳本規則和過期條件,跟批量處理交易一樣。關鍵的區別是這些交易在簽好名後不會立即廣播到區塊鏈網絡中,只會在需要時廣播。
最後,如果一個用戶單方面退出了,那麼在 AS 日後需要清掃剩餘的 VTXO 中的價值時,也必須廣播和確認相應的分支交易(而不是隻花費批量處理交易就能完成清掃)。
- - -
要了解更多,可看這些資料:
特別感謝 tiero 審核這篇文章。
(完)