加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > 中幣 > Info

以太坊虛擬機是如何運行的?_THE:CHTT

Author:

Time:1900/1/1 0:00:00

譯文出自:登鏈翻譯計劃

譯者:翻譯小組

校對:ARC_hunk

如果您曾嘗試過在以太坊上開發智能合約,或者至少了解過相關內容,那么你也許會聽說過“EVM”,該術語是“以太坊虛擬機”的縮寫。就本質而言,虛擬機在代碼和機器之間創建了一層抽象,以此提升軟件的可移植性,同時確保應用程序與主機、其他應用之間的隔離性。

創建智能合約

智能合約通常使用Solidity編寫,這是一種類似于JavaScript和C的語言。其他合約編程語言則包括Vyper和Bamboo等。在Solidity發布之前,Serpent和Mutan也曾被使用過。

智能合約示例(TheGreeter):

pragmasolidity>=0

}contractGreeterisMortal{/*定義greeting變量,它的類型*/stringgreeting;/*合約運行的時候被執行*/constructor(stringmemory_greeting)public{greeting=_greeting;}/*主函數*/functiongreet()publicviewreturns(stringmemory){returngreeting;}}

Solidity這樣的智能合約語言無法直接被EVM所執行,他們需先被編譯為低級的機器指令。

操作碼

從內部來看,EVM通過一組指令來執行特定任務,這組指令被稱為操作碼。在本文編寫之時,目前共有140個不同的操作碼,它們使得EVM圖靈完備,即在給定足夠資源的前提下,足以完成任何計算。由于操作碼為1字節大小,最多只可能有256個字節碼。簡單起見,我們可將所有操作碼歸為如下幾類:

Tether于以太坊網絡增發10億枚USDT:3月14日消息,據 Whale Alert 數據顯示,穩定幣發行商 Tether 于北京時間 3 月 14 日 22:36:11 在以太坊網絡增發 10 億枚 USDT。

Tether 首席技術官 Paolo Ardoino 補充表示,這是一筆在以太坊網絡已授權但未發行的交易,意味著本次增發將用于下一次發行請求和鏈上交互。[2023/3/15 13:04:16]

棧操作相關的字節碼

運算/比較/位操作相關的字節碼

環境相關的字節碼

內存操作字節碼

存儲操作字節碼

程序計數器相關的字節碼

終止相關的字節碼

Byzantium分支中的全部操作碼,包括Constantinople版本所計劃的

字節碼

為了有效的保存操作碼,操作碼會被編碼為字節碼。每個操作碼被賦予一個特定字節。我們來看一下這個字節碼:0x6001600101

字節碼、拆分后的字節、對應的操作碼,還有當前的棧

在執行時,字節碼會被拆分為多個字節。位于0x60-0x7f范圍內的字節,會以其他方式處理,因為它們包含壓棧的數據,這些數據會被添在操作碼后面,而不會被當作單獨的操作碼。

第一個指令是0x60,它的含義是PUSH1。因此,我們知道要壓入的數據是1字節長,故我們將下一個字節壓入到棧上。現在,棧上已包含了一個數據項,我們來執行下一條指令。由于我們知道0x01屬于PUSH指令的一部分,下一條我們要執行的指令是另一個0x60,外加同樣的數據。此時棧上包含了兩個相同的數據項。最后一個指令是0x01,它對應ADD操作碼。這一條指令會從棧上取2個數據項,然后將它們之和壓入到棧上,使棧上目前只包含一個數據項:0x02.

昨日以太坊銷毀量9777ETH 環比上升21.93%:據歐科云鏈鏈上大師數據顯示,當前以太坊銷毀量為134.52萬ETH,24小時Base Fee均值102 Gwei;昨日以太坊銷毀量9777.88ETH,環比上升21.93%。近24小時銷毀量前三的協議分別是OpenSea 1658.04 ETH、Uniswap V3 785.34 ETH以及Erc-20 USDT 406.54 ETH。[2022/1/4 8:22:59]

合約狀態

