什么是以太坊虛擬機(jī)EVM
以太坊是僅次于比特幣的第二重要、最受歡迎的加密貨幣。通常被認(rèn)為是比特幣在加密貨幣領(lǐng)域的競(jìng)爭(zhēng)對(duì)手。
和比特幣一樣,以太坊也是分散式的,運(yùn)行在區(qū)塊鏈技術(shù)上,是一個(gè)開(kāi)源項(xiàng)目。然而,以太坊比比特幣更具靈活性和適應(yīng)性。任何有知識(shí)的人都可以在該平臺(tái)上創(chuàng)建新的應(yīng)用程序。隨著第二版本Ethereum Homestead的發(fā)布,這些應(yīng)用程序已經(jīng)可以安全使用。
Homestead為用戶(hù)提供了創(chuàng)建任何他們想要的應(yīng)用程序的自由,不管這些應(yīng)用程序有多復(fù)雜。它還成為了一個(gè)平臺(tái),用于啟動(dòng)除加密貨幣之外的新的分散的區(qū)塊鏈應(yīng)用程序。
所有這些過(guò)程的核心是以太坊虛擬機(jī)(EVM),這是一種準(zhǔn)圖靈機(jī),可以編寫(xiě)任意復(fù)雜的隨機(jī)算法代碼。
什么是虛擬機(jī)及其工作原理
為了更好地理解EVM是什么以及它是如何工作的,我們需要理解術(shù)語(yǔ)“準(zhǔn)圖靈”的含義?!皽?zhǔn)”是“部分”的意思,“圖靈”是指“現(xiàn)代計(jì)算機(jī)科學(xué)之父”、因?yàn)閳D靈機(jī)器的創(chuàng)造者是艾倫·圖靈。
在計(jì)算機(jī)世界中,有許多訪問(wèn)和修改數(shù)據(jù)的系統(tǒng)。這些系統(tǒng)包括中央處理單元和編程語(yǔ)言。
一個(gè)系統(tǒng)或機(jī)器,可以在數(shù)學(xué)上執(zhí)行任何計(jì)算或問(wèn)題,被認(rèn)為是圖靈完備。
以太坊虛擬機(jī)被標(biāo)記為準(zhǔn)圖靈機(jī),因?yàn)樗梢越鉀Q的計(jì)算是由gas約束的,這意味著它可以執(zhí)行的計(jì)算數(shù)量是有限的。
在以太坊網(wǎng)絡(luò)上,天然氣相當(dāng)于一筆費(fèi)用。你在以太坊網(wǎng)絡(luò)上進(jìn)行的每筆交易都有一個(gè)價(jià)格,而gas就是支付方式。
以太坊網(wǎng)絡(luò)上的gas概念有兩個(gè)方面——gas和gas價(jià)格。gas是測(cè)量工具:它標(biāo)識(shí)執(zhí)行特定計(jì)算所需的費(fèi)用。天然氣價(jià)格是用戶(hù)愿意為每單位天然氣支付的以太幣。
Wei是汽油價(jià)格的計(jì)量單位。Wei以太幣的最小單位,一個(gè)以太幣=101?Wei。
在任何交易發(fā)生之前,必須設(shè)定燃?xì)庀揞~和燃?xì)鈨r(jià)格。如果你作為試圖完成交易的人,沒(méi)有足夠的燃?xì)?,交易就?huì)無(wú)效。
由于計(jì)算依賴(lài)于gas,因此EVM無(wú)法執(zhí)行某些計(jì)算。這些問(wèn)題包括采空區(qū)瓦斯限值太低,計(jì)算非常復(fù)雜,在經(jīng)濟(jì)上被認(rèn)為是不切實(shí)際的。
EVM編程語(yǔ)言稱(chēng)為EVM字節(jié)碼。如果使用更高級(jí)的編程語(yǔ)言,比如以太坊的 Solidity,來(lái)編寫(xiě)特定的代碼,那么這些代碼將被添加到EVM字節(jié)碼中,以便EVM能夠理解它。
EVM , 一個(gè)基于事務(wù)的狀態(tài)機(jī)
EVM有很多用途;其中兩個(gè)主要是處理網(wǎng)絡(luò)上的計(jì)算和內(nèi)部狀態(tài),以及處理與用戶(hù)姓名和地址、當(dāng)前油價(jià)、余額和塊信息相關(guān)的帳戶(hù)信息。
EVM是基于事務(wù)的狀態(tài)機(jī),這意味著它管理網(wǎng)絡(luò)上的內(nèi)部狀態(tài)。沒(méi)有EVM,就無(wú)法跟蹤完成事務(wù)所需每個(gè)組件的狀態(tài)。這些成分共同作用來(lái)調(diào)節(jié)復(fù)雜以太坊區(qū)塊鏈的變化水平。
作為基于事務(wù)的狀態(tài)機(jī),EVM需要監(jiān)視帳戶(hù)狀態(tài)、世界狀態(tài)、存儲(chǔ)狀態(tài)、運(yùn)行時(shí)環(huán)境信息和塊信息。
帳戶(hù)狀態(tài)
以太坊網(wǎng)絡(luò)由許多相互作用的小賬戶(hù)組成——合約賬戶(hù)或外部擁有的賬戶(hù)。
在兩個(gè)外部擁有的帳戶(hù)之間發(fā)生的通信稱(chēng)為價(jià)值轉(zhuǎn)移。這兩個(gè)帳戶(hù)都可以使用私鑰通過(guò)數(shù)字簽名的事務(wù)相互發(fā)送消息。
外部擁有的帳戶(hù)與合約帳戶(hù)之間的通信使后者能夠使用其代碼執(zhí)行不同的操作,例如創(chuàng)建和傳輸代幣。
外部擁有的帳戶(hù)可以促使合約帳戶(hù)采取行動(dòng);合約帳戶(hù)是反應(yīng)性的。這意味著它們不能發(fā)起事務(wù),只能響應(yīng)它們接收到的其他事務(wù)。
合約帳戶(hù)具有與之關(guān)聯(lián)的代碼或編程語(yǔ)言,并且此合約代碼可以控制帳戶(hù)。
外部擁有的帳戶(hù)沒(méi)有代碼,但可以使用私鑰進(jìn)行控制。
任何外部擁有的帳戶(hù)都可以向其他外部擁有的帳戶(hù)發(fā)送消息,也可以向合約帳戶(hù)發(fā)送消息。這種類(lèi)型的帳戶(hù)有一個(gè)用于簽署帳戶(hù)事務(wù)的私鑰。
帳戶(hù)狀態(tài)有四個(gè)主要組件:nonce、balance、storageRoot和codeHash
- Nonce -在外部擁有的帳戶(hù)中,Nonce表示從帳戶(hù)地址發(fā)送的事務(wù)數(shù)量。在合約帳戶(hù)中,它是由該帳戶(hù)創(chuàng)建的合約數(shù)量。
- balance -賬戶(hù)地址所擁有的余額
- storageRoot - Merkle Patricia樹(shù)根節(jié)點(diǎn)的256位哈希值。默認(rèn)情況下,樹(shù)是空的,它對(duì)帳戶(hù)的存儲(chǔ)內(nèi)容進(jìn)行編碼。
- codeHash -這段代碼是不可變的:沒(méi)有人可以在它創(chuàng)建之后改變它。這個(gè)帳戶(hù)的EVM的codeHash也是在這個(gè)地址接收到消息調(diào)用時(shí)執(zhí)行的代碼。
World State
World State由帳戶(hù)狀態(tài)和160位地址標(biāo)識(shí)符之間的映射組成。該信息存儲(chǔ)在Merkle Patricia樹(shù)中。
存儲(chǔ)狀態(tài)
存儲(chǔ)狀態(tài)是EVM上運(yùn)行時(shí)管理的特定于帳戶(hù)的信息。
這是執(zhí)行事務(wù)所需的信息。它包括:
-來(lái)源-交易的原始發(fā)件人的地址
-調(diào)用方-執(zhí)行事務(wù)的帳戶(hù)的地址
-燃?xì)鈨r(jià)格-交易發(fā)起者指定的燃?xì)獾漠?dāng)前價(jià)格
-代碼大小-事務(wù)代碼庫(kù)有多大
塊的信息
這些是支持事務(wù)所必需的狀態(tài)值。信息包括:
- Blockhash -最近完成的塊的哈希
- Coinbase -收件人地址
-當(dāng)前塊的時(shí)間戳
-當(dāng)前塊的編號(hào)
-當(dāng)前塊的難度級(jí)別
-電流塊的氣體極限