謹慎日誌合約工廠

作者:conduition

來源:https://conduition.io/scriptless/dlc-factory/

本文介紹了一種創建鏈下的 “謹慎日誌合約(DLCs)” 並且無需任何鏈上交易就可以延長合約的比特幣交易範式。我將這些交易統稱為 “工廠”,因為我們只需一筆鏈上注資交易就可以創建無限數量的 DLC。你可以認為它們是 “無盡 DLC” 或者 “自動展期的 DLC”。

  • DLC 工廠可以無盡延展,而且無需任何鏈上交易。任何一方都可以在預先確定的窗口期內打斷合約或者提早結算。
  • DLC 工廠是靈活和不對稱的,允許我們創建類似於交易金融期權合約的金融工具和類似於穩定幣的合約(可以按照固定的美元價值隨時贖回比特幣)。
  • 沒有引入新的受信任第三方。只需要一個被動的斷言機,這跟傳統 DLC 沒有區別。

交易流程圖

dlc-factory

建立流程

  • 準備向 Alice 和 Bob 共享的 2-of-2 多簽名 UTXO 注資。兩方共享的這項權利在圖中表示為 “A + B”。
  • 創建兩筆花費注資輸出的 承諾交易,一筆是給 Alice 的,一筆是給 Bob 的。
    • 承諾交易可以選擇性設置一個絕對時間鎖,以防止持有者過早發佈它。
    • 承諾交易只有 1 個輸入和 1 個輸出 * 。
    • Alice 的承諾交易可以這樣被花費:
      • Alice 和 Bob 都簽名;或者
      • Bob 簽名,且:
        • 具有該 DLC 的 任一 有效見證消息(attestation);或者,
        • 具有一個跟其它相關 DLC 關聯的清算見證消息(可選)
    • Bob 的承諾交易可以這樣被花費:
      • Alice 和 Bob 都簽名;或者
      • Bob 簽名,且:
        • 具有該 DLC 的 任一 有效見證消息(attestation);或者,
        • 具有一個跟其它相關 DLC 關聯的清算見證消息(可選)
  • 對每一筆承諾交易,創建一筆 結算交易,它會花費對應的承諾交易的輸出。
    • 結算交易只有 1 個輸入和 1 個輸出 * 。
    • 結算交易具有相對時間鎖,記為 “$\Delta$”
    • 結算交易的輸出只有 Alice 和 Bob 都簽名才能花費。
  • 從 Alice 和 Bob 各自的結算交易輸出中創建兩組 DLC 合約執行交易(CETs)。
    • 一筆 CET 只能花費一個結算交易 —— 它們是完全互斥的。

* 這些交易需要錨點輸出,以應對交易手續費市場的波動。

一旦合約交易的結構得到了雙方的共識,Alice 和 Bob 就可以拿合適的斷言機宣告作為適配器點,簽名所有的 CET。

最後,Alice 和 Bob 合作式簽名承諾交易和結算交易,但關鍵的是 —— 各方只收到對手方對 己方版本 的 承諾交易/結算交易 的簽名,也即:Alice 收到 Bob 對 Alice 的承諾交易和結算交易的簽名,而 Bob 收到 Alice 對 Bob 版本的承諾交易和結算交易的簽名。不過,為了防止敲詐(griefing),雙方都需要來自對方對兩套 CET 的適配器簽名。我會在 “分析” 章節解釋這種不對稱性。

在交換完簽名後,雙方都可以簽名和發佈注資交易。一旦交易被髮布和確認,這個 DLC 工廠就開啟了。後簽名的一方相當於能夠得到一個免費的期權(可以決定發佈或不發佈),但常規的 DLC 也是這樣的,是一個已知的開放問題。

結算

如果某一方想單方結算一個 DLC 工廠,那麼首先要決定結算哪個 DLC,然後發佈該 DLC 的承諾交易。該承諾交易的鎖定時間(如果有的話)必須已經到期,而且 DLC 的見證消息必須還沒有發佈;在結算交易花費方法的相對時間鎖到期之前,也無法發佈結算交易。

然後,我們要發佈結算交易,它會完全鎖定一個具體的 DLC。一旦結算交易得到確認,整個合約就會變得跟傳統的 DLC 一模一樣:等待斷言機的見證發佈,而一旦發佈,這個見證就可以用來解鎖並廣播其中一筆帶有適配器簽名的合約執行交易。