許多流行的高層編程語言允許用戶直接給函數傳參,與此不同的是,底層的編程語言則常用棧來給函數傳遞參數。EVM使用基于256位的寄存器棧,這個棧最近的16個數據項可以被直接訪問和操作。整個棧最多保存1024個數據項。

由于這些限制,復雜的操作碼會轉而使用合約內存來讀寫數據。然而,內存并非持久化的。當合約執行完成后,內存的內容并不會被保存。因此,棧可以看作函數參數,而內存則可看作聲明的變量。

為了能夠長久保存數據,并使其可為將來的合約執行所用,我們可以使用存儲。合約存儲本質上就像是公共數據庫,數據可以被外部讀取,且無需發送任何交易。但是,比之于寫內存,對存儲的寫入操作則昂貴的多。

合約交互的開銷

合約的每次執行,均會在每一個以太坊節點上運行,因此攻擊者可以嘗試創建那種包含大量計算量的合約,以此來降低網絡的速度。為了防止這種攻擊發生,每個字節碼都有相應的基礎gas消耗。此外,一些復雜合約還會收取動態的gas費用。例如,操作碼KECCAK256的基礎開銷是30gas,而其動態開銷為6gas/字。比之于簡單、直接的指令,計算量高昂的指令會收取更多的gas費用。此外,每筆交易一開始便會收取21000gas。

在執行那些降低狀態大小的指令時,gas可以被退還。將一個非零的存儲數值設為0,將會退還15000gas;完整的移除一個合約會退還24000gas。僅當合約執行完成之后,才會退還資金,因為合約自己無法執行償還操作。此外,一筆退款的數額,無法超過當前合約調用所耗費的gas的一半。如果您想對gas有更多了解,您可以閱讀這一篇文章,寫的很好:什么是Gas?

動態 | 以太坊去中心化資助平臺 Panvala 公布第五期資助名單:以太坊去中心化資助平臺 Panvala 公布第五期資助項目名單。獲得資助最多的為加拿大科技公司 ChainSafe ,該公司因開發以太坊 2.0 輕量級客戶端獲得 350,000 PAN 代幣的資助。其他受到資助的項目包括:參與開發以太坊 2.0 智能合約執行環境的 Quilt、去中心化節點基礎設施提供商 DappNode、改善 Layer 2 解決方案 Optimistic Rollup 兼容性的 Nutberry、Ewasm 編譯器 SOLL、DApp 數據庫節點開發商 Menlo.one、簡化錢包登陸流程的 Universal Login,將應用嵌入加密貨幣錢包的項目 Alice,基于以太坊的錢包 AlphaWallet、隱私軟件 FairDrive。Panvala 表示目前已經為以太坊生態系統的 36 個項目發放了資金,其支持捐贈的贊助商包括 Unstoppable Domains、Helium 以及 MythX。Panvala 是為以太坊生態項目服務的去中心化資助平臺,該平臺使用 DAO 的機制邀請成員投票并使用其設計的代幣 PAN 資助項目,旨在為項目在不影響白皮書可交付成果的影響下實現重點工作。[2020/2/7]

注:倫敦分叉中,gas退還機制有所調整,可參考:EIP-3529:減少gas返還。

在部署智能合約的時候,一個常規的交易會被創建,但不會設置地址。此外,一些字節碼會被添加到輸入數據上,這個字節碼充當了構造函數,它會在runtime字節碼被拷貝到合約代碼前,初始化存儲變量。在部署期間,creation字節碼僅會運行一次,而runtime字節碼會在每一次合約調用時運行。

另一個Solidity合約示例,及部署它所需要的字節碼

我們可以把上述字節碼拆分成三部分:

動態 | Circle向以太坊網絡新增發1600萬枚USDC:DAppTotal.com穩定幣專題頁面數據顯示:10月11日06時17分 ,USDC發行方Circle向以太坊網絡新增發1筆價值1,600萬美元的USDC, 塊高度為:8716619,交易哈希值為:0xe93d1d4505a2d2ff908063e88a270769d5969b5f50a924382f41064ce813163f 。截至目前,Circle在以太坊網絡上的ERC20 USDC總發行量已達470,026,465枚。請廣大投資者警惕行情變動,謹慎應對市場風險。[2019/10/11]

