原標題:我如何學會停止擔心並愛上執行分片
視頻鏈接:https://www.youtube.com/watch?v=A0OXif6r-Qk
講師:Scott Sunarto (@smsunarto) 在研究日
文章編輯:Justin Zhao (@hiCaptainZ)
大家好,我的名字是 Scott (@smsunarto),是 Augus Labs (@ArgusLabs_) 的創始人。今天,我將討論一個我們已經有一段時間沒有觸及的主題。隨著滾動聚合的興起,我們不常談論執行分片,與數據分片相比。因此,讓我們重新探討這個有些被忽視的執行分片主題。
這將是一個輕鬆的演講。我知道大家整天都在聽複雜的概念,所以我會盡量保持實用。我為這次演講準備了一個合適的幻燈片設計。
對於那些不認識我的人,一個有趣的事實是我在 Twitter 上被稱為動漫女孩。我還錯過了我的大學畢業典禮來到這裡,這讓我的父母非常不高興。目前,我是 Argus Labs 的創始人。我們自認為是一家遊戲公司,而不是基礎設施或加密公司。我最大的抱怨之一是,所有的加密遊戲都想建立工具,但沒有人想創建內容或應用程序。我們需要更多用戶實際可以使用的應用程序。
之前,我與我的優秀朋友 Brian Gu (@gubsheep) 和 Alan Luo (@alanluo_0) 共同創建了 Dark Forest (@darkforest_eth)。Brian 現在在運營 0xPARC (@0xPARC),他比我聰明得多。
今天的演講將專注於執行分片,但在一個對大多數關於執行分片的討論來說不熟悉的背景下。我們通常在一層的背景下討論執行分片,比如以太坊分片或 Near 分片。但今天,我想稍微改變一下背景。讓我們想想在滾動聚合環境中,分片會是什麼樣子。
這裡的根本問題是,為什麼一家遊戲公司要架構自己的滾動聚合,以及我們可以從《魔獸世界》中學到什麼來設計滾動聚合。此外,我們還將探討滾動聚合的設計空間如何超越當前的現實。
為了回答這些問題,讓我們回到 2020 年,當時 Dark Forest 的想法首次被提出。我們問自己,如果我們創建一個每個遊戲行動都是鏈上交易的遊戲會怎樣?當時這是一個荒謬的前提,對於許多人來說至今仍然如此。但這是一個有趣的假設,所以我們建造了它,Dark Forest 應運而生。
Dark Forest 是一個完全鏈上的太空探索 MMORTS 遊戲,運行在以太坊上,使用 ZK-Snarks 技術。回到 2020 年,ZK 並不像今天那樣流行,因為文檔幾乎不存在。Circom 唯一可用的文檔是 Jordi Baylina (@jbaylina) 的 Google Docs。儘管面臨挑戰,我們從過程中學到了很多,Dark Forest 就是這種學習的具現化。
Dark Forest 是一個超出我們預期的實驗。我們擁有超過 10,000 名玩家,消耗了數萬億的燃氣,並且在遊戲中發生了大量的混亂,玩家們在鏈上互相背叛。Dark Forest 和鏈上遊戲最迷人的地方在於平台化的本質。通過擁有一個鏈上遊戲,你為突現行為的設計空間打開了大門,並允許人們構建與遊戲互動的智能合約,以及替代客戶端和遊戲模式,例如 Dark Forest Arena 和 GPU 礦工。
然而,強大的力量伴隨著巨大的責任。當我們在 xDai 上推出 Dark Forest 時,現在被稱為 Gnosis Chain,我們最終填滿了整個鏈的區塊空間。這使得該鏈幾乎無法用於其他任何事情,包括 DeFi、NFT 或任何其他 xDAI 的東西。
那麼,現在該怎麼辦?我們是否到了死胡同?鏈上遊戲是否永遠無法成為現實?還是我們回到只在鏈上放置 JPEG 的遊戲,並說服人們錢是從樹上長出來的?答案是,我們讓軟件做事情。我們中的許多人以非常僵化的方式思考區塊鏈和滾動聚合,似乎沒有太多改進的空間。但我不同意。我們可以實驗並發現新的可能性。
我們問自己這個問題:如果我們要從零開始設計一個專門用於遊戲的區塊鏈,它會是什麼樣子?我們需要高吞吐量,因此需要同時擴展讀取和寫入。大多數區塊鏈都是為了進行大量寫入而設計的。每秒交易數是人們所宣傳的指標,但現實是,讀取同樣重要。如果你無法從區塊鏈節點讀取,你怎麼知道你的位置在哪裡?這實際上是我們在區塊鏈構建中發現的第一個瓶頸。
Dark Forest 遇到了一個問題,因為我們需要從鏈上狀態讀取數據,導致完整節點被大量使用,I/O 爆炸。這導致了數千美元的伺服器成本,xDAI 團隊慷慨地為我們支付了這些費用。然而,這對於長期來說並不理想。我們需要高吞吐量,不僅是每秒的寫入交易,還包括從區塊鏈本身獲取數據的讀取。
我們還需要一個橫向可擴展的區塊鏈,以避免噪音鄰居問題。我們不希望一個受歡迎的遊戲突然在一個區塊鏈上崩潰,並阻止其他所有事情的運行。我們還需要靈活性和可定制性,以便我們可以修改狀態機,使其專門設計用於遊戲。這包括擁有遊戲循環,使其自我執行,等等。
最後但同樣重要的是,對於不熟悉在線遊戲架構的人來說,這可能有些模糊,我們需要高 tick 率。Ticks 是遊戲世界中的原子時間單位。在區塊鏈上下文中,我們有區塊作為原子時間單位。在遊戲中,我們有 ticks。這在構建完全鏈上遊戲時幾乎是類似的,區塊鏈的 tick 速度或區塊生成速度等於遊戲本身的 tick。
如果你有更高的 tick 或每秒更多的區塊,遊戲會感覺更靈敏。相反,如果你有較低的 tick,遊戲會感覺更遲鈍。需要記住的一個關鍵點是,如果區塊生成延遲,你會在遊戲中視覺上感受到延遲。這是一個糟糕的體驗。如果你曾經處理過一個因為輸掉比賽而對著電腦大喊的憤怒玩家,那真的是一個非常糟糕的情況。
目前,我們的滾動聚合每秒一個區塊,這等於一個 tick 率。如果我們想要更酷的遊戲,我們需要更高的 tick 率。例如,Minecraft 這個簡單的像素藝術遊戲每秒有 26 個 ticks。我們還有很長的路要走,才能建立像 Minecraft 那樣靈敏的遊戲。
一個可能的解決方案是部署我們自己的滾動聚合。雖然這似乎在表面上解決了問題,但實際上並沒有解決問題的根本原因。例如,你會有更高的寫入吞吐量,但並不完全達到遊戲所需的水平。當然,如果你的遊戲有一百名玩家,那就足夠了。但如果你想建立需要更高吞吐量的遊戲,因為當前構建中的 I/O 方式,有非常嚴格的限制。
在讀取方面,你並不會真正獲得性能提升。你仍然需要依賴索引器。你並不真正具備橫向擴展性。如果你試圖啟動一個新的滾動聚合來橫向擴展你的遊戲,你會使現有的智能合約生態系統碎片化。玩家部署的市場將無法與你為橫向擴展遊戲而啟動的其他鏈協同工作。這會帶來很多問題。
最後,高 tick 率和每秒區塊數根本不是一回事。我們可以盡力推進。我們可能會達到每秒兩個區塊,也許三個,但這真的是這些區塊鏈能達到的極限,因為有很多開銷,比如重新編組等,這對計算週期非常耗費。
為了解決這個問題,我們回顧 2000 年代初和 1990 年代末,當時在線遊戲如 MMO 剛剛興起。他們有分片的概念。這不是一個新概念;它在過去就已經存在。我們在數據庫架構中使用的 “分片” 一詞實際上來自於《Ultima Online》的參考。他們是第一個使用 “分片” 這個術語來解釋他們不同伺服器的遊戲。
那麼,分片在遊戲中是如何運作的?這不是一個通用的解決方案。這是一個工具箱中的工具,如何將其融入你的遊戲因上下文而異。例如,第一種分片結構是我喜歡稱之為基於位置的分片。思考它的一個好心理模型是想像一個被分成四個象限的笛卡爾圖,每個象限都有自己的遊戲分片。每當你想跨越一個分片時,你會向另一個分片發送通信,說:“嘿,我想移動到那裡,” 然後你會被傳送到你的分片,留下你之前的玩家身體。通過這樣做,你將伺服器的工作負載分配到多個物理實例,而不是強迫單個伺服器為整個遊戲世界進行所有計算。
第二種結構在當今更受歡迎。它被稱為多元宇宙分片,你有多個彼此鏡像的遊戲實例。你可以選擇任何你想去的分片,並且它是默認負載均衡的,這樣每個伺服器不會變得過於擁擠。
現在,關鍵問題是如何將這一概念帶入滾動聚合?這就是我們創建世界引擎的原因。世界引擎是我們的旗艦基礎設施,基本上是一個專門為啟動而設計的分片序列器。與我們在過去幾次演講中看到的許多分片序列器設計相比,我們的設計不同,更適合我們的需求。我們優化的目標是:A,吞吐量,B,我們希望確保沒有鎖定阻塞運行時,以確保 tick 率和區塊時間盡可能高效,因此它默認是同步的,我們設計序列器的方式是部分排序,而不是強制總排序,這樣每個交易需要在其他交易之後發生。
這裡的關鍵組件是我們有兩個主要的東西。我們有基於 EVM 的分片,這就像一個純 EVM 鏈,玩家可以部署智能合約來與遊戲組合,創建帶有稅收的市場等等。這將像一個正常的鏈,對吧?每秒一個區塊或每秒一個事物,剛好足夠你做所有典型的設備和市場的事情。
這裡的秘密成分是我們使用遊戲分片,這基本上是一個設計為高性能遊戲伺服器的迷你區塊鏈。我們有一個自帶實現的接口,這樣你可以根據自己的喜好自定義這個分片。你可以構建自己的分片並注入到基礎分片中。你只需要實現一組標準接口,就像如果你熟悉 Cosmos,Cosmos 有一個 ABC 接口。你基本上可以將其符合類似的規範,將自己的分片帶入世界引擎堆棧。
這裡的關鍵是我們擁有一個目前無法通過當前分片構建實現的高 tick 率。這是我想介紹 Cardinal 的地方。Cardinal 是世界引擎的第一個遊戲分片實現。它使用實體 - 組件 - 系統,具有數據導向架構。這使我們能夠對遊戲進行並行化,並為遊戲計算提供更高的吞吐量。它具有高達每秒 20 個 ticks 的可配置 tick 率。對於這裡的區塊鏈人來說,這是每秒 20 個區塊。
我們還可以進行地理定位以減少延遲。現在,你有可能位於美國的序列器,而亞洲的人們必須等待約 300 毫秒的延遲,才能讓該交易到達序列器。這在遊戲中是一個巨大的問題,因為 300 毫秒是一段很長的時間。如果你嘗試在延遲 200 毫秒的情況下玩 FPS 遊戲,基本上是永遠的,你已經死了。
對我們來說,另一個重要的關鍵是它是自我索引的。我們不再需要外部索引器。我們不需要這些框架來緩存遊戲內狀態。這也使我們能夠構建更多實時的遊戲,因為索引器仍在試圖追趕序列器區塊。
我們還有一個插件系統,允許人們並行化 ZK 驗證等等。對我來說,最好的部分是你可以用 Go 編寫代碼。不再需要與 Solidity 掙扎,試圖讓你的遊戲運行。如果你曾經試圖用 Solidity 構建區塊鏈遊戲,那真是一場噩夢。
但是,是的,我們的分片構建的關鍵是你可以將任何東西構建為分片。它們基本上是一個無限的設計空間,關於分片可以是什麼。
假設你不喜歡用 GO 編寫遊戲代碼,你可以選擇退出,但我們正在開發一個 Solidity 遊戲分片,允許你用 Solidity 編寫遊戲實現,同時保留 Cardinal 的許多優勢。你還可以創建一個 NFT 鑄造分片,具有獨特的內存池和一個排序結構,解決基本鑄造噪音鄰居問題。你甚至可以擁有一個遊戲身份分片,你可以使用 NFT 來表示你的遊戲身份,允許你輕鬆地使用 NFT 交易你的遊戲身份,而不必給出你的私鑰,這是不建議的。
這是一個高層次的構建,我不會因為時間限制而深入探討。這裡的關鍵是,我們允許 EVM 智能合約通過使用自定義選擇和傳遞與遊戲分片組合。我們在 Geth 周圍創建了一個包裝器,以允許它們之間的通信。這在雙向上打開了很多設計空間。我們默認是同步的,並且在分片之間具有無鎖的無縫可組合互操作性。
我們的共享序列器不同之處在於,它不使用共享序列構建,優先考慮總排序的原子包,這需要鎖定機制,並導致主線程被阻塞等問題,導致不可靠的 tick 率和區塊時間,從而導致遊戲延遲。它還對每個分片的區塊時間施加限制,並需要各種加密經濟學和構建來防止拒絕服務。還有一個大象在房間裡,我沒有看到很多 VCR 序列器構建提到:如果你有不同的分片相互依賴並導致死鎖,如何解決死鎖?使用異步設計,這些都不是問題,因為每個人都在做他們想做的事情,並且發射和忘記。
現實是,跨分片和滾動聚合的原子包通常不是必需的。對於我們的用例,我們不需要任何需要原子包的東西,我們認為這不是我們應該圍繞用例純度來設計滾動聚合的東西。這還導致許多其他有趣的特性。例如,每個遊戲分片可以為基礎鏈擁有一個單獨的 DA 層。例如,你可以使用基礎分片將數據推送到以太坊,而遊戲分片可以像數據可用性委員會一樣將數據推送到 Celestia。你還可以減少運行完整節點的硬件要求,因為你可以單獨運行基礎分片 Geth 完整節點,而不必運行遊戲分片節點,這使得你更容易與 Alchemy 等事物集成。
總結一下,我想在這裡保持知識上的誠實。很多人想聲稱他們的構建解決了所有生活中的問題,但對我們來說並非如此。我們認為我們的構建對我們有用,但也許對你的用例並不適用。假設我們的構建適用於每個人的用例是不現實的。它符合我們的需求,給我們高吞吐量、橫向擴展性、靈活性和高 tick 率,但它並不能治癒癌症。如果你需要一個需要同步可組合性的 DeFi 協議,那麼這個構建可能不適合你。
總之,我真的相信以人為本的區塊鏈架構的概念。通過圍繞特定用戶角色和用例進行設計,你可以更好地導航權衡空間,而不是試圖解決每個人的問題。文藝復興的時代已經來臨,每個人都可以設計自己的滾動聚合以滿足他們的特定需求,而不是依賴於通用解決方案。我相信我們應該擁抱寒武紀大爆發。不要像一個通用的第一層那樣構建滾動聚合,因為它根本不是為了解決相同的問題而設計的。我個人期待看到更多人探索更多針對特定用例或行業的滾動聚合設計空間。例如,專門為資產交換設計的滾動聚合會是什麼樣子?它會是基於意圖的嗎?專門為鏈上 CLOB 設計的滾動聚合會是什麼樣子?說完這些,我將把麥克風交回 MJ。謝謝你們的接待。