什幺是EVM(以太坊虛擬機?

新手Nov 21, 2022
EVM是一種介於代碼與主機之間的虛擬機,是以太坊得以運行的基本保障。今天,就讓我們深入了解下究竟什幺是EVM,EVM的運行原理和典型應用有哪些,借此領略以太坊的魅力。
什幺是EVM(以太坊虛擬機?

前言

EVM是一種介於代碼與主機之間的虛擬機,是以太坊得以運行的基本保障。今天,就讓我們深入了解下究竟什幺是EVM,EVM的運行原理和典型應用有哪些,借此領略以太坊的魅力。
以太坊作為目前最受歡迎的區塊鏈,為用戶提供了多種多樣的去中心化應用。提到Defi、NFT等就不得不提到以太坊。而與以太坊息息相關的EVM,也時常出現在眾人的視野中。那幺EVM之於以太坊,到底是什幺樣的存在呢?

EVM的基本定義

EVM(Ethereum virtual machine ),直觀地講就是以太坊虛擬機。根據以太坊的官方定義,EVM是以太坊賬戶與智能合約在以太坊鏈上的運行環境。

進一步來說,EVM是一個由所有運行著以太坊客戶端的計算機共衕維護的一個實體,並且規定了從一個區塊計算得到下一個有效區塊的規則。
EVM的運行機製

EVM的運行原理

區別於比特幣,以太坊不是一種分布式賬本,而是一種分布式狀態容器。從一個區塊過渡到下一個區塊,意味著狀態的更新,包括賬戶的狀態、鏈上數據的更新。而狀態如何更新,則是由EVM根據合約的代碼計算得到的。

圖:https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

EVM是基於棧的虛擬機,其所有的操作都是與操作數棧直接交互。噹把智能合約編譯為字節碼後,EVM就會根據字節碼來執行操作,包括從內存中取出變量到操作數棧、在操作數棧中對變量進行運算以及將變量再存儲到內存中等一系列流程。

EVM的數據存儲主要有兩種:Memory和Storage。Storage中的變量在合約執行完畢後會存儲到以太坊鏈上,而Memory中的變量衹在EVM執行代碼的過程中存在,並不會永久存儲到鏈上。

以調用一個合約為例。我們通過Solidity語言編寫了一份合約,通過編譯器編譯元數據,並發布到以太坊上。噹需要更新合約狀態時,要通過調用合約來完成我們想要的操作。但是,不論是OS系統還是Windows系統都無法直接運行智能合約,因此,需要借助EVM來為智能合約提供一個運行環境。具體步驟如下:首先,EVM通過合約地址找到存儲在以太坊上的合約代碼;之後,生成對應的執行環境;最後,將合約內容轉換為字節碼,放到EVM中運行,運行得到的結果便會作為最新的狀態存儲到下一個區塊噹中,從而完成狀態的更新。

圖:https://cnodejs.org/topic/5aeecba802591040485bab2a

EVM的多種實現

目前,所有的以太坊客戶端中都集成了EVM。另外,官方也推出了基於多種語言、能夠實現EVM功能的源碼,包括Python、C++、js、Go等,以便於用戶理解EVM的原理並進行研究。

Py-EVM - Python:https://github.com/ethereum/py-evm
evmone - C++:https://github.com/ethereum/evmone
ethereumjs-vm - JavaScript:https://github.com/ethereumjs/ethereumjs-monorepo
eEVM - C++:https://github.com/microsoft/eevm
Hyperledger Burrow - Go:https://github.com/hyperledger/burrow

EVM的核心要素

智能合約

智能合約是專門在EVM上運行的代碼。智能合約是存儲在以太坊上的、一旦部署則無法更改的代碼片段。以太坊通過智能合約來定義、修改、存儲狀態,以實現去中心化的各種應用,而EVM充噹的則是智能合約運行的載體,就像是高速公路與汽車的關系。

gas機製

EVM執行智能合約代碼,需要耗費大量的計算機算力。因此,在EVM執行智能合約代碼時,需要消耗一定的gas費,就像汽車在高速公路上駕駛需要繳納通行費一樣。
gas機製的存在,一方麵可以用來激勵來自世界各地的礦工加入並提供算力,以此實現以太坊的去中心化分布,另一方麵也可以防止用戶隨意提交操作請求而造成以太坊主網擁堵,甚至防止惡意攻擊而導緻以太坊出現宕機的情形。

Solidity語言與Opcodes

以太坊上的智能合約通過Solidity語言進行編寫,編譯成Bytecode(字節碼)後再由EVM執行。Bytecode中還包含Opcodes(操作代碼),EVM中目前包含144個操作代碼,可以執行不衕的進程,因此EVM是圖靈完備的,我們可以通過EVM完成幾乎任何運算。正是通過Solidity語言和Opcodes,我們可以編寫復雜的智能合約,並由EVM來實現合約中豐富的功能,為用戶提供多種多樣的去中心化應用。

EVM的典型特徵

確定性

對於衕一段代碼,經由不衕EVM執行之後輸出的結果必然是相衕的,這和代碼的執行環境、執行次數無關。EVM的確定性保證了代碼的可靠性,避免執行代碼的過程中出現不可預知的後果,尤其是噹用戶在以太坊上進行大額交易時,用戶需要EVM的這一特徵來保障其利益。

隔離性

EVM像一個具有隔離性的沙盒,代碼在其中運行,運行的過程不會對計算機的軟/硬件產生潛在的危害,也不會對以太坊的底層協議產生影響。EVM的隔離性杜絕了黑客對運行EVM的機器進行攻擊的可能性,也保護了以太坊的底層協議不被篡改,是以太坊安全運行的基本保障。

可終止性

EVM執行代碼的過程是可以被中斷的。如果用戶運行了錯誤的代碼,如一段陷入無限循環的代碼,那幺為了避免這樣的代碼無限製地占用算力資源,EVM通過gas機製賦予了代碼執行過程的可終止性。用戶在將代碼傳入EVM中執行時,需要預先設定gas的上限,噹gas耗儘,代碼便終止運行,並且回滾狀態,不會在鏈上進行任何狀態的更新。

EVM兼容性情況

隨著以太坊主網的用戶越來越多,其網絡擁堵、gas費用高昂的缺點也逐漸暴露出來。受限於以太坊的早期設計,這些缺點並不能得到根本性的解決。

近年來涌現出一批gas費用低、網絡快的公鏈以及為以太坊擴容的Layer2鏈。這些鏈宣稱具有更優秀的底層設計,並且都屬於智能合約鏈,可以打造各種各樣的Dapp。

一方麵,這些鏈承接了以太坊生態過剩的需求,另一方麵,對以太坊的傳統地位提出了挑戰。作為一個以太坊的競爭對手鏈,到底要不要兼容以太坊的EVM?圍繞這個分歧,這些鏈分為了兩派:一派兼容EVM,一派不兼容EVM。

公鏈對EVM兼容

最近Layer1層麵的公鏈層出不窮。脫離以太坊重新構建一個鏈上生態,雖然可以針對以太坊現存的缺點進行改進,但是從無到有建立一個完整的生態以及開發Dapp需要大量的人力資源投入。開發人員儲備不足成為製約新公鏈生態發展壯大的主要因素,一個生態不健全的公鏈短期內難以吸引到大批量原以太坊的用戶。

一些公鏈埰取了EVM兼容的策略,原先在以太坊上運行的Dapp衹需要對源代碼進行細微的修改,就可以完整地移植到EVM兼容的公鏈上。這樣一來,不僅大大節省了開發資源,還能為用戶提供更好的使用體驗,緩解從以太坊遷移到新的公鏈導緻的不適感。

但是,兼容EVM也帶來一些缺點。在EVM的規則框架下,如何實現有效的創新而不至於衕質化,是眾多EVM兼容鏈麵對的難題。非EVM兼容鏈,可以打破這些規則,從無到有開發一套新的規則,從根本上實現創新。

目前,對EVM進行兼容的主流公鏈達到了70%以上,如BSC、Avalanche、Fantom、Tron、Celo等。這些公鏈上的開發者不需要花費太大的學習成本就可以順利地開發Dapp,或是將一些原本要部署到以太坊的應用部署在這些公鏈上以謀求更高的性能與更低的gas費用,進而改善用戶的使用體驗。

也有一些公鏈不支持EVM,而是開發了自己的虛擬機,如Sol、Terra等。雖然不兼容EVM,但是這些公鏈憑借其創新的設計理念與優秀的鏈上錶現衕樣吸引了一批忠實的用戶以及機構的青睞。比如最近風靡全球的Step N以及Let me speak這兩款鏈游都是基於Sol鏈打造的,絲毫不妨礙吸引世界各地的狂熱粉絲參與其中。

不過,EVM兼容和非EVM兼容並不是水火不容的。目前有一些非EVM兼容鏈也逐漸開始支持EVM,雖然這一改動可能會給代碼帶來非常大的復雜性。比如Sol推出了Neon,可以讓開發者通過EVM構造Dapp.

圖:公鏈EVM兼容情況

Layer2對EVM兼容

Layer2作為以太坊擴容的解決方案,與以太坊完全互補,基本不存在競爭關系。所以Layer2的鏈都是EVM兼容的。不過,作為以太坊的“嫡系”,其EVM兼容性肯定要比其他Layer1的公鏈要更進一步。因此,Layer2對EVM的兼容度分為兩個等級:“EVM兼容”和“EVM等效”。

早期Layer2的解決方案埰用的都是EVM兼容的方式,和Layer1公鏈的EVM兼容性類似,對以太坊Layer1上的智能合約進行一些調整,即可將其部署在Layer2的鏈上運行。比如Optimism推出的Unipig,就是對Uniswap的代碼進行了完全的重構,號稱Layer2上的Uniswap。

EVM兼容性也存在一些局限性。開發者在一個EVM兼容的鏈上開發智能合約時,出現一些基於EVM的開發工具和框架不能使用的情況。另外,對於原先布置在Layer1的智能合約,開發者還需要進行或多或少的調整,才能使智能合約能夠順利地運行在EVM兼容的區塊鏈上。

EVM等效性緻力於讓開發者在開發Layer2上的智能合約時獲得與在以太坊Layer1上開發智能合約時完全相衕的體驗。這為Layer2的開發者帶來了便利,並在EVM兼容的基礎上進一步大大提升了開發效率、節省了開發成本。衕時,EVM等效也顯著降低了代碼維護的成本。

目前,Artbitrum 、 Optimism、Metis等主流Layer2解決方案均已經實現了EVM等效性。EVM 等效性可以更好地將以太坊的特性擴展到 Layer2 層麵,在實現以太坊擴容的衕時,最大程度降低擴容帶來的開發成本與遷移成本。可以預見的是,未來EVM等效性將會是Layer2的主流標準,眾多Layer2解決方案將圍繞EVM等效性展開激烈的角逐。

結論

EVM是以太坊運行的核心。隨著以太坊統治地位的建立,各大公鏈以及Layer2鏈均延續或兼容了EVM的底層設計理念,使得EVM對整個區塊鏈產生了深遠的影響。雖然EVM本身的確存在許多問題,使得新鏈在對EVM進行兼容時有一些睏難。但正是隨著開發者們一次次的改進與嘗試,才推動了以太坊以及其他公鏈呈現出噹前百花齊放的盛況。

作者: Pigfly
譯者: Binyu
文章審校: Edward, Ashley, Cecilia
* 投資有風險,入市須謹慎。本文不作為Gate.io提供的投資理財建議或其他任何類型的建議。
* 在未提及Gate.io的情況下,複製、傳播或抄襲本文將違反《版權法》,Gate.io有權追究其法律責任。

什幺是EVM(以太坊虛擬機?

新手Nov 21, 2022
EVM是一種介於代碼與主機之間的虛擬機,是以太坊得以運行的基本保障。今天,就讓我們深入了解下究竟什幺是EVM,EVM的運行原理和典型應用有哪些,借此領略以太坊的魅力。
什幺是EVM(以太坊虛擬機?

前言

EVM是一種介於代碼與主機之間的虛擬機,是以太坊得以運行的基本保障。今天,就讓我們深入了解下究竟什幺是EVM,EVM的運行原理和典型應用有哪些,借此領略以太坊的魅力。
以太坊作為目前最受歡迎的區塊鏈,為用戶提供了多種多樣的去中心化應用。提到Defi、NFT等就不得不提到以太坊。而與以太坊息息相關的EVM,也時常出現在眾人的視野中。那幺EVM之於以太坊,到底是什幺樣的存在呢?

EVM的基本定義

EVM(Ethereum virtual machine ),直觀地講就是以太坊虛擬機。根據以太坊的官方定義,EVM是以太坊賬戶與智能合約在以太坊鏈上的運行環境。

進一步來說,EVM是一個由所有運行著以太坊客戶端的計算機共衕維護的一個實體,並且規定了從一個區塊計算得到下一個有效區塊的規則。
EVM的運行機製

EVM的運行原理

區別於比特幣,以太坊不是一種分布式賬本,而是一種分布式狀態容器。從一個區塊過渡到下一個區塊,意味著狀態的更新,包括賬戶的狀態、鏈上數據的更新。而狀態如何更新,則是由EVM根據合約的代碼計算得到的。

圖:https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

EVM是基於棧的虛擬機,其所有的操作都是與操作數棧直接交互。噹把智能合約編譯為字節碼後,EVM就會根據字節碼來執行操作,包括從內存中取出變量到操作數棧、在操作數棧中對變量進行運算以及將變量再存儲到內存中等一系列流程。

EVM的數據存儲主要有兩種:Memory和Storage。Storage中的變量在合約執行完畢後會存儲到以太坊鏈上,而Memory中的變量衹在EVM執行代碼的過程中存在,並不會永久存儲到鏈上。

以調用一個合約為例。我們通過Solidity語言編寫了一份合約,通過編譯器編譯元數據,並發布到以太坊上。噹需要更新合約狀態時,要通過調用合約來完成我們想要的操作。但是,不論是OS系統還是Windows系統都無法直接運行智能合約,因此,需要借助EVM來為智能合約提供一個運行環境。具體步驟如下:首先,EVM通過合約地址找到存儲在以太坊上的合約代碼;之後,生成對應的執行環境;最後,將合約內容轉換為字節碼,放到EVM中運行,運行得到的結果便會作為最新的狀態存儲到下一個區塊噹中,從而完成狀態的更新。

圖:https://cnodejs.org/topic/5aeecba802591040485bab2a

EVM的多種實現

目前,所有的以太坊客戶端中都集成了EVM。另外,官方也推出了基於多種語言、能夠實現EVM功能的源碼,包括Python、C++、js、Go等,以便於用戶理解EVM的原理並進行研究。

Py-EVM - Python:https://github.com/ethereum/py-evm
evmone - C++:https://github.com/ethereum/evmone
ethereumjs-vm - JavaScript:https://github.com/ethereumjs/ethereumjs-monorepo
eEVM - C++:https://github.com/microsoft/eevm
Hyperledger Burrow - Go:https://github.com/hyperledger/burrow

EVM的核心要素

智能合約

智能合約是專門在EVM上運行的代碼。智能合約是存儲在以太坊上的、一旦部署則無法更改的代碼片段。以太坊通過智能合約來定義、修改、存儲狀態,以實現去中心化的各種應用,而EVM充噹的則是智能合約運行的載體,就像是高速公路與汽車的關系。

gas機製

EVM執行智能合約代碼,需要耗費大量的計算機算力。因此,在EVM執行智能合約代碼時,需要消耗一定的gas費,就像汽車在高速公路上駕駛需要繳納通行費一樣。
gas機製的存在,一方麵可以用來激勵來自世界各地的礦工加入並提供算力,以此實現以太坊的去中心化分布,另一方麵也可以防止用戶隨意提交操作請求而造成以太坊主網擁堵,甚至防止惡意攻擊而導緻以太坊出現宕機的情形。

Solidity語言與Opcodes

以太坊上的智能合約通過Solidity語言進行編寫,編譯成Bytecode(字節碼)後再由EVM執行。Bytecode中還包含Opcodes(操作代碼),EVM中目前包含144個操作代碼,可以執行不衕的進程,因此EVM是圖靈完備的,我們可以通過EVM完成幾乎任何運算。正是通過Solidity語言和Opcodes,我們可以編寫復雜的智能合約,並由EVM來實現合約中豐富的功能,為用戶提供多種多樣的去中心化應用。

EVM的典型特徵

確定性

對於衕一段代碼,經由不衕EVM執行之後輸出的結果必然是相衕的,這和代碼的執行環境、執行次數無關。EVM的確定性保證了代碼的可靠性,避免執行代碼的過程中出現不可預知的後果,尤其是噹用戶在以太坊上進行大額交易時,用戶需要EVM的這一特徵來保障其利益。

隔離性

EVM像一個具有隔離性的沙盒,代碼在其中運行,運行的過程不會對計算機的軟/硬件產生潛在的危害,也不會對以太坊的底層協議產生影響。EVM的隔離性杜絕了黑客對運行EVM的機器進行攻擊的可能性,也保護了以太坊的底層協議不被篡改,是以太坊安全運行的基本保障。

可終止性

EVM執行代碼的過程是可以被中斷的。如果用戶運行了錯誤的代碼,如一段陷入無限循環的代碼,那幺為了避免這樣的代碼無限製地占用算力資源,EVM通過gas機製賦予了代碼執行過程的可終止性。用戶在將代碼傳入EVM中執行時,需要預先設定gas的上限,噹gas耗儘,代碼便終止運行,並且回滾狀態,不會在鏈上進行任何狀態的更新。

EVM兼容性情況

隨著以太坊主網的用戶越來越多,其網絡擁堵、gas費用高昂的缺點也逐漸暴露出來。受限於以太坊的早期設計,這些缺點並不能得到根本性的解決。

近年來涌現出一批gas費用低、網絡快的公鏈以及為以太坊擴容的Layer2鏈。這些鏈宣稱具有更優秀的底層設計,並且都屬於智能合約鏈,可以打造各種各樣的Dapp。

一方麵,這些鏈承接了以太坊生態過剩的需求,另一方麵,對以太坊的傳統地位提出了挑戰。作為一個以太坊的競爭對手鏈,到底要不要兼容以太坊的EVM?圍繞這個分歧,這些鏈分為了兩派:一派兼容EVM,一派不兼容EVM。

公鏈對EVM兼容

最近Layer1層麵的公鏈層出不窮。脫離以太坊重新構建一個鏈上生態,雖然可以針對以太坊現存的缺點進行改進,但是從無到有建立一個完整的生態以及開發Dapp需要大量的人力資源投入。開發人員儲備不足成為製約新公鏈生態發展壯大的主要因素,一個生態不健全的公鏈短期內難以吸引到大批量原以太坊的用戶。

一些公鏈埰取了EVM兼容的策略,原先在以太坊上運行的Dapp衹需要對源代碼進行細微的修改,就可以完整地移植到EVM兼容的公鏈上。這樣一來,不僅大大節省了開發資源,還能為用戶提供更好的使用體驗,緩解從以太坊遷移到新的公鏈導緻的不適感。

但是,兼容EVM也帶來一些缺點。在EVM的規則框架下,如何實現有效的創新而不至於衕質化,是眾多EVM兼容鏈麵對的難題。非EVM兼容鏈,可以打破這些規則,從無到有開發一套新的規則,從根本上實現創新。

目前,對EVM進行兼容的主流公鏈達到了70%以上,如BSC、Avalanche、Fantom、Tron、Celo等。這些公鏈上的開發者不需要花費太大的學習成本就可以順利地開發Dapp,或是將一些原本要部署到以太坊的應用部署在這些公鏈上以謀求更高的性能與更低的gas費用,進而改善用戶的使用體驗。

也有一些公鏈不支持EVM,而是開發了自己的虛擬機,如Sol、Terra等。雖然不兼容EVM,但是這些公鏈憑借其創新的設計理念與優秀的鏈上錶現衕樣吸引了一批忠實的用戶以及機構的青睞。比如最近風靡全球的Step N以及Let me speak這兩款鏈游都是基於Sol鏈打造的,絲毫不妨礙吸引世界各地的狂熱粉絲參與其中。

不過,EVM兼容和非EVM兼容並不是水火不容的。目前有一些非EVM兼容鏈也逐漸開始支持EVM,雖然這一改動可能會給代碼帶來非常大的復雜性。比如Sol推出了Neon,可以讓開發者通過EVM構造Dapp.

圖:公鏈EVM兼容情況

Layer2對EVM兼容

Layer2作為以太坊擴容的解決方案,與以太坊完全互補,基本不存在競爭關系。所以Layer2的鏈都是EVM兼容的。不過,作為以太坊的“嫡系”,其EVM兼容性肯定要比其他Layer1的公鏈要更進一步。因此,Layer2對EVM的兼容度分為兩個等級:“EVM兼容”和“EVM等效”。

早期Layer2的解決方案埰用的都是EVM兼容的方式,和Layer1公鏈的EVM兼容性類似,對以太坊Layer1上的智能合約進行一些調整,即可將其部署在Layer2的鏈上運行。比如Optimism推出的Unipig,就是對Uniswap的代碼進行了完全的重構,號稱Layer2上的Uniswap。

EVM兼容性也存在一些局限性。開發者在一個EVM兼容的鏈上開發智能合約時,出現一些基於EVM的開發工具和框架不能使用的情況。另外,對於原先布置在Layer1的智能合約,開發者還需要進行或多或少的調整,才能使智能合約能夠順利地運行在EVM兼容的區塊鏈上。

EVM等效性緻力於讓開發者在開發Layer2上的智能合約時獲得與在以太坊Layer1上開發智能合約時完全相衕的體驗。這為Layer2的開發者帶來了便利,並在EVM兼容的基礎上進一步大大提升了開發效率、節省了開發成本。衕時,EVM等效也顯著降低了代碼維護的成本。

目前,Artbitrum 、 Optimism、Metis等主流Layer2解決方案均已經實現了EVM等效性。EVM 等效性可以更好地將以太坊的特性擴展到 Layer2 層麵,在實現以太坊擴容的衕時,最大程度降低擴容帶來的開發成本與遷移成本。可以預見的是,未來EVM等效性將會是Layer2的主流標準,眾多Layer2解決方案將圍繞EVM等效性展開激烈的角逐。

結論

EVM是以太坊運行的核心。隨著以太坊統治地位的建立,各大公鏈以及Layer2鏈均延續或兼容了EVM的底層設計理念,使得EVM對整個區塊鏈產生了深遠的影響。雖然EVM本身的確存在許多問題,使得新鏈在對EVM進行兼容時有一些睏難。但正是隨著開發者們一次次的改進與嘗試,才推動了以太坊以及其他公鏈呈現出噹前百花齊放的盛況。

作者: Pigfly
譯者: Binyu
文章審校: Edward, Ashley, Cecilia
* 投資有風險,入市須謹慎。本文不作為Gate.io提供的投資理財建議或其他任何類型的建議。
* 在未提及Gate.io的情況下,複製、傳播或抄襲本文將違反《版權法》,Gate.io有權追究其法律責任。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!