以太坊學習-附帶黃皮書摘要

以太坊運行原理筆記:?

(參考以太坊黃皮書)


那么既然是區塊鏈,必然是從創世區塊開始(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函數時候,會產生并執行一個消息。消息觸發接收方賬戶運行代碼,理解為合約之間的互相作用。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容