以太坊運行原理筆記:?
(參考以太坊黃皮書)
那么既然是區塊鏈,必然是從創世區塊開始(Genesis),創世區塊有一個最初的原始狀態,通過交易,狀態逐步改變至最終的狀態,也就是理解為基于交易的狀態機。(黃皮書中定義)。交易是狀態改變的橋梁。
挖礦是為爭奪記賬權,且獲得獎勵。那么挖礦作為狀態轉換函數來實現。?
以太坊挖礦者在區塊鏈狀態中獲取隨機數據,計算一些從區塊鏈最后的N個區塊中隨機選擇的交易,然后返回結果散列。?
先來看看以太坊的挖礦流程:
每一個區塊中,通過區塊頭來生成一個seed,這個seed稱為種子,種子只和當前的區塊有關。
種子產生一個16MB的偽隨機緩存。
基于上述的緩存,那么再生成一個1GB的DAG數據集。緩存和數據集存在依賴關系,一般來說數據集依賴緩存的某些元素,那么簡單來說的話,就是只要有緩存,即可計算出數據集DAG中指定位置的元素。
礦工所做的事情,就是在數據集DAG中隨機去選擇元素,且對其進行散列的一個過程。就個比特幣中區尋找nonce一樣的模式。
那么對比比特幣的挖礦,以太坊目前只需要驗證者花費一定數量的緩存即可,驗證指定元素的散列是不是小于某個散列值。
緩存和數據集DAG每增加30000個區塊更新一次,故礦工的精力應該是在讀取數據集上而不是去改變。
這種方式的優點,以太坊中的智能合約會有任何種類的計算,這樣ASIC就是一個提供計算的的專門的集成電路。就類似一個全球計算機的CPU。然后挖礦中要求保存全節點完整的區塊鏈。
以太坊在計劃過度到POS機制,那么以太坊的POS機制先用V神的一段話來說明:POS協議,每個人都是“礦工”,因此,除非他們選擇通過放棄以太幣來違反規則,否則每個人都必須承擔確認和驗證交易的責任,從本質上來說,這才是去中心化的管理模式,能夠提高利益相關者在網絡中的參與度。
以太幣:那么以太幣的來源包括以下幾部分:
礦前獎勵:預付款給與貢獻者6000萬個以太幣
區塊的獎勵:目前挖出一個區塊獎勵5個以太幣給礦工。
叔塊獎勵:這個和比特幣不同,礦工在挖出一個區塊后,但是并不是在主鏈上,那么這個區塊叫做叔區。如果這個叔區塊在后續挖礦中作為叔區塊被引用了,那么挖出這個區塊的礦工獲得7/8的區塊獎勵,也就是4.375個以太幣,且另外引用這個區塊的礦工獲得0.15個以太幣,注意,這里的引用最多兩個。
比特幣的總量是2100萬個,每年以太幣發行1800萬。之前筆者文章中有提到過,這個數字貨幣因為密鑰的丟失,所以每年的發行和意外的丟失會達到一個動態的平衡。并不是你看官方數據有多少就真正有多少在流通,這個應該能理解。
從礦工的角度來看待以太幣,那么就分為三塊:
挖礦的獎勵,這個還是5個以太幣。(固定收益)
交易的手續費,之前就有人一直在問萬一哪天比特幣2100萬挖完之后,挖礦如何獲得收益,那么交易費就是其中的一項收益,以太坊上交易都會帶上交易費用,那么這個也就是礦工的一部分所得。(動態收益)
叔區塊收益,上文就提到過的,這個區塊如果有叔區塊,那么從叔區塊中獲得1/32個以太幣也就是0.15個以太幣的收益。且每個區塊至多引用兩個叔區塊,被引用過的區塊不能再被引用。(動態收益)
以太幣的單位:?
基本單位為wei,下表具體是各個比例:
單位維度個數 (wei)
wei1 wei1000
Kwei1e3 wei1000000
Mwei1e6 wei1000000000
Gwei1e9 wei1000000000000
microether1e12 wei10000000000000000
milliether1e15 wei10000000000000000000
ether1e18 wei10000000000000000000000
狀態
世界狀態:世界狀態(state)是在地址(160位的標識符)和賬戶狀態(序列化為RLP的數據結構)的映射。在實施過程中會映射維護在一個修改的Merkle Patricia樹上。后端有一個后端數據庫去維護映射,稱為狀態數據庫。
這個結構的根節點基于密碼學依賴所有內部數據的,它的hash作為整個系統狀態的一個安全標識
通過改變根節點的hash來恢復一個先前的狀態,因為在區塊鏈中存儲了所有這樣的根節點hash值。可以恢復到特定的歷史狀態。
賬戶狀態包括:
nonce:當前賬戶地址發出的交易數量、或者該賬戶創建的合約數量。
balance:賬戶余額。
storageRoot:保存賬戶存儲的Merkle Patricia樹的根節點256位hash,256位整數鍵值的Keccak 256位hash值到256位整數值的RLP編碼的映射。
codeHash:該賬戶的EVM代碼hash值,該地址接收一個消息調用時候,代碼執行,創建后不可更改。?
(來自黃皮書)
交易消息
交易?
以太坊的交易最直觀解釋:從外部賬戶發送到區塊鏈上的另一個賬戶的消息和簽名的數據包。?
包含如下內容:
發送者的簽名
接收的地址
轉移的數字貨幣數量等內容
以太坊上的交易都是需要支付費用,和比特幣以比特幣來支付一定的交易費用不同,以太坊上固定了這個環節,那么這個間接理解是以太坊的一種安全防范錯誤,防止了大量的無意義的交易,保證一定的安全性,特別是智能合約的創建、執行、調用都需要消耗費用,那么也保證了整個系統的穩定性,防止了一些鏈上無意義的惡意行為。
交易手續費
以太坊的核心是EVM,以太坊虛擬機,那么在EVM中執行的字節碼都是要支付費用。也就是經常看到的Gas、Gas limit、Gas Price這幾個概念。
Gas:字面理解就是汽油,以太坊和日常的汽車一樣需要Gas才能運行。Gas是一筆交易過程中計算消耗的基本單位。有一個列表可以直觀看到在以太坊中操作的Gas消耗量:
操作Gas消耗具體內容
step1執行周期的默認費用。
stop0終止操作是免費的。
suicide0智能合約賬戶的內部數據存儲空間,當合約賬戶調用suicide()方法時,該值將被置為null。
sha320加解密
sload20在固定的存儲器中去獲取
sstore100輸入到固定的存儲器中
balance20賬戶余額
create100創建合約
call20初始化一個只讀調用
memory1擴充內存額外支付的費用
txdata5交易過程中數據或者編碼的每一個字節的消耗
transaction500交易費用
contract creation53000homestead中目前從21000調整到53000
所以有些公司或者個人覺得區塊鏈技術去中介化,不需要中心服務器,這種開發模式是比較便宜的,但是事實上區塊鏈的開發不比之前的那些傳統軟件開發來的便宜。
Gas Price:字面理解汽油價格,這個就像你去加油站,95#汽油今天是什么價格。一個Gas Price就是單價,那么你的交易費用=Gas*Gas Price,然后以以太幣來ether來支出。當然你覺得我不想支付費用,你可以設置Gas Price為0,但是選擇權在礦工手中,礦工有權選擇收納交易和收取費用,那么最簡單的想想很難讓一個礦工去接收一個價格很低的交易吧。另外提一句,以太坊默認的Gas Price是1wei。
Gas Limit:字面理解就是Gas的限制,限制是必要的,沒有限制就沒有約束。這個Gas Limit是有兩個意思的。首先針對單個交易,那么這個表示交易的發起者他愿意支付最多是多少Gas,這個交易發起者在發起交易的時候需要設置好。還有一個是針對區塊的Gas Limit,一個單獨的區塊也有Gas的限制。
具體交易
以太坊上交易可以是簡單的以太幣的轉移,同時也可以是智能合約的代碼消息。列個表格看下交易的具體內容:
代碼內容
from交易發起者的地址、不能為空,源頭都沒有不合理。
to交易接收者的地址(這個可以為空,空的時候就表示是一個合約的創建)
value轉移的以太幣數量
data數據字段。這個字段存在的時候表示的是,交易是一個創建或者是一個調用智能合約的交易
Gas Limit字面理解就是Gas的限制,限制是必要的,沒有限制就沒有約束。這個Gas Limit是有兩個意思的。首先針對單個交易,那么這個表示交易的發起者他愿意支付最多是多少Gas,這個交易發起者在發起交易的時候需要設置好。還有一個是針對區塊的Gas Limit,一個單獨的區塊也有Gas的限制。
Gas Price一個Gas Price就是單價,那么你的交易費用=Gas*Gas Price,然后以以太幣來ether來支出。以太坊默認的Gas Price是1wei。
nonce用于區別用戶發出交易的標識。
hash交易ID,是由上述的信息生成的一個hash值
r、s、v交易簽名的三部分,交易發起者的私鑰對hash簽名生成。
交易分三種類型
轉賬:簡單明了的以太坊上的以太幣的轉移,就和比特幣類似,A向B轉移一定數量的以太幣。這種交易包含:交易發起者、接收者、value的數量,其余類似Gas Limit、hash、nonce都會默認生成。
智能合約創建:創建智能合約就是把智能合約部署到區塊鏈上,那么這個時候to是一個空的字段。data字段則是初始化合約的代碼。
智能合約執行:合約創建部署在區塊鏈上,那么執行就是會加上to字段到要智能合約執行的地址,然后data字段來指定調用的方法和參數的傳遞。
消息
合約之間可以發生“消息”,消息是虛擬對象,不會序列化,存在于以太坊的執行環境中,消息一般包括如下:
發送者
接收者
以太幣數量
可選數據字段
一個startgas
消息類似交易,但是交易是由一個合約產生,在以太坊環境中,但執行某些代碼的合約的時候,在call函數時候,會產生并執行一個消息。消息觸發接收方賬戶運行代碼,理解為合約之間的互相作用。