這就是為什麼雙方都要收到對手方對兩套 CET 的適配器簽名:舉個例子,如果 Alice 沒有 Bob 對 Bob CET 的適配器簽名,那麼 Bob 就可以敲詐 Alice,他可以把他的 承諾交易/結算交易 發佈到鏈上,而 Alice 無法代表 Bob 發佈任何 CET;如果斷言機所見證的結果有利於 Alice,Bob 可以躲起來,不讓 Alice 取走應該屬於她的資金。

若要合作式結算一個 DLC 工廠,Alice 和 Bob 可以協商一個他們希望注資的新 DLC。默認情況下,這能能是其中一個他們都已經同意執行的 DLC,不過,也可以按需調整。一旦雙方達成一致,他們就創建一筆 合作關閉 交易、花費掉注資出書,然後簽名一組花費這筆合作關閉交易的 CET。這些 CET 會根據 Alice 和 Bob 已經同意的斷言機宣告的條件來分割資金,並且,這些 CET 將是他們為這個 DLC 工廠合約簽名的最後一組 CET。

Alice 和 Bob 可以合作式簽名和發佈合作關閉交易,從此開始執行一個普通的 DLC 。如果任何一方在其中停止合作,另一方可以回到單方結算模式中,發佈自己手上的一個承諾交易。

懲罰

注意,一旦結算交易被髮布,雙方都可以安全地離線,即使 DLC 見證已經發布。不過,在此之前,Alice 和 Bob 都必須保持在線和警惕:如果對手方發佈一箇舊的過時的承諾交易,就要懲罰對方。也就是說,需要在相對時間鎖 $\Delta$ 過期之前,發佈一筆懲罰交易、拿走承諾交易輸出中的所有價值。

此外,跟閃電通道一樣,這種懲罰機制可以由一個不受信任的瞭望塔獨立地代表參與者執行。只是修改了懲罰路徑,從而 Alice 和 Bob 都適配簽名了一筆懲罰交易,該簽名可以用斷言機的任何一個見證來補完。所以參與者可以把這些交易的副本和斷言機宣告的指針交給瞭望塔。瞭望塔如果監測到過時(相應的見證消息已經被髮布)的承諾交易被髮布,就可以解鎖併發布懲罰交易。

如果一個 DLC 是被合作式結算的,這個瞭望塔就無法直接知曉這個合約涉及哪些資金,儘管瞭望塔的確能知道相關的數額以及合約所涉及的斷言機事件。

分析

這種結構讓 Alice 和 Bob 可以跟對方締結多個互斥的 DLC,而且任何一方都可以用工廠中的任何一個 DLC 結算,只要該 DLC 的見證 還沒有被髮布、並且不會在承諾交易確認後的相對時間鎖窗口內公佈,就可以了。如果見證會在時間鎖窗口內公開,那麼對手方就可以從承諾交易中取走所有的價值。這就構成了 Alice 或者 Bob 可以安全發佈自己的承諾交易的一個最終時間點。

這種結構有什麼用呢?它可以 無限展期一個 DLC 而無需動用鏈上交易。延長一個 DLC 工廠合約是非常簡單的:只需簽名一組新的 CET、結算交易和使用一組新斷言機公告的承諾交易即可。舊的DLC 在前述時間點到達之前,依然是可以執行的。而在到達上述時間點之後,新的 DLC 就會頂替上來,因為任何一方都不再能安全地發佈舊的承諾交易。如果雙方不能已知同意延長這個 DLC 工廠,那麼任何一方都可以直接發佈一筆承諾交易,從而鎖定執行具體的一個 DLC。

因此,DLC 工廠讓我們可以創建多個在不同時間點結算的金融合約,而不是隻能創建在一個固定時間到期的合約。

比如說,Alice 和 Bob 可以創建一個差價合約(CFD),也即雙方都同意基於特定底層資產(比如黃金、某種股票,甚至是比特幣)的價格給對方支付一定數量的金錢。這種合約已經可以用 DLC 實現了,但是,以前的比特幣 DLC 做法總是假設 CFD 合約有一個固定的到期日,而在傳統的交易所中,CDF 可以在任何時間結算,而且可以無限展期。DLC 工廠舊可以在比特幣讓模擬 CFD 這種非常靈活的特性,讓短線交易員來定價。

我們也可以用這種方法來創建其他更復雜的金融工具。因為承諾交易是不對稱的,我們可以為兩方創建完全不同的 DLC,從而,以哪個 DLC 結算將取決於哪一方發佈 承諾/結算 交易。我們還可以通過簡單省去某一方的承諾交易來防止其發起結算。我們可以創造:

  • 根據發起結算程序的參與者身份來調整支付的差價合約。
  • 類似於期權的合約 —— 僅有一方可以 “執行” 合約。
  • 類似於穩定幣的合約 —— 合約持有人隨時都能換回價值一定數量美元的 BTC。
    • 另一方則實際上獲得了相反的合約:利用自己的比特幣存量來 獲得更多比特幣(如果比特幣跌價的話),可以想象,某些比特幣愛好者一定會喜歡這個 ……

