1. 程式人生 > >以太坊(Ethereum ETH)的獎勵機制

以太坊(Ethereum ETH)的獎勵機制

然而,除了購買礦機、連線礦池、賣幣套現之外,是否有人關注過以太坊的獎勵機制呢?

且聽我慢慢道來。

臨時分叉

區塊鏈由於是一種去中心化的技術,全世界所有的礦工同時工作,各自獨立的挖掘滿足要求的區塊。由於是各自獨立的工作,就有可能出現兩個獨立的礦工先後發現了兩個不同的滿足要求的區塊,就像下面這種情況,被稱為臨時分叉

注:箭頭指向某區塊代表它儲存了前一個區塊的Hash

兩位礦工都發現了高度2的區塊,那麼該採用誰的呢?

於是撕逼開始,區塊鏈是個勢利眼,只承認最長的鏈,黃色和綠色的區塊誰先有後繼區塊,變成最長的鏈,誰就會被承認,失敗的就會被拋棄。為了成為最長的鏈,兩個礦工都拼命的把自己挖到的區塊通過廣播的方式告訴更多的節點,並希望他們能把自己的區塊傳播得更廣,從而使更多的礦工在自己挖出的區塊下挖掘下一個區塊,最終讓自己的區塊變成最長鏈的一部分。

然而,勝利者只有一個,勝利者寫歷史,失敗者將被拋棄,其中的交易會重新被打包到之後的區塊中。下面這張圖就是綠色區塊獲得了勝利,黃色區塊成為孤兒區塊,被拋棄。

這種事其實每時每刻都在上演,並不罕見。區塊如果被廢棄了,其中包含的挖礦獎勵怎麼辦呢?對比特幣來說,贏者通吃,失敗者一無所有,竹籃打水一場空。挖出黃區塊的礦工心都要碎了,他在哭泣?。

叔塊(Uncle Block)

以太坊創造了一個新的名詞叔塊(Uncle Block)。對高度3的區塊來說,綠色區塊是他的父區塊。黃色區塊雖然失敗了,但好歹也是高度1的區塊的子區塊,綠區塊的兄弟區塊。於是,高度3的區塊就尊稱這個黃區塊為叔叔,叔塊就是這麼得名的。

注意:虛線部分僅僅用來陳述關係,不表示有實際連線。

不能成為主鏈一部分的孤兒區塊,如果有幸被後來的區塊通過uncles欄位收留進區塊鏈就變成了叔塊。如果一個孤兒區塊沒有被任何區塊收留,這個孤兒區塊還是會被丟棄,不會進入區塊鏈,也就是說孤兒區塊被收留後才會變成叔塊。

以太坊的設計比比特幣人性的多,叔塊也是可以獲得獎勵的,礦工們再也不用擔心白忙乎了。而且以後的區塊誰要是把叔塊收留了,收留了叔塊的區塊還有額外的獎勵,收留叔塊也被稱為包含叔塊。

下圖就是高度3的區塊包含了一個叔塊,不過叔塊也就僅僅是被包含而已,叔塊中的交易會重新迴歸交易池,等待重新打包。一個區塊最多隻能包含2個叔塊。

以太坊為什麼要這麼設計呢?因為以太坊的區塊時間是20秒左右,相對於比特幣,更容易出現臨時分叉和孤兒區塊。而且較短的區塊時間,也使得區塊在整個網路中更難以充分傳播,尤其是對那些網速慢的礦工,這是一種極大的不公平。為了平衡各方利益,才設計了這樣一個叔塊機制。叔塊在全部挖掘出來的區塊中佔的比例叫叔塊率,目前叔塊率在9.7%左右。

驅動著程式執行的汽油(Gas)

以太坊是一個執行智慧合約的去中心化平臺,提供了一個以太坊虛擬機器(Ethereum Virtual Machine),簡稱EVM,開發者可以在其上開發各種應用。你可以把這個EVM想像成你的電腦,它能夠執行一些以太坊定義的指令。與比特幣的指令碼引擎不同,以太坊的EVM功能非常強大,號稱“圖靈完備”。先不管什麼是“圖靈完備”,你只要知道“圖靈完備”的虛擬機器可以實現迴圈語句,有了迴圈就一定會有小壞蛋或者不合格的程式設計師弄出死迴圈,電腦死迴圈了大不了宕機,重啟就好,不過以太坊是去中心化的,EVM要是死迴圈了,可沒法重啟。

有沒有辦法能解決這個問題呢?

