鍍金池/ 教程/ 大數(shù)據(jù)/ 區(qū)塊鏈技術(shù)(五):以太坊核心概念(一)
區(qū)塊鏈技術(shù)(十):以太坊去中心化淘寶智能合約案例
區(qū)塊鏈技術(shù)(八):以太坊公開(kāi)拍賣(mài)智能合約案例
區(qū)塊鏈技術(shù)(九):以太坊非公開(kāi)拍賣(mài)智能合約案例
區(qū)塊鏈技術(shù)(五):以太坊核心概念(一)
區(qū)塊鏈技術(shù)(一):Truffle開(kāi)發(fā)入門(mén)
區(qū)塊鏈技術(shù)(七):以太坊投票智能合約案例
區(qū)塊鏈技術(shù)(四):區(qū)塊鏈?zhǔn)鞘裁矗?/span>
區(qū)塊鏈技術(shù)(三):智能合約入門(mén)
區(qū)塊鏈技術(shù)(二):以太坊編程語(yǔ)言Solidity安裝
區(qū)塊鏈技術(shù)(六):以太坊核心概念(二)

區(qū)塊鏈技術(shù)(五):以太坊核心概念(一)

以太坊虛擬機(jī)(EVM)

以太坊虛擬機(jī)(EVM)是以太坊中智能合約的運(yùn)行環(huán)境。它不僅被沙箱封裝起來(lái),事實(shí)上它被完全隔離,也就是說(shuō)運(yùn)行在EVM內(nèi)部的代碼不能接觸到網(wǎng)絡(luò)、文件系統(tǒng)或者其它進(jìn)程。甚至智能合約之間也只有有限的調(diào)用。

賬戶(hù)(Accounts)

以太坊中有兩類(lèi)賬戶(hù),它們共用同一個(gè)地址空間。外部賬戶(hù),該類(lèi)賬戶(hù)被公鑰-私鑰對(duì)控制。合約賬戶(hù),該類(lèi)賬戶(hù)被存儲(chǔ)在賬戶(hù)中的代碼控制。 外部賬戶(hù)的地址是由公鑰決定的,合約賬戶(hù)的地址是在創(chuàng)建合約時(shí)確定的(這個(gè)地址由合約創(chuàng)建者的地址和該地址發(fā)出過(guò)的交易數(shù)量計(jì)算得到,地址發(fā)出過(guò)的交易數(shù)量也被稱(chēng)作"nonce")

兩類(lèi)賬戶(hù)唯一的區(qū)別是:合約賬戶(hù)存儲(chǔ)了代碼,外部賬戶(hù)則沒(méi)有。

每個(gè)賬戶(hù)有一個(gè)key-value形式的持久化存儲(chǔ)。key,value的長(zhǎng)度都是256bit。

另外,每個(gè)賬戶(hù)都有一個(gè)以太幣余額(單位是"Wei"),該賬戶(hù)余額可以通過(guò)向它發(fā)送帶有以太幣的交易來(lái)改變。

交易(Transactions)

一筆交易是一條消息,從一個(gè)賬戶(hù)發(fā)送到另一個(gè)賬戶(hù)。交易可以包含二進(jìn)制數(shù)據(jù)(payload)和以太幣。

如果目標(biāo)賬戶(hù)包含代碼,該代碼和輸入數(shù)據(jù)會(huì)被執(zhí)行。

如果目標(biāo)賬戶(hù)是零賬戶(hù)(賬戶(hù)地址是0),交易將創(chuàng)建一個(gè)新合約。正如上文所講,這個(gè)合約地址不是零地址,而是由合約創(chuàng)建者的地址和該地址發(fā)出過(guò)的交易數(shù)量計(jì)算得到。創(chuàng)建合約交易的payload被當(dāng)作EVM字節(jié)碼執(zhí)行。執(zhí)行的輸出做為合約代碼被永久存儲(chǔ)。這意味著,為了創(chuàng)建一個(gè)合約,你不需要向合約發(fā)送真正的合約代碼,而是發(fā)送能夠返回真正代碼的代碼。

Gas

以太坊上的每筆交易都會(huì)被收取一定數(shù)量的gas,gas的目的是限制執(zhí)行交易所需的工作量,同時(shí)為執(zhí)行支付費(fèi)用。當(dāng)EVM執(zhí)行交易時(shí),gas將按照特定規(guī)則被逐漸消耗。

gas price(gas價(jià)格,以太幣計(jì))是由交易創(chuàng)建者設(shè)置的,發(fā)送賬戶(hù)需要預(yù)付的交易費(fèi)用 = gas price * gas amount。 如果執(zhí)行結(jié)束還有g(shù)as剩余,這些gas將被返還給發(fā)送賬戶(hù)。

無(wú)論執(zhí)行到什么位置,一旦gas被耗盡(比如降為負(fù)值),將會(huì)觸發(fā)一個(gè)out-of-gas異常。當(dāng)前調(diào)用幀所做的所有狀態(tài)修改都將被回滾。

存儲(chǔ),主存和棧(Storage, Memory and the Stack)

每個(gè)賬戶(hù)有一塊持久化內(nèi)存區(qū)域被稱(chēng)為存儲(chǔ)。其形式為key-value,key和value的長(zhǎng)度均為256比特。在合約里,不能遍歷賬戶(hù)的存儲(chǔ)。相對(duì)于另外兩種,存儲(chǔ)的讀操作相對(duì)來(lái)說(shuō)開(kāi)銷(xiāo)較大,修改存儲(chǔ)更甚。一個(gè)合約只能對(duì)它自己的存儲(chǔ)進(jìn)行讀寫(xiě)。

第二個(gè)內(nèi)存區(qū)被稱(chēng)為主存。合約執(zhí)行每次消息調(diào)用時(shí),都有一塊新的,被清除過(guò)的主存。主存可以以字節(jié)粒度尋址,但是讀寫(xiě)粒度為32字節(jié)(256比特)。操作主存的開(kāi)銷(xiāo)隨著其增長(zhǎng)而變大(平方級(jí)別)。

EVM不是基于寄存器,而是基于棧的虛擬機(jī)。因此所有的計(jì)算都在一個(gè)被稱(chēng)為棧的區(qū)域執(zhí)行。棧最大有1024個(gè)元素,每個(gè)元素256比特。對(duì)棧的訪(fǎng)問(wèn)只限于其頂端,方式為:允許拷貝最頂端的16個(gè)元素中的一個(gè)到棧頂,或者是交換棧頂元素和下面16個(gè)元素中的一個(gè)。所有其他操作都只能取最頂?shù)膬蓚€(gè)(或一個(gè),或更多,取決于具體的操作)元素,并把結(jié)果壓在棧頂。當(dāng)然可以把棧上的元素放到存儲(chǔ)或者主存中。但是無(wú)法只訪(fǎng)問(wèn)棧上指定深度的那個(gè)元素,在那之前必須要把指定深度之上的所有元素都從棧中移除才行。

下一篇文章將繼續(xù)介紹以太坊核心概念。

本文并非本人原創(chuàng),文章來(lái)自于@rink1969, @jan, @shaoping的翻譯和校對(duì),系統(tǒng)的介紹以太坊繞不開(kāi)這些概念,因此轉(zhuǎn)載過(guò)來(lái),特此感謝。

原文:http://wangxiaoming.com/blog/2016/05/07/blockchain-tech-ethereum-concept/