天天看點

以太坊白皮書閱讀筆記+随想以太坊

上次的關于比特币的文章其實有很大一部分是參考以太坊白皮書的前半部分的分析,這篇文章在上一篇的基礎上重點說一下以太坊與比特币的差別。以及以太坊的主要實作邏輯。

以太坊

以太坊模型說明

狀态機

以太坊的本質就是一個基于交易的狀态機(transaction-based state machine)。在計算機科學中,一個狀态機是指可以讀取一系列的輸入,然後根據這些輸入,會轉換成一個新的狀态出來的東西。
以太坊白皮書閱讀筆記+随想以太坊

根據以太坊的狀态機,我們從創世紀狀态(genesis state)開始。這差不多類似于一片空白的石闆,在網絡中還沒有任何交易的産生狀态。當交易被執行後,這個創世紀狀态就會轉變成最終狀态。在任何時刻,這個最終狀态都代表着以太坊目前的狀态。

以太坊白皮書閱讀筆記+随想以太坊

以太坊的目标

密碼學貨币上建立進階應用的三種方法:

- 建立一個新的區塊鍊

- 在比特币區塊鍊上使用腳本

- 在比特币區塊鍊上建立元币協定

- 建立新區塊鍊的方法可以自由地實作任意的特性,成本是開發時間和培育努力。使用腳本的方法非常容易實作和标準化,但是它的能力有限。元币協定盡管非常容易實作,但是存在擴充性差的缺陷。在以太坊系統中,以太坊的目的是建立一個能夠同時具有這三種模式的所有優勢的通用架構。

以太坊的目的是基于腳本、競争币和鍊上元協定(on-chain meta-protocol)概念進行整合和提高,使得開發者能夠建立任意的基于共識的、可擴充的、标準化的、特性完備的、易于開發的和協同的應用。以太坊通過建立終極的抽象的基礎層-内置有圖靈完備程式設計語言的區塊鍊-使得任何人都能夠建立合約和去中心化應用并在其中設立他們自由定義的所有權規則、交易方式和狀态轉換函數。域名币的主體架構隻需要兩行代碼就可以實作,諸如貨币和信譽系統等其它協定隻需要不到二十行代碼就可以實作。智能合約-包含價值而且隻有滿足某些條件才能打開的加密箱子-也能在我們的平台上建立,并且因為圖靈完備性、價值知曉(value-awareness)、區塊鍊知曉(blockchain-awareness)和多狀态所增加的力量而比比特币腳本所能提供的智能合約強大得多。

區塊鍊結構

在以太坊交易完成時,都被礦工打包到一個區塊中,也就是說一個區塊包含一系列交易,而每個區塊的頭部又指向上一個區塊,這中間的連結與區塊組合起來就是我們說的區塊鍊。

以太坊白皮書閱讀筆記+随想以太坊

以太坊賬戶

概述

以太坊的狀态是由賬戶之間進行交易(轉移價值和資訊的狀态轉換結構)構成的。賬戶包含了四個部分:

  • 随機數,用于确定每筆交易隻能被處理一次的計數器
  • 賬戶目前的以太币餘額
  • 賬戶的合約代碼(如果有的話)
  • 賬戶的存儲(預設為空)

賬戶的源碼定義如下:

typeAccountstruct
{

        Nonce    uint64

        Balance  *big.Int

        Root     common.Hash//merklerootofthestoragetrie

        CodeHash[]byte 
}
           
  • Nonce:如果目前賬戶為EOA,則Nonce為發送的交易序号;如果目前賬戶為CA,則Nonce為合約建立的序号。
  • Balance:賬戶餘額,表示賬戶所對應位址的餘額。
  • Root:存儲Merkle Patricia樹的根節點Hash值(我們後面在解釋Merkle樹),在EOA中,此字段為空。
  • CodeHash:賬戶綁定的EVM code的hash值,對于合約賬戶,就是被Hash的代碼并作為codeHash儲存;在EOA中,此字段為空。

外部賬戶(EOA)