修改

DLC 工廠可以適用多種定製化的方法來適應特定的應用場景。

  • 承諾交易上的絕對時間鎖可以用來定義優先級,從而任何時候,都只有部分承諾交易可以廣播出去。比如說,一個 DLC 工廠可能給每一天安排了一個 DLC,然後每一個 DLC 都有一個在早上 8 點可以啟用的承諾交易,而對應的事件會在早上 11 點宣告。如果 $\Delta$ 為 1 小時,那麼,參與者將僅在每天早上 8 點到 10 點之間可以安全地發佈對應於當天的承諾交易。如果早上 10 點之後才發佈,對手方就可以使用懲罰分支來劫走所有資金。
  • 也可以為兩方設置不同的時間鎖,從而,在特定時間,只有一方可以 “鎖定” 一個 DLC,而另一方不能。比如說,一方可以隨時結算 DLC 工廠,而另一方只能在工作日的工作時間才能發起結算。
  • 承諾交易輸出的懲罰分支可以使用一個時間鎖,而不是見證鎖,從而如果在某個時間點之後發佈承諾交易,就會把資金全部送給對手方。如果斷言機的見證非常準時,而對抗瞭望塔的隱私性又非常重要中,這種特性可能會有用,因為它不會給瞭望塔任何信息(除了 DLC 工廠所涉及的總價值)。
  • 承諾交易輸出可以設置一條額外的、使用閃電通道類型撤銷秘密值的懲罰路徑。這將讓參與者可以手動作廢未來的承諾交易,從而允許在工廠中協商未來的 DLC 。
  • CET 可以設為不對稱的,根據關閉工廠的角色進行差異化支付。比如,關閉者手上的 CET 將給他們一個(比對手)稍微差一點的報酬曲線,以激勵雙方合作關閉工廠,而不是單方強制關閉工廠。
  • 還可以給注資輸出腳本添加一個 HTLC 條件,從而允許所有權通過鏈上交易免信任地轉移;這將允許人們使用閃電網絡狗仔一個 DLC 工廠中的一定倉位(需要更多研究)。

缺點

有優點,就難免有缺點。

性能

涉及到數字結果的 DLC 已經非常難簽名和驗證了,因為常常需要大量的 CET 適配器簽名。DLC 工廠則會再慢上一倍,因為每一個 DLC 都是不對稱的,需要兩組 CET。而且,顯而易見,每多一對承諾交易,都要多作一次簽名程序。簽名/驗證 的性能在期權這樣的合約中是最好的,因為只有一方有能力發佈承諾交易。

雖然 DLC 工廠的性能成本很高,但成本可以隨時間逐步攤銷,因為承諾交易在臨近到期之前並不一定要得到簽名。所以,參與者可以選擇先簽名一個 DLC,然後就給合約注資,隨著時間推移逐步添加剩餘的 CET 簽名。

活性

DLC 工廠的參與者變成有活性要求了。

在傳統的 DLC 中,雙方可以離線,哪怕在合約到期之後。如果斷言機的見證不能如你所願,你可以直接離線,讓另一方來結算 DLC。

但 DLC 工廠的參與者,就像閃電通道的對等節點一樣,必須主動監控區塊鏈,以確保對手方不會發布舊的承諾交易並用過時的見證來盜取資金。每一方都要謹慎確保自己有能力及時提交承諾交易,而這就需要保持在線。

這個不利之處可通過瞭望塔來緩解。

死鎖

DLC 工廠的參與者也必須保證,如果對手方不願意通過簽名一組新的承諾交易和 CET 來延長工廠的生命,自己能夠及時發佈一筆承諾交易。否則,工廠可能會進入一種死鎖狀態:沒有任何一方能夠單方面在鏈上解散這個 DLC 工廠,除非雙方都回到線上、一起構造一次合作式關閉。

這就類似於閃電通道的參與者一般會在對手方離線很長時間之後強制關閉通道,只不過,在 DLC 通道中,有一個明確的時間點,到了該時間點,工廠就 必須 結算,以保證資金可被公平取出。

真實世界的事件

DLC 工廠也不便於見證發佈日期可能靈活變動的真實世界事件。

