排序器是鍾錶匠巧奪天工之作,它設置 Rollup 的歷史記錄,然後看著它滴答滴答地走到命定的狀態。
原文:The Definitive Guide to Sequencing(substack)
編譯:0x11,Foresight News
封面: Rollup
共用排序器正在飛速發展,是時候對它是什麼及其存在的原因進行深入分析了。 這篇文章分析的物件僅限於 Optimistic Rollup,歡迎 ZK 關注者前來指教。
排序器是什麼?
排序器是 Optimistic Rollup 中的半信任化角色。 雖然交易可以由主鏈本身進行排序,但這並不經濟,用戶必須單獨提交其 Rollup 交易對應的主鏈交易,並支付主鏈上費用。 排序器通過允許 Rollup 交易共用單個主鏈交易來為使用者解決這些問題。
排序器聚合鏈下的多筆使用者交易來補充主鏈的排序,並將它們作為單個交易集合提交到主鏈,交易成本在用戶間分攤。 排序器還可以壓縮交易集合,進一步節省主鏈數據可用性成本。 與依賴 排序器的使用者相比,自主排序的使用者將為包含在 Rollup 中的交易支付更多費用。
但是,排序器可以對交易集合中的交易排序進行控制。 它可以選擇不包含使用者交易,從而迫使使用者自行排序,支付更高的主鏈成本。 它還可以通過重新排序和插入提取的方法在交易集合中提取 MEV。 它們實際上擁有對 Rollup 的優先寫入許可權。 值得注意的是,因為排序器可以與合約交互,所以只有絕對可靠的交易才能通過鏈上機制可靠地強制執行,不可靠的交易在強制排序時很可能會失敗。
這使得排序器成為 Rollup 使用者的半信任方。 雖然排序器無法阻止使用者訪問 Rollup,但他們可以延遲使用者的訪問,導致使用者承擔額外的費用,並從使用者的交易中提取價值。 通過去中心化進一步約束排序器的行為是一個活躍的研究課題。
排序和執行有什麼區別?
排序器是主鏈排序的補充,它不計算 Rollup 的狀態,實際上它可能會選擇對無效交易進行排序。 Rollup 節點必須解析和清理排序數據,匯出 Rollup 的有效歷史記錄,並執行歷史記錄以生成最新狀態。 排序器則完全不參與此過程。
不過,正如我的朋友 Fred 不斷提醒我的那樣,一旦交易被排序,結果就是確定的。 這意味著所有 Rollup 節點將根據排序器生成的順序達成一致結果。 給定已知歷史,Rollup 有一個正確的狀態。 一旦節點找到這個狀態,一個或多個提議者會將其提交給主鏈的 Rollup 合約。
理論上,任何節點都可以是提議者,不需要任何許可權。 提議者將狀態連同保證金一起提交給主鏈。 如果欺詐證明結果是狀態無效,保證金就會被沒收。 該合約在計時器結束後接受證明,然後其中包含的使用者交易在主鏈上執行。 執行節點通過欺詐遊戲確保提議者誠實,我們傾向於將執行節點稱為「Rollup 全節點」或「驗證者」。
换句话说,一旦排序被提交到主链,状态就变成最终的和不可变的。提议者计算并报告最终状态给 Rollup 合约,以维护 Rollup 到主链的资产桥的利益。提议者不会创造状态,他们只是计算并证明它。Rollup 合约不会创建或最终确定 Rollup,它只是从提议者那里获得 Rollup 状态。
为什么要将排序和提议分离?
这是一个复杂的问题。从根本上说,将它们分开是因为它们本身是分开的。这听起来像是同义反复,但似乎每个人都花了很长时间才意识到这一点。我们蓦然回首,才发现 Rollup 的思想历史多年来一直在 Plasma 和状态通道中曲折发展。在基于比特币的 proto-Rollup 早期,并没有排序器,用户只需将他们的交易发布到主链。之后,这种设计消失多年,最终因为 Barry 的工作重新出现。在 Barry 和 Celestia 之间,Rollup 的研究主要集中在 Rollup 桥与主链的交互上。在 Sovereign Rollup 出现之前,甚至没有人意识到我们其实在构建更好的 Mastercoin。
抛开出处不谈,排序器解决了一个特定的问题:用户交易成本最小化。然而,这个过程中又引入了一个新问题:排序器可以同时对同一交易产生多个排序结果。如果排序完全由主链完成,将会有一个单一的规范排序,但用户交易费用会更昂贵。我们选择使用排序器来改善 Rollup 中的用户体验。
假设存在很多个排序器,因为有多个提议者。排序器们可以提交相互冲突的排序,我们现在需要一种机制来「规范」主链上的特定排序批次。当前的 Rollup 通过一个单一的、特定的、已知的、半可信的排序器来实现这一点。选择单个排序器使我们能够解决这个问题,直到去中心化排序器到来。因为我们想要多个提议者,但只需要一个 排序器,所以必须将这两个角色分开。
数据依赖性是另一个重要的原因:提议者需要排序,但是排序器不需要状态。提议者依赖于排序器工作的输出,但是排序器不依赖于提议者。因为数据依赖是单向的,所以需要在角色之间划定界限,并允许参与者专注于单一角色。
为了回答最初的问题,我们将提议者和排序器分开,因为它们本身是分开的。提议者在排序器的下游工作。Rollup 将信任和权威授予了排序器,而提议者只是一个普通工作人员。
排序器、提议者和验证者现状
Arbitrum 和 Optimism 是两种常见的 ORU 方案。我想简要介绍一下他们中的主要角色,不会涉及到代码,只是规范和文档。Optimism 的讨论将仅限于(尚未部署的)Bedrock 设计。
Arbitrum
除了批處理和壓縮使用者交易外,Arbitrum 排序器還運行一個完整的節點。 交易被直接發送到排序器,它在交易排序時創建一個可信的 WebSocket 提要。 Arbitrum 將此提要作為「軟」確認來源。 排序器對排序結果作出承諾,使用者通常可以依賴該排序。 節點、MEV 搜尋者或其他參與者可以使用此提要來預先計算 Rollup 狀態。
排序器會定期將經過排序的壓縮交易發佈到主鏈。 主鏈最終確定代表 Rollup 的「硬」確認。 一旦主鏈確定了排序,它就成為 Arbitrum 鏈上不可更改的部分,其中排序的所有交易都成為最終狀態,結果狀態也成為最終狀態。
自然地,因為排序器設置交易順序,所以它具有優先寫入許可權。 排序器可以控制排序的內容,從而控制 Rollup 歷史中交易的排序。 當然,用戶可以通過主鏈上的 delayed inbox 強制包含交易。 搜索者已經竭盡全力將 WebSocket 交易提要的延遲降到最低,因此他們很可能會形成一個強大的 MEV 市場來對 Arbitrum 交易進行排序。
有 13 個經過許可的 Arbitrum 提議者,他們中每一個都在名為「RBlock」的特定承諾中託管了 ETH。 用戶可以選擇依賴一定比例的質押來做出關於 Rollup 的最終決定,而無需運行 Rollup 完整節點。 雖然 Arbtirum 驗證者可以識別欺詐,但只有提議者可以通過欺詐證明質疑承諾的有效性。 實際上,只有提議者可以成為完整的驗證者。
正義,就像一個排序器,是盲目的,它必須帶著劍
Optimism
與 Arbitrum 一樣,除了批處理和壓縮使用者交易外,Optimism 排序器也運行一個完整的節點。 交易直接發送到排序器,排序器在排序時創建可信的預確認。 Optimism 使用者可以使用這些確認作為最終軟確認的來源。 排序器對排序作出承諾,使用者通常可以依賴該排序。 節點、MEV 搜尋者或其他參與者可以使用這些確認來預先計算 Rollup 狀態。
排序器會定期將經過排序的壓縮交易發佈到主鏈。 主鏈最終確定代表 Rollup 的「硬」確認。 一旦主鏈確定了序列,它就成為 Optimism 鏈歷史中不可更改的一部分。 其中排序的所有交易都成為最終狀態,結果狀態也成為最終狀態。
自然地,因排序器設置交易順序,所以它具有優先寫入許可權。 排序器可以控制排序的內容,從而控制 Rollup 歷史中交易的排序。 當然,用戶可以通過在主鏈強制包含交易。 作為 MEV 拍賣概念的發起者,一個用於排序 Optimism 交易的強大 MEV 市場似乎將要形成。
Optimism 有 1 個經過許可的提議者。 該提議者簽署了對主鏈的特定承諾,稱為「狀態輸出」或「L2 輸出根」。 使用者在做出關於 Rollup 的最終決定時可以選擇依賴提議者 ,而無需運行 Rollup 全節點。 雖然 Optimism 驗證者可以識別欺詐,但只有一個經過許可的挑戰者可以通過簽名來挑戰承諾的有效性。 挑戰者可以隨時刪除一個 L2 輸出根,無需欺詐證明。 實際上,只有獲得許可的挑戰者才能成為完整的驗證者。
小結
當前兩個主要的 Rollup 都集中在同一種設計上,它可能會變得非常混亂。 他們經常對同一個概念使用不同的名稱,但他們的設計幾乎相同。
共用排序器
在對排序器有了新的理解后,讓我們繼續討論我真正想談的內容:共用排序器。 當 Rollup 共用同一個排序器時會發生什麼?
不同的 Rollup 是什麼意思?
借用 Ben 的定義,我們應該將 Rollup 視為狀態、狀態轉換函數和證明系統。 Rollup 有合約和帳戶,它有一個虛擬機來處理交易以更新這些合約和帳戶,而非主權 Rollup 有一個證明系統來運行與主鏈的橋接。 每個元件有多種設計,它們可以在一定程度上混合搭配。
但是,有些元件比其他元件更平等。 總的來說,我們大概應該把狀態看作是鏈的本質。 鏈不傾向於改變它們的狀態。 畢竟,乙太坊開發者多次更改虛擬機,多次更改共識機制,但只更改過一次狀態。 狀態即是 Rollup,虛擬機和證明系統的存在是為了支援它。 因此,不同的 Rollup 具有不同的狀態。 它們可能共用一個證明系統或一個 STF,但兩個 Rollup 永遠不可能共用相同的狀態。
提取、檢查和過濾
Rollup 從主鏈歷史中獲取它們的狀態。 為了做到這一點,每個 Rollup 都必須定義一個「提取」函數。 提取函數將主鏈歷史分為 Rollup 歷史和 non-Rollup 歷史。 STF 處理 Rollup 歷史以創建 Rollup 狀態。 實際上,提取功能變成了一個「鏡頭」,Rollup 通過它檢查主鏈。
Rollup 使排序器能夠選擇提取函數下一次運行的輸出。 排序器選擇 Rollup 節點下一步將看到和處理的數據,因此對 STF 的操作和下一個狀態有一定的控制。
在排序器創建主鏈數據檢視后,Rollup 節點運行過濾功能。 因為排序器不一定知道它所服務的 Rollup 的狀態,所以允許在其排序中包含無效交易。 提取后,Rollup 節點會看到這些無效交易,並將其刪除。 當給定無效交易時,Rollup 節點不會出錯(就像主鏈那樣),而是簡單地忽略它並繼續。 L1 必須禁止垃圾資訊以保持共識,而 Rollup 則不需要。
共用排序器
共用排序器為兩個或多個 Rollup 的提取函數提供輸入。 因此,它為兩者設置新的歷史記錄,控制 STF 的輸入。 它可以單獨為每個 Rollup 執行此操作,也可以同時為兩者執行此操作。 單獨設置歷史記錄時,它的工作方式與未共用的排序器完全相同。
然而,當同時為兩個 Rollup 創建新的歷史記錄時,共用排序器可以通過原子「連結」兩個 Rollup 的歷史記錄來行使一些額外的權力。 排序器同時為每個 Rollup 產生序列,並確保兩者都確認或都不確認。 這允許排序器對兩條鏈的歷史進行控制,因此對 Rollup 的下一個狀態有一定程度的控制。
原子包含(不是原子執行)
在這一點上,我必須重申,排序器可以對其產生的排序行使很大的自由裁量權。 這意味著雖然使用者可以使用共用排序器在多個 Rollup 上進行交易,而無需與主鏈進行交互,但他們不一定依賴 排序器在這些交易之間產生任何特定的關係。 共用排序器的支援者設想了一種新結構,用戶可以在其中指定包含的原子性,即可以強制排序器通過共用強制排序機制同時對多個 Rollup 中的一組交易進行排序。 這將允許使用者確保所有這些原子交易都包含在 Rollup 歷史中,或者全部不包含。
這並不像看起來那麼好。 因為只有絕對可靠的交易才能強制排序,只有絕對可靠的交易集才能保證在原子包含時原子執行。 正如我們之前所說,包含和執行是分開的。 Rollup 在包含之後和執行之前通過篩檢程式功能過濾掉無效交易。 假設排序器獲取使用者的原子集,並導致一個交易失敗或失效。 該交易將在排序后被過濾,並且不會執行。 這意味著原子包含不足以保證原子執行,除非涉及的所有交易都是絕對可靠的。
具體而言,可以原子執行簡單的發送和取款,但任何容易出錯的東西,如交換或 DeFi 交互,都不能。 不幸的是,大多數高價值交互都包含 1 個或多個容易出錯的交易,因此似乎很難使原子包含發揮作用。 這有效地排除了通過共用排序器進行交叉 Rollup 的 DeFi 可組合性。 共用排序器不是靈丹妙藥,用戶的資產可能被鎖定在異步跨鏈模型中,直到流程結束。
Rollup 組合的原子執行
還記得之前談到的排序器如何在將排序發佈到主鏈之前提供可信的執行保證嗎? 您可以設想一個共用排序器針對多 Rollup 系統做同樣的事情。 共用排序器可以運行每個 Rollup 的完整節點,並使用它們來確定交易是否成功。 然後它可以承諾它不會產生原子交易集不全部成功的排序。
當然,這個系統是值得信任的。 你會相信排序器不會說謊。 您現在可能在想「我們可以通過限制排序器的行為將其轉換為免信任的系統嗎?」我很高興 / 悲傷 / 困惑地說答案是「是的,但是」。 是的,但我們這樣做的方法是組合每個 Rollup 的 STF,以創建一個執行所有組合 Rollup 交易的單個 STF。 也就是說,我們必須使所有 Rollup 之間的所有虛擬機原子化。 這相當於使它們成為相同的 Rollup。 所以是的,我們可以實現不受信任的原子執行,方法是通過將多個 Rollup 合併為一個。 這可能是個好主意 1, 但我懷疑它的可行性。
偶然性關係的原子執行
我在別處寫過這個,另一個可靠的選擇是在交易和 Rollup 狀態之間集成顯式的偶然關係。 這會將評估突發事件的負擔轉移到提議者身上,因為他們必須根據他們對遠端 Rollup 的信任來計算和提議狀態根。 但是,我認為我們可以通過重複應用篩檢程式功能來簡化它。 假設偶然性在某個交易和區塊中是明確的,我們可以運行兩次篩檢程式,一次假設預測的狀態有效,一次假設預測的狀態無效。 這可以擴展到 n 個預測狀態,代價是對篩檢程式函數進行 2^n 次評估.
在這個世界上,提議者可以證明 2^n 個根,每個根都有明確的偶然關係。 例如,提議者可以證明「根是 X 取決於遠端 Rollup 狀態 A,否則是 Y」,而不是說「根是 X」。 這樣,提議者就不會永遠評估遠端 Rollup 區塊。 相反,他們會根據來自其他狀態的假設資訊,多次評估自己的過濾函數和狀態。 這真的很酷,因為它保留了 Rollup 的分離,同時仍然允許複雜的即時交叉 Rollup 通信。
結論
排序器是鍾錶匠巧奪天工之作,它設置 Rollup 歷史記錄,然後看著它滴答滴答地走到它的命定狀態。 Optimism 和 Arbitrum 並無多大差別,但兩者安全性確有不同。 沒有人知道排序器是做什麼的。 共用排序器可以進行原子包含,但不能進行原子執行,如果沒有 Rollup 組合或其他一些執行機制,就無法將原子包含納入原子執行。 所有這些關於共用排序器實現無縫互操作性的吹噓都是垃圾科學。
免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。