構造函數

60806040526001600055348015601457600080fd5b5060358060226000396000f3fe

構造函數將初始值寫入存儲中,并將runtime字節碼拷貝到合約內存中

運行時

6080604052600080fdfe

這部分字節碼在合約創建的過程中被寫入內存

元數據

a165627a7a723058204e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d20029

Solidity會創建一份元數據文件,它的Swarm哈希會被添加到字節碼尾部。Swarm是一個分布式存儲平臺外,也是內容分發服務,換句話說是一個分布式文件存儲系統。盡管Swarm哈希被納入到了runtime字節碼中,它永遠不會被EVM解釋為操作碼,因為它的位置永遠不會被執行到。目前,Solidity使用下述格式:

0xa10x65'b''z''z''r''0'0x580x200x000x29

以太坊在谷歌被搜索了1.1億次:據CCN消息,自2015年以太坊成立以來,以太坊這個詞在谷歌搜索中出現了1.1億次。平均每天點擊量有2萬次。[2018/6/4]

因此,在這個例子,我們可以提取出Swarm的哈希:

4e048d6cab20eb0d9f95671510277b55a61a582250e04db7f6587a1bebc134d2

元數據文件包含了合約的各種信息,比如編譯器版本,合約函數等。不幸的是,這是一個實驗中的特性,而且并沒有很多的合約會公開將元數據文件上傳到Swarm網絡上。

反編譯字節碼

為了讓字節碼更便于閱讀,一些項目提供了相應的工具,比如,你可以使用eveem.org或ethervm.io來反編譯主網上的合約。不幸的是,由于編譯器優化的緣故,原始合約中的一些信息會丟失,比如函數名、事件名等。盡管如此,多數函數名還是可以通過對常用的函數名、事件名稱進行暴力枚舉來取得。

合約調用通常需要一個"ABI"(應用程序二進制接口),這是一份描述了所有函數和事件的文檔,包含了它們的輸入輸出信息。當調用合約函數的時候,函數的簽名通過對函數名及其輸入參數進行哈希并截取前4個字節得到。

Solidity合約示例,及ABI

如上圖所示,HelloWorld函數生成的簽名哈希是0x7fffb7bd。如果我們想調用這個函數,交易數據的開頭就要設置為0x7fffb7bd。函數所需要的參數會按32字節大小,即數據字的大小,添加到交易數據中簽名哈希的后面。如果一個參數包含了超過32字節的數據,例如數組或字符串,該參數將被拆分為多個數據字,并添加到輸入數據中所有其他參數之后。此外,這些數據字的數目,則會單獨編碼到一個數據字中,放在具體內容的數據字前面。在這個參數所對應的位置,放入了參數數據字的起始位置。

總結

以太坊為那些使用Solidity和EVM的應用開發者提供了一套去中心化的生態系統。比之于在傳統服務器上運行程序,使用智能合約來和EVM交互會昂貴一些,但仍然有很多場景,這些場景中,去中心化要比開銷更為重要。如果這篇文章使你對學習開發智能合約產生興趣,可以看下這篇優秀文章:智能合約入門,深入學習Solidity運行原理。感謝閱讀!

參考文章

Wood,G.(2014).Ethereum:AsecuredecentralisedgeneralisedtransactionledgerEthereumFoundation.(2016).SolidityDocumentationSantander,A.,&Arias,L.(2018).DeconstructingaSolidityContractHoward.(2017).DivingIntoTheEthereumVirtualMachine

本翻譯由CellNetwork贊助支持。

參考資料

登鏈翻譯計劃:https://github.com/lbc-team/Pioneer

翻譯小組:https://learnblockchain.cn/people/412

ARC_hunk:https://learnblockchain.cn/people/3904

Solidity:https://github.com/ethereum/solidity

