以太坊入門學習-運行原理四

以太坊運行原理筆記:

(參考以太坊黃皮書)

合約創建

以太坊入門學習-運行原理四

之前的文章說到過外部賬戶和合約賬戶,那麼合約的創建,理解為以創建合約賬戶為交易。

那麼首先是來初始化一個合約賬戶。

合約賬戶中有相關下列參數:發送者、原始交易人、可用的gas、gas單價、初始費用,任意長度的字節數組、EVM的初始化代碼、合約常見當前的棧深度、狀態更改許可。

新的合約賬戶地址是一個hash值的最右側的160位,通過發送者的地址和賬戶的nonce(nonce使用時候減去1,認為在這個調用之前對發送者的nonce加1,在一個可靠交易執行或者虛擬機操作開始會對這個發送者的nonce加1)進行RLP編碼後,再經過Keccak HASH計算來獲得。

通過狀態轉換,賬戶初始nonce設置為1,balance交易傳出的值,storage為空,codehash為空的Keccak 256位的hash值,減去發送者相應轉賬值,狀態變化。通過evm代碼來執行。

代碼的執行過程中會有gas的消耗,必須要有足夠的gas,那麼gas不足,出現out-of-gas異常,gas變為0,合約創建是當做交易來處理,那麼不影響合約創建的固定費用的支付,但是gas不足後附帶的金額不會轉移到取消的的合約地址,剩餘的gas返還給最原始的交易發起人,狀態也改變。

消息調用

消息調用中有相關下列參數:發送者、交易發起人、接收者、執行代碼的賬戶、可用的gas、轉賬金額、gas單價、函數調用輸入的數據、消息調用合約創建當前棧深度、狀態更改許可。

消息調用中有一個額外的元素-由字節數組形式表示的輸出數據,在執行交易過程中輸出數據是被忽略了,那麼在消息調研中vm代碼執行產生,在這種情況下使用這些信息。

就像合約創建一樣,如果消息通信執行退出是因為gas不足或交易無效(例如棧溢出,無效跳轉目的地或無效指令),那麼已使用的gas是不會被退回給原始觸發者的。相反,所有剩餘的未使用gas也會被消耗掉,並且狀態會被立刻重置為餘額轉移之前的那個點。沒有任何方法停止或恢復交易的執行而不讓系統消耗你提供的所有gas,直到最新的以太坊更新。例如,假設你編寫了一個合約,當調用者沒有授權來執行這些交易的時候拋出一個錯誤。在以太坊的前一個版本中,剩餘的gas也會被消耗掉,並且沒有任何gas退回給發送者。但是拜占庭更新包括了一個新的“恢復”代碼,允許合約停止執行並且恢復狀態改變而不消耗剩餘的gas,此代碼還擁有返回交易失敗原因的能力。如果一個交易是由於恢復而退出,那麼未使用的gas就會被返回給發送者。

在消息調用的通用執行框架中,會有8個所謂的預編譯合約、地址1-8分別是橢圓曲線公鑰恢復函數、SHA2 256 位哈希方案、RIPEMD 160 位哈希方案、標識函數、任

意精度的模冪運算、橢圓曲線加法、橢圓曲線純量乘法和橢

圓曲線配對檢查。

執行模型

執行模型使用一系列的字節代碼指令和一個環境數據的元組去改變系統狀態,使用以太坊虛擬機EVM運行,通過gas來限制。

EVM是圖靈完備虛擬機器。EVM存在而典型圖靈完備機器不存在的唯一限制就是EVM本質上是被gas束縛。因此,可以完成的計算總量本質上是被提供的gas總量限制的。EVM具有基於堆棧的架構。堆棧機器 就是使用後進先出來保存臨時值的計算機。

EVM的存儲方式有三種:

  • 棧(Stack)
  • 賬戶存儲(Storage)
  • 內存(Memory)

有一定計算機基礎的應該理解。棧是常見的線性數據結構,先進後出的模式。EVM基於棧的虛擬機,那麼所有的運算都在棧上,一個棧之前提到是256bit。賬戶存儲和內存將EVM的賬戶存儲和內存類比成我們通常看到的計算機的硬盤和內存。

  • EVM中每個堆棧項的大小為256bit,堆棧有一個最大的大小,為1024bit。
  • EVM有內存,項目按照可尋址字節數組來存儲。內存是易失性的,也就是數據是不持久的。
  • EVM也有一個存儲器。不像內存,存儲器是非易失性的,並作為系統狀態的一部分進行維護。EVM分開保存程序代碼,在虛擬ROM 中只能通過特殊指令來訪問。這樣的話,EVM就與典型的馮·諾依曼架構 不同,此架構將程序的代碼存儲在內存或存儲器中。

EVM同樣有屬於它自己的語言:“EVM字節碼”,當一個程序員比如你或我寫一個在以太坊上運行的智能合約時,我們通常都是用高級語言例如Solidity來編寫代碼。然後我們可以將它編譯成EVM可以理解的EVM字節碼。(摘自以太坊工作原理)

那麼問題來了,代碼在EVM中執行,以太坊網絡中每個節點都有一個EVM,的確是每個節點的EVM都會去工作,必須通過在EVM中執行代碼來驗證區塊的結果狀態。這樣通常理解就是大量的計算資源的浪費,那麼從安全性的方面來考慮,在一個去中介化的區塊鏈系統中,這個是保證整體的安全性的必要操作。當然每個節點在執行過程中會出現不同的情況,但是在區塊鏈系統中必須要達到完全的一致,這就使得EVM和智能合約存在一定的侷限性。出現不確定的結果無法達成共識。這種場景下必須再次同步區塊達成一致性。

EVM有專門的指令集,包括了一般常見的算術運算、位運算、邏輯運算、條件判斷等,針對區塊鏈架構還要專門的合約訪問區塊號,區塊時間戳等指令。所有的指令以256bit位單位來傳遞。智能合約的編譯就是講高級語言寫的代碼編譯為指令集字節碼。

以太坊入門學習-運行原理四


分享到:


相關文章: