深入Monad:重新定義交易速度的EVM創(chuàng)新
交易可擴展性一直是業(yè)內(nèi)討論的熱點話題。過去幾周,我們一直在探討 Monad 如何幫助提升交易處理速度 (TPS)。本文詳細(xì)解釋了 Monad 的運作原理。
TPS 是我們一直關(guān)注的衡量標(biāo)準(zhǔn)。我們希望區(qū)塊鏈能夠支持更高的 TPS,從而容納更多用戶和應(yīng)用程序。下圖顯示了以太坊和 L2 的 TPS 數(shù)字。目前為止,沒有一條鏈突破過 100 TPS 的大關(guān)。需要注意的是,TPS 是一個用于衡量可擴展性的通用術(shù)語。由于并非所有交易都一樣復(fù)雜,因此單純的 TPS 數(shù)據(jù)并不夠準(zhǔn)確。但為了方便起見,我們?nèi)詫?TPS 視為衡量可擴展性的指標(biāo)。
提高 TPS 的方法有哪些?
一種方法是像 Solana 一樣,從頭開始構(gòu)建一個全新的系統(tǒng)。Solana 犧牲了與 EVM 的兼容性來換取速度。它使用多線程執(zhí)行而不是單線程執(zhí)行(可以類比多核 CPU 和單核 CPU),并行處理交易,并使用不同的共識機制。
第二種方法是使用鏈下執(zhí)行并使用中心化排序器來擴展以太坊。
第三種方法是將 EVM 分解成單獨的組件并進(jìn)行優(yōu)化以提高可擴展性。
Monad 是一個新近籌集了 2.25 億美元的 EVM 兼容 L1 區(qū)塊鏈,它選擇從頭開始構(gòu)建 EVM 而不是直接使用現(xiàn)有版本。Monad 采用了第三種方法來提高可擴展性。
下面我們將討論 Monad 引入的一些重大改變。
并行執(zhí)行
以太坊虛擬機 (EVM) 串行執(zhí)行交易。在上一個交易執(zhí)行完成之前,下一個交易必須等待??梢耘e個例子:想象一個摩托車組裝倉庫的平臺。多輛卡車運來摩托車零件(每輛卡車都裝有制造 50 輛摩托車所需的所有零件)。裝配倉庫有四個不同的功能,每個功能都由專門的團隊負(fù)責(zé) - 卸載、分類、組裝和裝載。
在當(dāng)前的 EVM 設(shè)置中,只有一個平臺,同一個地點用于裝卸貨物。因此,當(dāng)卡車停下來時,摩托車零件會在同一個卡車上卸載、分類、組裝和裝載。當(dāng)分類團隊工作時,其他團隊都在等待。因此,如果把他們的工作視為不同的插槽,那么每個團隊每四個插槽中只會工作一次。這導(dǎo)致了嚴(yán)重的效率低下,凸顯了需要一種更加簡化的方式。
現(xiàn)在想象有四個擁有獨立裝卸區(qū)域的平臺。即使卸載團隊一次只能處理一輛卡車,他們也不必等待接下來的三個插槽才能進(jìn)行工作。他們可以直接移到下一輛卡車旁開始工作。
分類、組裝和裝載團隊也是如此。當(dāng)卡車完成卸載后,它會駛向裝載區(qū),等待裝載團隊裝載組裝好的摩托車。因此,只有一個平臺和裝卸區(qū)域的倉庫會按順序執(zhí)行所有操作,而擁有 4 個平臺和不同裝卸區(qū)域的倉庫則可以并行處理任務(wù)。
可以將 Monad 視為擁有多個卡車平臺的倉庫基礎(chǔ)設(shè)施,但它比這個例子復(fù)雜得多。當(dāng)卡車之間存在依賴關(guān)系時,復(fù)雜性就會增加。例如,如果一輛卡車上沒有制造 50 輛摩托車所需的所有零件怎么辦?交易并不總是獨立的。因此,當(dāng) Monad 并行執(zhí)行它們時,它必須處理相互依賴的交易。
如何做到這一點?它執(zhí)行一種稱為樂觀并行執(zhí)行的操作。該協(xié)議只能并行執(zhí)行獨立的交易。例如,考慮 4 筆交易,其中喬爾 (Joel) 的余額為 1 ETH:
喬爾向薩烏拉夫 (Saurabh) 發(fā)送 0.2 ETH。
西德 (Sid) 鑄造一個 NFT。
喬爾向西德發(fā)送 0.1 ETH。
什洛克 (Shlok) 購買 PEPE。
所有這些交易都并行執(zhí)行,具有掛起的待確認(rèn)結(jié)果,這些結(jié)果將逐個提交。如果待處理的結(jié)果輸出與任何交易的原始輸入沖突,則會重新執(zhí)行交易。交易 2 和 4 彼此獨立,因此它們的待處理結(jié)果不會與其他交易的輸入沖突。但 1 和 4 不是獨立的。
請注意,由于所有 4 筆交易都從相同的初始狀態(tài)(喬爾余額為 1 ETH)開始,因此這里關(guān)注的是喬爾的余額。發(fā)送 0.2 ETH 后喬爾的余額變?yōu)?0.8 ETH。在向西德發(fā)送 0.1 ETH 后,他的余額變?yōu)?0.9 ETH。結(jié)果逐個提交,確保輸出不會與任何輸入沖突。在 1 的待處理結(jié)果提交后,喬爾的新余額變?yōu)?0.8 ETH。
這個輸出與 3 的輸入沖突。因此,現(xiàn)在用 0.8 ETH 的輸入重新執(zhí)行 3。執(zhí)行完 3 之后,喬爾的余額變?yōu)?0.7 ETH。
MonadDb
至此,一個明顯的問題是,我們?nèi)绾沃啦槐刂匦聢?zhí)行大部分交易?答案在于重新執(zhí)行并不是瓶頸。瓶頸在于訪問以太坊的內(nèi)存。事實證明,以太坊在數(shù)據(jù)庫中存儲其狀態(tài)的方式使得訪問狀態(tài)變得困難(耗時且昂貴)。這就是 Monad 另一項改進(jìn)發(fā)揮作用的地方 - MonadDb。Monad 以一種減少讀取操作相關(guān)開銷的方式構(gòu)建了其數(shù)據(jù)庫。
當(dāng)一個交易需要重新執(zhí)行時,所有輸入都已經(jīng)緩存在緩存內(nèi)存中,與訪問整體狀態(tài)相比,緩存內(nèi)存的訪問速度要快得多。
Solana 在測試網(wǎng)上擁有 5 萬 TPS,但在主網(wǎng)上只有約 1 千 TPS。Monad 聲稱在其內(nèi)部測試網(wǎng)上實現(xiàn)了 1 萬個實際 TPS。盡管這并不總是代表實際性能,但我們迫不及待地想看看 Monad 在實際應(yīng)用中的表現(xiàn)。