首先,好處也很有限:如果一個事情只會發生一次,那為什麼要延長一個 DLC 工廠的生命呢?

此外,如果一個見證可能提早釋放 —— 例如某個體育賽事被取消了 —— 那麼 DLC 工廠的承諾交易可能會意外失效。在這種情況下,為承諾交易輸出的懲罰路徑加入一個絕對時間鎖要求是有用的,如果見證在雙方預期時間的很久以前就發佈,雙方就可以承諾和結算一個 DLC。當然,這種形式的合約對於持續、不斷刷新且見證來源可預測的事件有很好的效果,比如金融資產的價格數據。

結算交易

你可能會疑惑:為什麼要設置結算交易?

設想一種 不設 結算交易的 DLC 工廠,這些 CET 是直接花費承諾交易的輸出的。在這種情況下,任何承諾交易都無法發佈。

在斷言機的見證還沒公佈之前,CET 就無法使用。然而,一旦斷言機見證公佈,懲罰路徑也隨之打開!最好的結果是雙方將開展一場手續費賽跑,比拼誰能先花費承諾交易的輸出。

我們需要一個分段發佈的交易來鎖定 DLC。這就是結算交易的目的。

注意:如果我們以稍微不同的方式設計懲罰機制,讓 後續的 DLC 見證(或其預期發佈時間)來結算懲罰分支,結算交易是 可以 省去的。這樣一來,花費承諾交易的 CET 就可以在懲罰分支可用 之前 啟用。這是好設計嗎?就看你的應用場景了。

與 DLC 通道比較

“DLC 工廠” 可能聽起來在原理上跟 “DLC 通道” 類似:兩者都讓參與者能夠創建許多 DLC,並在鏈下合作式更新或結算它們。然而,兩者在時間鎖和承諾機制的用法上有根本的區別。這些區別使得 DLC 工廠在特定用法中更優秀,雖然 DLC 通道在另一些場景更好。

關鍵區別存在於撤銷舊狀態的方式。

在 DLC 通道中,承諾交易必須由合約持有者 手動 撤銷,具體做法是向對手方交出一個撤銷秘密值。如果一箇舊的承諾交易 沒有 被手動作廢,那它就永遠有效,而且可以隨時發佈,從而在鏈上鎖定一個具體的 DLC。

而在 DLC 工廠,承諾交易一般會 自動 撤銷,通過斷言機的見證 以及/或者 一個絕對時間鎖。因此,DLC 工廠的承諾交易自身就有一個無法避免的天然撤銷日期,而且沒有任何一方可以阻止撤銷發生。

DLC 工廠DLC 通道
承諾交易撤銷見證 以及/或者 時間鎖(自動的)秘密值釋放(手動的)
定時炸彈會形成死鎖,除非關閉合約或者更新沒有;如不關閉或撤銷,合約永久有效
可以預先簽訂許多 DLC 嗎?可以不能
單方提前結束可以不能
任意協商可選可以
最適合場景:永續的可中斷合約可更新的固定期限合約

使用 DLC 通道時,你會建立通道、簽訂一個 DLC,然後你會得到一個單方退出選擇,但 只針對 這個 DLC。即使你有意嘗試預先簽名許多在後續日期到期的 DLC,你也需要自己的通道對手在這些 DLC 到期後主動撤銷它們 —— 否則你的對手可以發佈一箇舊的承諾交易然後欺詐你。你將不得不提早回到鏈上,以消除這種可能性。

相比之下,在 DLC 工廠中,你的對手的承諾交易會自動被斷言機的見證撤銷,或者被無可阻止滴答作響的時間鎖撤銷,無論 TA 是否合作。這意味著,你和你的對手都無需關心另一方在線與否。你們都可以開心地預先簽名任意數量在未來到期的 DLC,並且知道它們都會在預先達成一致意見的時間點撤銷(因為承諾交易存在撤銷路徑)。

兩者的區別可以總結為一個警句:好的工廠自動運行,但通道只能手動改變

另一個角度是:DLC 工廠非常像 DLC 通道,只是撤銷秘密值是由斷言機在無意中獨立分發的。這一微笑的設計抉擇給了 DLC 工廠非常不同的優點和缺點。

結論

此前我已經寫過許多關於 DLC 的文章,你應該也看出了我有多麼喜歡這個東西。DLC 是創建比特幣智能合約的最靈活方式之一,而且它可以用來模擬許多傳統的金融工具,並創造一些前所未有的工具。

如果你有使用 DLC 工廠來開發的想法,或者有優化這個概念的建議,請讓我知曉

(完)

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