一般自然人配置設定的賬戶,被私鑰控制且沒有任何代碼與之關聯。

以太坊白皮書閱讀筆記+随想以太坊

合約賬戶(CA)

給智能合約配置設定的賬戶,被合約代碼控制且有代碼與之關聯。

以太坊白皮書閱讀筆記+随想以太坊

EOA 與 CA的比較

兩個EOA之間的消息傳遞隻是一個簡單的價值轉移。但是一個EOA到CA的消息則會激活CA内部的代碼,允許執行各種動作(比如轉移代币,寫入内部存儲,挖出一個新代币,執行一些運算,建立一個新的合約等等),是以以太坊要比比特币的應用場景更廣(下文會提到以太坊的幾個應用場景)

以太坊白皮書閱讀筆記+随想以太坊

而對于CA來說,它不能自己發起一個交易。相反隻能接收到一個EOA發起的交易之後,激活代碼而觸發對另一個CA的交易。

以太坊白皮書閱讀筆記+随想以太坊
外部所有的賬戶沒有代碼,人們可以通過建立和簽名一筆交易從一個外部賬戶發送消息。每當合約賬戶收到一條消息,合約内部的代碼就會被激活,允許它對内部存儲進行讀取和寫入,和發送其它消息或者建立合約。

是以,以太坊上的任何交易都是被EOA所觸發的。

消息和交易

以太坊消息和比特币交易的不同點

  • 以太坊的消息可以由外部實體或者合約建立,然而比特币的交易隻能從外部建立
  • 以太坊消息可以選擇包含資料
  • 如果以太坊消息的接受者是合約賬戶,可以選擇進行回應,這意味着以太坊消息也包含函數概念

交易(Transaction)

交易存儲了發送者要發送至以太坊網絡的經過簽名的資訊,它其中包含了從一個賬戶要傳遞給另一個賬戶(或者合約)的資訊。在以太坊中,有兩種類型的交易:一種是能夠産生消息調用的交易,另一種是能夠生成新賬戶的交易(比如說生成合約)。
交易的組成
  • 交易的接收者
  • 簽名(用以核實交易已發送者身份)
  • value值(發送的以太币數量,以wei為機關)
  • 可選資料域
  • STARTGAS值
  • GASPRICE值
交易中的字段

黃皮書對交易的描述

A piece of data, signed by an External Actor. It represents either a Message or a new Autonomous Object. Transactions are recorded into each block of the blockchain.

由外部參與者簽名後的一段資料。它代表了一條資訊或者一個新建立的自治對象(合約)。交易會被記錄至區塊鍊的區塊中。

根據以太坊黃皮書,交易具有以下字段:

  • nonce:該字段表示的是交易發送者的交易序列号,它是賬号的一個交易計數器,這個字段能夠防止重播攻擊(replay attack)。
  • gasPrice:gas的價格,用于計算交易費用
  • gasLimit:執行這筆交易所花費的gas的上限
  • to:交易接收者的位址或者合約的位址
  • value:要發送的以太币數量,以wei為機關
  • v, s, r:簽名相關的參數,通過這三個參數可以得到發送者的公鑰和位址(更詳細的内容參見以太坊黃皮書附錄F)

如果該交易是由合約建立的,還可能包含如下字段:

  • init:用于初始化交易的EVM(以太坊虛拟機)操作碼
  • data:資料域(理論上資料域的大小是不受限制的)
以太坊白皮書閱讀筆記+随想以太坊

消息(Message)

先看黃皮書上的一段話:

Data (as a set of bytes) and Value (specified as Ether) that is passed between two Accounts, either through the deterministic operation of an Autonomous Object or the cryptographically secure signature of the Transaction.

在兩個賬戶之間傳輸的資料(一組位元組)和值(以太币的數量),形式是合約的确定性操作或者經過了加密安全簽名的交易。

是以我的了解是:消息應該是包含交易的,引用中的“形式是合約的确定性操作或者經過加密安全簽名的交易”的前半部分指的是由合約發出的、永遠不會被記錄到區塊鍊當中的、“虛拟”的事物,并且可以将此類消息看做在EVM中的函數調用;而後半部分指的是被永久記錄在鍊上的、由外部賬戶(EOA)觸發的交易。

