在區塊鏈中,以太坊的核心內容是什麼?

2021-09-19 12:46:27 字數 2692 閱讀 5733

鏈客,有問必答!

以太坊核心概念11

(1)以太坊虛擬機器

以太坊虛擬機器(evm)是以太坊中智慧型合約的執行環境。它是以太坊專案中的另乙個主要創新。有人說evm「位於區塊鏈之上」,實際上它是由許多互相連線的計算機組成的。任何人都可以上傳程式,並讓這些程式自動執行,同時保證現在和所有以前的每個程式的狀態總是公共可見的。這些程式執行在區塊鏈上,嚴格地按照evm定義的方式繼續執行。所以任何人都可以為所有權、交易格式和狀態轉換函式建立商業邏輯。

(2)賬戶

以太坊中有兩類賬戶,它們共用同乙個位址空間。外部賬戶,該類賬戶被公鑰-私鑰對控制。合約賬戶,該類賬戶被儲存在賬戶中的**控制。外部賬戶的位址是由公鑰決定的,合約賬戶的位址是在建立合約時由合約建立者的位址和該位址發出過的交易數量計算得到。兩類賬戶的唯一區別是:外部賬戶沒有**,人們可以通過建立和簽名一筆交易從乙個外部賬戶傳送訊息。每當合約賬戶收到一條訊息,合約內部的**就會被啟用,允許它對內部儲存進行讀取、寫入、傳送其他訊息和建立合約。

以太坊的賬戶包含4個部分:①隨機數,用於確定每筆交易只能被處理一次的計數器;②賬戶目前的以太幣餘額;③賬戶的合約**(如果有的話);④賬戶的儲存(預設為空)。

(3)訊息

以太坊的訊息在某種程度上類似於位元幣的交易,但是兩者之間存在3點重要的不同。

1)以太坊的訊息可以由外部實體或者合約建立,然而位元幣的交易只能從外部建立。

2)以太坊訊息可以選擇包含資料。

3)如果以太坊訊息的接收者是合約賬戶,可以選擇進行回應,這意味著以太坊訊息也包含函式概念。

(4)交易

以太坊中「交易」是指儲存從外部賬戶發出的訊息的簽名資料報。交易包含訊息的接收者、用於確認傳送者的簽名、以太幣賬戶餘額、要傳送的資料和被稱為startgas和gasprice的兩個數值。為了防止**出現指數型**和無限迴圈,每筆交易需要對執行**所引發的計算步驟做出限制。startgas就是通過需要支付的燃料來對計算步驟進行限制,gasprice是每一計算步驟需要支付礦工的燃料的**。

(5)gas

以太坊上的每筆交易都會被收取一定數量的燃料gas,設定gas的目的是限制交易執行所需的工作量,同時為交易的執行支付費用。當evm執行交易時,gas將按照特定規則被逐漸消耗。gas**由交易建立者設定,傳送賬戶需要預付的交易費用=gasprice*gas amount。如果執行結束還有gas剩餘,這些gas將被返還給傳送賬戶。無論執行到什麼位置,一旦gas被耗盡就會觸發乙個out-of-gas異常。同時,當前呼叫幀所做的所有狀態修改都將被回滾。

(6)儲存、主存和棧

每個賬戶都有一塊永久的記憶體區域,被稱為儲存,其形式為key-value,key和value的長度均為256位。在合約裡,不能遍歷賬戶的儲存。相對於主存和棧,儲存的讀操作開銷較大,修改儲存甚至更多。乙個合約只能對它自己的儲存進行讀寫。

第二個記憶體區被稱為主存。合約執行每次訊息呼叫時都有一塊新的被清除過的主存。主存可以按位元組定址,但是讀寫的最小單位為32位元組。操作主存的開銷隨著主存的增長而變大。

