原文地址:https://world.mirror.xyz/fL3IMnsOPMqQ_Td1pPEd_kYYNdWu0NW7aBDb_CwfarA
翻譯:Justin @captainz
作為虛擬世界的創造者,我們的目標是創建出能讓用戶感到有趣並深度參與的環境。這就需要我們在設計允許複雜和不預期行為浮現的數字物理學,與確保現有基礎設施能夠支撐這些行為之間找到平衡。為此,我們需要考慮數字物理學的三個主要維度:時間,它的法則形式,以及這些法則適用的範圍。
時間
我們將虛擬世界中時間的流逝稱為世界法則對其自身的迭代應用。每個離散的應用就是這個世界時間流中的一個“瞬間”。設計世界內的時間的一種方式是讓它與外部時間連續進行。在基於區塊鏈的虛擬世界中,每個區塊對應世界內過去的一定數量的瞬間,無論該區塊包含的是什麼交易。這被稱為同步時間,或者“滴答”現象。這種方法可以使世界對用戶更有趣,因為它們可以實時看到自己行為的結果。另外,它導致世界內的時間更長,世界持續更新,從而促進有趣行為的出現。
然而,這種方法也有其缺點。更大的時間範圍通常需要更多的計算資源,這可能會很快超過鍊或服務器的能力。在普通區塊鏈上實施這個系統也可能很困難,因為所有鏈上的變化都必須由外部用戶發起的交易來啟動。
當你想像一些看似簡單的事情時,這個困難就變得明顯了:一個鏈上的遊戲有非玩家角色(NPC)。在主網以太坊上,你可以定義一個更新功能,設置遊戲地圖上每個NPC的位置,並讓一個外部賬戶定期調用它來更新他們的位置。但這可能不可靠,因為你不能保證外部賬戶在應該調用更新的區塊中不會因為gas fee 被競價超過。你的遊戲中的時間結構會因此發生漂移(以原始CryptoKitties的giveBirth()功能為例;隨著鏈上gas fee 的增加,Axiom Zen實際上不得不增加調用giveBirth功能的獎勵,以確保新的NFT出生交易在用戶繁育Kitty後的256個區塊被調用)。我們將這種使用外部賬戶的方法稱為“手動滴答”。
定制的rollups 讓我們有更多的靈活性,在鏈上添加”滴答”功能,無需外部賬戶,而且同步時間的推進由協議保證。我們將這種方法稱為”自動滴答”。自動滴答可以通過編寫一個“滴答合約”來實現,該合約由協議本身調用,而不是由外部賬戶調用。
舉個例子,@therealbytes 開發了一個基於OP Stack的概念驗證型滴答鏈,它運行了一個自動滴答的康威生命遊戲實現(你可以在這裡找到這個視頻演示)。 Bytes 使用了一個修改過的系統交易來自動調用滴答式元胞自動機模擬合約。為了充分測試鏈本身的極限,他用兩種方式實現了遊戲:一種是作為一個在鏈上運行的Solidity智能合約,另一種是作為鏈本身的預編譯。 Solidity實現在達到每個區塊兩次更新的70×70網格後讓CPU達到極限(1個區塊/秒,或者大約10k個細胞/秒),而自定義預編譯引擎的鏈在使用大約6%的CPU(大約130k個細胞/秒)時,達到了相同速率的256×256網格。
在最後一段的最後一句中,關鍵詞是“達到極限”。滴答鏈添加了額外的複雜性層次:每增加一個區塊,就需要由模擬遊戲的交易觸及更多的狀態。最終,rollup 節點會被原始計算(CPU,磁盤IO等)所限制。這裡的唯一解決方案是採用更高容量的節點。
“同步時間”的替代方案是“異步時間”。在這個方案下,世界中時間的流逝並不一定會在外部時間推進時前進。相反,時間通常會在某些事件(通常是用戶行為)發生時向前移動。傳統的不涉及計時器的棋盤遊戲就屬於類似的範疇。在鏈上實現非同步時間更容易,因為它就是區塊鏈被設計來支持的模型。然而,它也犧牲了一些可能使世界更有趣的特性(如自動移動的NPC)。
@notdavidhuang 和cha0sg0d 的一款概念驗證遊戲早期版本WildWood,就揭示了這種犧牲。在這個遊戲中,兩個玩家必須從侵略性NPC的圍攻中保衛他們的基地。在遊戲的早期版本中,NPC的移動只有在玩家自己移動時才會被觸發— 這是一種不太現實的異步時間實現。在添加滴答之後,NPC移動了,但另一個問題仍然存在。鏈每秒滴答一次,這意味著如果玩家每秒移動多於一次,遊戲必須使用optimistic rollup 的更新來廣播玩家在地圖上的位置。然而,你的隊友不會自動看到你的客戶端,這意味著在玩家位置更新上會有延遲。為了克服這個問題,團隊利用了MUD 的中繼服務,一個用於向全鏈廣播本地客戶端的點對點網絡。瞧,異步時間到同步時間的轉變就實現了。
封閉和開放形式的法則
世界構建者還必須決定他們的虛擬世界遵循開放形式的表達還是封閉形式的表達。封閉形式的表達具有固定數量的操作。然而,開放形式(或遞歸)表達的操作數量則根據給定變量的增長。在開放形式的表達下,只能通過反复應用世界的法則到已知狀態,才能計算出世界的未來狀態。複雜、生動的環境,比如《矮人要塞》,通常屬於這個範疇。另一方面,封閉形式的表達允許從過去的狀態和它們之間流逝的時間,計算出任何未來的狀態(假設沒有未來的用戶行動改變狀態),比如《帝國時代II》中的資源開採速率。
開放形式可以使虛擬世界更有趣,因為像現實世界一樣,它們是不可預測的。預測世界未來狀態需要越來越多的時間和計算資源(在鏈上實現的康威生命遊戲就是一個很好的例子:你不能計算出未來的任意狀態,因為你需要按時間運行遊戲)。此外,從簡單的微觀交互中可以出現意想不到的宏觀行為。在由封閉形式管理的世界中,這些出現的行為通常只在外部發生,通過用戶的行動(他們自己就像開放形式一樣),而不是在世界物理本身中發生。
開放和封閉形式之間的權衡涉及到一個與時間相似的平衡。封閉形式可能會降低世界的潛在趣味性,但它們也使其更具計算效率。封閉形式可以與同步或異步時間一起使用。在區塊鏈上實現時,他們在時間同步時對開放形式有顯著的優勢。因為任何長度的時間的成本是恆定的,所以世界可以被設計為只在用戶發送交易時更新鏈上狀態,但它被設置為在上次更新後的時間流逝後的狀態。
時間和形態的範圍
考慮一下當前鏈上動態的標準方法,一個被稱為“懶更新”的方法。在懶更新(lazy update)中,玩家啟動行動的開始和結束,但中間的時間是模擬的,而不是直接計算的。比如,一個玩家在第1個區塊時種下一棵蘋果樹,然後在第10個區塊時收穫蘋果。可以編寫懶更新邏輯,使得玩家每個時間單位可以收穫一個蘋果,總共9個蘋果。對於有封閉形式函數(如每個區塊一個蘋果)的更新邏輯,這是完全可以的,但如果農業邏輯基於玩家行動之間的輸入而變化,這種方法就會失效。如果在第5個區塊,一場暴雨增加了蘋果的生長速度,而在第7個區塊,蝗蟲災害幾乎摧毀了作物,那麼在第10個區塊時,玩家能收穫多少蘋果就無法有效計算,除非真正應用所有已經發生的事件(你不會有足夠的計算能力去趕上新的狀態)。儘管如此,懶更新仍然對於某些生物(如固定生長速度的植物)的廉價計算非常有用,但對於一個動態世界的完整工具箱來說,這仍然不足。
在現實世界中,時間無處不在,一次性流逝,宇宙可能是無限的(雖然有一些相對論的複雜性)。然而,在虛擬世界裡,情況並非必然如此。
首先,虛擬世界可能是明顯有限的。有趣的可能性通常隨著大小的增加而增加——由二百億個星系組成的世界發生的事情比由兩個原子組成的世界更多——但計算成本也會增加。這兩種關係都與之前提到的兩個權衡密切相關:時間的流逝和物理形態。
其次,時間並不必須在虛擬世界的所有地方流逝。世界可以被劃分為時間流逝不同的離散區域,以減少世界的計算負擔。例如,可以在有用戶活動的地區使用更複雜和昂貴的物理規則,而在沒有活動的地方使用更簡單的物理規則。這種方法的缺點是雙重的:它可能使世界顯得不一致,缺乏完整性,這限制了世界規則的設計空間,也給世界建造者帶來了壓力,要避免讓用戶感到困惑;同時,它也限制了因果關係在世界內部的傳播,如果一個區域的行為不能在遠方的區域產生後果,那麼兩者之間的空間就被凍結在時間中。物理規則應用的區域大小是一個重要的設計考慮因素,它將影響世界需要的資源以及它能達到的趣味性水平。
為了創建一個有趣而吸引人的虛擬世界,有必要仔細平衡計算效率和有趣性。這包括決定使用何種類型的時間(同步或異步)並評估統治世界的物理法則的形態。物理法則應用的區域大小是另一個重要的決策。通過謹慎地做出這些選擇,世界建造者不僅可以在保持世界的計算負擔管理得到有趣性,他們還可以為其他開發人員提供一個高度肥沃的創新基礎。