費用(fees)與瓦斯(gas)

這兩個概念比較好了解,費用就是在每筆交易進行的時候,收取的“手續費”;而瓦斯則是用于支付費用的材料,以“gwei”進行衡量,這裡有兩個換算公式:

1Ether=1018Wei 1 E t h e r = 10 18 W e i

1gwei=109Wei 1 g w e i = 10 9 W e i

對每個交易,發送者設定gas limit和gas price。gas limit和gas price就代表着發送者願意為執行交易支付的Wei的最大值。

例如,假設發送者設定gas limit為50,000,gas price為20gwei。這就表示發送者願意最多支付50,000*20gwei = 1,000,000,000,000,000 Wei = 0.001 Ether來執行此交易。

以太坊白皮書閱讀筆記+随想以太坊

記住gas limit代表使用者願意花費在gas上的錢的最大值。如果在他們的賬戶餘額中有足夠的Ether來支付這個最大值費用,那麼就沒問題。在交易結束時任何未使用的gas都會被傳回給發送者,以原始費率兌換。

以太坊白皮書閱讀筆記+随想以太坊

在發送者沒有提供足夠的gas來執行交易,那麼交易執行就會出現“gas不足”然後被認為是無效的。在這種情況下,交易處理就會被終止以及所有已改變的狀态将會被恢複,最後我們就又回到了交易之前的狀态—完完全全的之前狀态就像這筆交易從來沒有發生。因為機器在耗盡gas之前還是為計算做出了努力,

是以理論上,在gas limit 不夠并且還執行交易的情況下,将不會有任何的gas被傳回給發送者(因為運作到一半就消耗光了,是以交易終止,狀态還原)。

以太坊白皮書閱讀筆記+随想以太坊

這些gas的錢到底去了哪裡?發送者在gas上花費的所有錢都發送給了“受益人”位址,通常情況下就是礦工的位址。因為礦工為了計算和驗證交易做出了努力,是以礦工接收gas的費用作為獎勵。

以太坊白皮書閱讀筆記+随想以太坊

通常,發送者願意支付更高的gas price,礦工從這筆交易總就能獲得更多的價值。是以,礦工也就更加願意選擇這筆交易。這樣的話,礦工可以自由的選擇一筆交易自己願意驗證或忽略。為了引導發送者應該設定gas price為多少,礦工可以選擇建議一個最小的gas值他們願意執行一個交易。

存儲也有費用,gas不僅僅是用來支付計算這一步的費用,而且也用來支付存儲的費用。存儲的總費用與所使用的32位位元組的最小倍數成比例。

存儲費用有一些比較細微的方面。比如,由于增加了的存儲增加了所有節點上的以太坊狀态資料庫的大小,是以激勵保持資料存儲量小。為了這個原因,如果一個交易的執行有一步是清除一個存儲實體,那麼為執行這個操作的費用就會被放棄,并且由于釋放存儲空間的退款就會被傳回給發送者。

注意, gas limit是由原始交易的外部建立者決定的(也就是外部擁有賬戶)。是以,在合約之間的消息傳遞是不會發生收取費用的,也就是說内部交易或者消息不包含gasLimit 。

一些體會

在閱讀白皮書的時候同時又查閱了很多資料,這中間最讓我感到疑惑的就是消息與交易的差別,這個實在是一頭霧水,隻能說有一個初步的了解,不過決定不再細摳概念了,還是嘗試着自己寫寫代碼吧,可能會有一些收獲。

還有就是為什麼沒有寫以太坊的挖礦過程,首先,以太坊的挖礦過程幾乎和比特币一樣,有時間我會把我的另一篇關于比特币的文章再充實一下;再者,針對對區塊鍊挖礦的過程會有更優秀的一些文章講的更詳細,我就沒太大必要去寫了;最後,挖礦其實不是一個很難了解的過程,讀者應該随便找一些資料就可以了解了。