evm不是基於暫存器的,而是基於棧的虛擬機器。因此所有的計算都在乙個稱為棧的區域內執行。棧最大有1024個元素,每個元素有256位。對棧的訪問只限於其頂端,允許複製最頂端的16個元素中的乙個到棧頂,或者是交換棧頂元素和下面16個元素中的乙個。所有其他操作都只能取最頂的乙個或幾個元素,並把結果壓在棧頂。當然可以把棧裡的元素放到儲存或者主存中。但是無法只訪問棧裡指定深度的那個元素,在那之前必須把指定深度之上的所有元素都從棧中移除才行。

(7)指令集

evm的指令集被刻意保持在最小規模,以盡可能避免可能導致共識問題的錯誤。所有的指令都是針對256位這個基本的資料單位進行的操作,具備常用的算術、位、邏輯和比較操作,也可以進行條件和無條件跳轉。此外,合約可以訪問當前區塊的相關屬性,比如它的編號和時間戳。

(8)訊息呼叫

合約可以通過訊息呼叫的方式來呼叫其他合約,或者傳送以太幣到非合約賬戶。訊息呼叫和交易非常類似,它們都有乙個源,乙個目標,資料負載,以太幣,gas和返回資料。事實上每個交易都可以被認為是乙個頂層訊息呼叫,這個訊息呼叫會依次產生更多的訊息呼叫。

乙個合約可以決定剩餘gas的分配。比如內部訊息呼叫時使用多少gas,或者期望保留多少gas。如果在內部訊息呼叫時發生了out-of-gas異常或者其他異常,合約將會得到通知,乙個錯誤碼被壓入棧中。這種情況只是內部訊息呼叫的gas耗盡。在solidity中,這種情況下發起呼叫的合約缺省會觸發乙個人工異常,這個異常會列印出呼叫棧。

就像之前說過的,被呼叫的合約(發起呼叫的合約也一樣)會擁有嶄新的主存,並能夠訪問呼叫的負載。呼叫負載被儲存在乙個單獨的被稱為calldata的區域。呼叫執行結束後,返回資料將被存放在呼叫方預先分配好的一塊記憶體中。呼叫層數被限制為1024。因此對於更加複雜的操作,我們應該使用迴圈而不是遞迴。

(9)**呼叫和庫

以太坊中存在一種特殊型別的訊息呼叫,被稱為callcode。它跟訊息呼叫幾乎完全一樣,只是載入來自目標位址的**將在發起呼叫的合約上下文中執行。這意味著乙個合約可以在執行時從另外乙個位址動態載入**。儲存,當前位址和餘額都指向發起呼叫的合約,只有**是從被呼叫位址獲取的。這使得solidity可以實現「庫」。可復用的庫**可以應用在乙個合約的儲存上,可以用來實現複雜的資料結構,從而使智慧型合約更加的強大。

2.以太坊的狀態轉換

以太坊的狀態轉換是指在乙個交易(tx)發生時,以太坊從乙個正確狀態(s)轉變到下乙個正確狀態(s』)的轉換過程,如圖2-15所示。對於交易而言,為了防止**的指數型**和無限迴圈,每筆交易需要對執行**所引發的計算步驟做出限制。startgas就是限制,gasprice是每一計算步驟需要支付礦工的費用**。

shell程式設計的核心內容

很多linux 的初學者以前可能用過很多 dos的命令,對 shell 這種命令式的程式語言略知一二,但並沒有接觸很多 shell 的用法,沒能真正抓住這種強大的程式語言的內涵,在這編文章裡,我們用簡短的篇幅使 linux 學習者掌握這門語言。在這篇文章裡,我們不會關注shell 每個命令的具體用法...

shell程式設計的核心內容(2)

本篇文章緊接上篇shell程式設計核心內容 1 shell不僅僅是命令,很多情況,我們可以把它作為一種程式設計的工具,比如,用shell實現乙個學生資訊的管理系統。本文的寫作目的就是讓你在十分鐘內學會shell程式設計。shell程式設計的精髓在於條件測試和分支結構。shell的分支結構與c語言的分...

前端各大框架的核心內容

vue 配置優化 雙向資料繫結 v modal template模板渲染語法和原理 vue loader,虛擬dom 指令和自定義指令 methods computed watch filters class style 條件和迴圈渲染 事件處理 表單處理 元件 屬性 ref生命週期 插槽trans...