很遺憾,這個問題很多年前就有人研究過了,叫圖靈停機問題(The Halting Problem),已經證明不存在一種能夠檢測程式是否會死迴圈的方法。

既然不能檢測,還有沒有別的方法阻止死迴圈呢?

在加油站加油的空閒,以太坊的開發者們陷入了沉思,自言自語道:為什麼汽車不會一直暴走停不下來?“因為會沒油!”加油的師傅邊拔出加油槍邊說。

這個故事只是我自己腦補的,增加點兒趣味性。

如果讓EVM上的程式的每條指令都要消耗一點兒“資源”,“資源”用光了,無論程式執行完沒有,都會被強行終止,這樣無論是不是死迴圈都沒關係了。

這個執行程式時要消耗的資源就被稱為汽油(Gas),每一條指令都要消耗不同數量的汽油。

舉幾個例子:

  • ADD:加法操作 3Gas
  • MUL:乘法操作 5Gas
  • SUB:減法操作 3Gas
  • DIV:除法操作 5Gas
  • HASH:計算雜湊值 30Gas

越複雜的運算,需要消耗的Gas越多,只要給程式加上一個消耗Gas的上限,就可以防止程式出現死迴圈而不能停止的情況了。同時,以太坊還給每個區塊包含的程式消耗的總Gas設定了上限,以免區塊中包含的程式過多,影響一些效能比較弱的節點。每個區塊能消耗的Gas上限也是可以調整的,由礦工們進行投票決定,目前是6725538Gas,也就是下圖中的GAS LIMIT部分。

汽油在現實生活中不是免費的,在以太坊中也不是,要用以太幣購買Gas。每個程式都會給出他們願意用多少以太幣購買1單位的Gas,這被稱為汽油價格(Gas Price)。

每個程式需要為Gas支付的以太幣可以用如下公式計算:

Gas花費 = 消耗的Gas數量 x Gas的價格

你願意支付的Gas價格越高,你的交易就會越快被礦工打包,這和比特幣的交易費很類似。

以太坊的區塊獎勵

前面介紹了叔塊和Gas,下面進入核心部分,以太坊的獎勵機制。前面已經說過了,以太坊的區塊有兩種,普通區塊和叔塊,我們需要分情況來討論每種區塊的獎勵。

普通區塊獎勵:

  • 固定獎勵5ETH,每個普通區塊都有
  • 區塊內包含的所有程式的Gas花費的總和
  • 如果普通區塊包含了叔塊,每包含一個叔塊可以得到固定獎勵5ETH的1/32,也就是0.15625ETH。

叔塊獎勵

叔塊的獎勵計算有些複雜,公式為:

叔塊獎勵 = ( 叔塊高度 + 8 - 包含叔塊的區塊的高度 ) * 普通區塊獎勵 / 8

實踐一下

首先感謝一下 

@江左小梅

 是他讓我知道了一個很好的以太坊區塊瀏覽器Ethereum Blocks Information,這個瀏覽器可以很詳細的檢視每個區塊的獎勵。

我們來看一個剛挖出來的區塊4222300,由於我們是在主鏈上看到它的,所以它是普通區塊。

它的獎勵包含三部分:

固定獎勵:5ETH

Gas總花費(也有人稱之為交易費):0.281837168043699381ETH

將兩個叔塊包含進來的獎勵:5 * ( 1 / 32 ) * 2 = 0.3125ETH

這裡有一點要注意,官方文件中的原文是“an extra reward for including uncles as part of the block”,我在2015年剛接觸以太坊時不少網上的文章直接說成了“包含叔塊獎勵”,使我誤以為是得到與挖掘出這些叔塊得到的獎勵等同數額的獎勵,也就是上圖中的Uncles Reward:8.75ETH,這是錯誤的,“包含叔塊獎勵”指的是將叔塊包含進區塊鏈這個行為的獎勵,希望大家能夠避免踩進這個坑。

直接代入公式:

( 4222271 + 8 - 4222272 ) * 5 / 8 = 4.375ETH

題外話

獎勵機制就說到這裡,細心的讀者有沒有發現前面挖了個坑:

  • “每個區塊能消耗的Gas上限也是可以調整的,由礦工們進行投票決定”,這個投票調整的過程是怎樣的呢?

為了不讓這篇文章太長,給大家的閱讀造成不便,先賣個關子,以後我會慢慢把這些坑都填上的。以太坊真的是一個很好的平臺,也在快速發展著,希望大家能夠關注它、瞭解它、駕馭它,而不是炒作它並最終毀掉了它。