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

若是問一塊顯卡它最恨什麼,那麼答案必定是以太坊。
以太坊,礦工爲之瘋狂,顯卡爲之顫抖,遊戲玩家爲之罵娘。

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

且聽我慢慢道來。瀏覽器

臨時分叉

區塊鏈因爲是一種去中心化的技術,全世界全部的礦工同時工做,各自獨立的挖掘知足要求的區塊。因爲是各自獨立的工做,就有可能出現兩個獨立的礦工前後發現了兩個不一樣的知足要求的區塊,就像下面這種狀況,被稱爲臨時分叉網絡

注:箭頭指向某區塊表明它保存了前一個區塊的Hash性能

 

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

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

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

 

 

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

 

叔塊(Uncle Block)

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

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

 

 

不能成爲主鏈一部分的孤兒區塊,若是有幸被後來的區塊經過uncles字段收留進區塊鏈就變成了叔塊。若是一個孤兒區塊沒有被任何區塊收留,這個孤兒區塊仍是會被丟棄,不會進入區塊鏈,也就是說孤兒區塊被收留後纔會變成叔塊。

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

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

 

 

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

數據來源:The ethereum blockchain explorer

 

驅動着程序運行的汽油(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部分。

數據來源:Ethereum Network Status

汽油在現實生活中不是免費的,在以太坊中也不是,要用以太幣購買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,這是錯誤的,「包含叔塊獎勵」指的是將叔塊包含進區塊鏈這個行爲的獎勵,但願你們可以避免踩進這個坑。

 

咱們再來看一個叔塊0x1c2cbba0403f1079dcdb70e5971a87ce0fbc03d4572be30e2d17e4e4a0f136d5,是否是看着挺彆扭,叔塊不方便用高度來表示,由於同一個高度上已經有了個主鏈區塊,就是這麼慘。其實叔塊也是有高度的,叔塊的父區塊的高度+1就是叔塊的高度

直接代入公式:

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

 

題外話

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

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

爲了避免讓這篇文章太長,給你們的閱讀形成不便,先賣個關子,之後我會慢慢把這些坑都填上的。以太坊真的是一個很好的平臺,也在快速發展着,但願你們可以關注它、瞭解它、駕馭它,而不是炒做它並最終毀掉了它。

轉自:https://zhuanlan.zhihu.com/p/28928827

相關文章
相關標籤/搜索