Vyper:https://github.com/ethereum/vyper

Bamboo:https://github.com/cornellblockchain/bamboo

Serpent:https://github.com/ethereum/serpent

Mutan:https://github.com/obscuren/mutan

TheGreeter:https://ethereum.org/en/developers/

圖靈完備:https://en.wikipedia.org/wiki/Turing_completeness

什么是Gas?:https://support.mycrypto.com/gas/what-is-gas-ethereum.html

EIP-3529:減少gas返還:https://learnblockchain.cn/article/2529

元數據文件:https://solidity.readthedocs.io/en/v0.5.2/metadata.html

Swarm哈希:https://github.com/ethereum/wiki/wiki/Swarm-Hash

eveem.org:https://eveem.org/

ethervm.io:https://ethervm.io/

4byte.directory:https://www.4byte.directory/

keccak256:https://en.wikipedia.org/wiki/SHA-3

智能合約入門:https://learnblockchain.cn/docs/solidity/solidity-by-example.html

Wood,G.(2014).Ethereum:Asecuredecentralisedgeneralisedtransactionledger:https://ethereum.github.io/yellowpaper/paper.pdf

EthereumFoundation.(2016).SolidityDocumentation:https://solidity.readthedocs.io/en/latest/

Santander,A.,&Arias,L.(2018).DeconstructingaSolidityContract:https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-i-introduction-832efd2d7737

Howard.(2017).DivingIntoTheEthereumVirtualMachine:https://blog.qtum.org/ping-into-the-ethereum-vm-6e8d5d2f3c30

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/10458012.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

每周編輯精選WeeklyEditors'Picks

Tags:THEETHHTTTPSThe Collective CoinLETH價格CHTThttps://etherscan.io

中幣
區塊鏈媒體 Decrypt 推出媒體 DAO PubDAO,PubDAO 將發行代幣推動自身發展_區塊鏈:CRYPT

鏈聞消息,區塊鏈媒體Decrypt宣布推出媒體DAOPubDAO,該組織由Decrypt和TheDefiant、ACJR以及來自FriendswithBenefits、Gitcoin、Colla.

1900/1/1 0:00:00
XT關于暫停HOKK充值及交易的公告_COM:Pala Int Comm

尊敬的XT用戶: XT.COM現已暫停HOKK充值及交易業務。給您帶來的不便,請您諒解!感謝您對XT.COM的支持與信任.

1900/1/1 0:00:00
風投公司CMCC Global第四只加密基金計劃籌集3億美元_CMCC:IMCC

據彭博社10月29日報道,中國香港風投公司CMCCGlobalAssetManagement于今年4月推出的第四只加密基金目前已籌集9000萬美元,計劃到明年初完成3億美元目標.

1900/1/1 0:00:00
盤中寶——Facebook更名帶火元宇宙,元宇宙未來如何_BTC:中本聰BTCs官網

市場回顧 幣贏研究院在10月28日文章《盤中寶——Meme板塊表現強勢,市場投機或已至臨界點》提出市場投機嚴重,并且達到某一臨界點,認為短期市場投機嚴重,疊加美國比特幣ETF炒作消退.

1900/1/1 0:00:00
重磅亮相!七號星球啟動GameFi鏈游公會!_GAME:gamefi幣種

當普通大眾還在玩王者榮耀時候,已經有人把眼光瞄準到鏈游龐大的市場中,鏈游GameFi作為全球區塊鏈最拔尖受寵,兼具游戲趣味、金融資產、商業應用等多種屬性下,一直被認為是區塊鏈真正落地的引擎爆點.

1900/1/1 0:00:00
BKEX Global 關于上線 GHC(Galaxy Heroes Coin)并開放充值功能的公告_KEX:GLO

尊敬的用戶:?????????????BKEXGlobal即將上線GHC,詳情如下:上線交易對:GHC/USDT幣種類型:BEP20充值功能開放時間:已開放交易功能開放時間:2021年10月31.

1900/1/1 0:00:00
ads