1. 程式人生 > >以太坊分析之 挖礦

以太坊分析之 挖礦

以太坊介紹

以太坊(Ethereum)是一個建立在區塊鏈技術之上,去中心化應用平臺。它允許任何人在平臺中建立和使用通過區塊鏈技術執行的去中心化應用。

共識機制

區塊鏈是一個去中心化的分散式賬本。去中心化就表示區塊鏈網路中的每個節點是分散和獨立的,同時又要保證整體的一致性(包括資料和行為),這就是共識,所以共識機制,就是在一個時間段內對事物的前後順序達成共識的一種演算法。

區塊鏈中的情況是非常複雜,節點數量眾多,每個節點的網路情況各不相同,其中會摻雜很多惡意的節點企圖從中獲取私立,如何保證整個區塊鏈網路正常平穩的執行,共識機制是至關重要的一環。

區塊鏈共識機制其中一個經典問題就是拜占庭將軍問題,理解這個問題就可以更加理解區塊鏈和比特幣挖礦的執行機制。

拜占庭將軍問題的描述如下:

拜占庭帝國想要進攻一個強大的敵人,為此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。這10支軍隊在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊(一半以上)同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通訊兵騎馬相互通訊來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不確定他們中是否有叛徒,叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們才能保證有多於6支軍隊在同一時間一起發起進攻,從而贏取戰鬥?

具體可以參考http://baijiahao.baidu.com/s?id=1591728006111720793&wfr=spider&for=pc

         對於拜占庭將軍問題的解決方案,比特幣創造性地引入工作量證明(POW : Proof of Work。通過工作量證明就增加了傳送資訊的成本,降低節點發送訊息速率,這樣就以保證在一個時間只有一個節點(或是很少)在進行廣播,同時在廣播時會附上自己的簽名。

拜占庭將軍問題在POW方案中有幾個條件:

1.一位將軍A在向其他的將軍(BCD…)發起一個進攻提議一樣,將軍BCD…看到將軍A簽過名的進攻提議書,如果是誠實的將軍就會立刻同意進攻提議,而不會發起自己新的進攻提議。

2. 假設攻下一個城堡需要多次的進攻,每次進攻的提議必須基於之前最多次數的勝利進攻下提出的(只有這樣敵方已有損失最大,我方進攻勝利的可能性就更大),這樣約定之後,將軍

A在收到進攻提議時,就會檢查一下這個提議是不是基於最多的勝利提出的,如果不是(基於最多的勝利)將軍A就不會同意這樣的提議,如果是的,將軍A就會把這次提議記下來。

工作量證明其實相當於提高了做叛徒(釋出虛假區塊)的成本,在工作量證明下,只有第一個完成證明的節點才能廣播區塊,競爭難度非常大,需要很高的算力,如果不成功其算力就白白的耗費了(算力是需要成本的),如果有這樣的算力作為誠實的節點,同樣也可以獲得很大的收益(這就是礦工所作的工作),這也實際就不會有做叛徒的動機,整個系統也因此而更穩定。

很多人批評工作量證明造成巨大的電力浪費,促使人們去探索新共識機制,目前主要的共識機制演算法有:

  • 工作量證明(POW
  • 權益證明(POS
  • 股份授權證明(DPOS
  • 瑞波共識機制(Ripple Consensus
  • 授權拜占庭容錯機制(dBFT
  • 實用拜占庭容錯演算法(pBFT

以太坊挖礦

         當共識機制是使用POW工作量證明演算法,那麼區塊鏈網路中的節點就需要提供算力去競爭區塊,從而來維持區塊鏈的執行,系統也會給競爭到區塊的節點一定的獎勵,這個過程被形象地稱為挖礦,這些競爭者也就稱為曠工。

以太坊的釋出分成了四個階段,即Frontier(前沿)、Homestead(家園)、Metropolis(大都會)和Serenity(寧靜),在前三個階段以太坊共識演算法採用工作量證明機制(POW),在第四階段會切換到權益證明機制(POS)。所以在目前階段以太坊仍然處於POW的階段。

熟悉以太坊歷史的話,可以知道以太坊是通過比特幣進行眾籌(也就是ICO)來實現發行的。2014724日起,在為期42天的眾籌期間,以太坊眾籌地址共收到8,947個交易,來自8,892個不重複的地址(有兩個地址是在眾籌時間段之外支付的,所以這兩個地址不能獲得以太幣)。通過此次眾籌,以太坊專案組籌得31,529.356,395,51BTC,當時價值約1800w美元,0.8945BTC被銷燬,1.7898BTC用於支付比特幣交易的礦工手續費。同時,以太坊釋出後,需要支付給眾籌參與者共計60,108,506.26以太幣。在眾籌成功一年後的2015730日,以太坊正式釋出。創世區塊中包含了8893個交易。所以太坊中的以太幣並不全是礦工挖掘出來的,有大約7200w以太幣是在創世時就已經創造出來了。可以在https://etherscan.io/stat/supply查詢到以太幣的發行情況:


截止2018525日,已經存在99,647,528.78以太幣,其中72.3是創世區塊中包含的,挖礦產生的以太幣僅佔到不足四分之一。

以太坊是12出一個區塊,以太坊的獎勵機制採用的是:區塊獎勵+叔塊獎勵+叔塊引用獎勵,詳情如下:

普通區塊獎勵:

   固定獎勵5ETH,每個普通區塊都有

   區塊內包含的所有程式的Gas花費的總和

   如果普通區塊包含了叔塊,每包含一個叔塊可以得到固定獎勵5ETH的1/32,也就是0.15625ETH。

叔塊獎勵:

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

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

具體參考https://juejin.im/entry/59ad0169f265da2498241fde

另外和比特幣不同,以太幣的發行總量是上限。但是以太坊後期也會往POS轉換,避免無休止的算力競爭。


GPU

         GPU(英語:Graphics Processing Unit,圖形處理器),又稱顯示晶片,是一種專門在個人電腦、工作站、遊戲機和一些移動裝置(如平板電腦、智慧手機等)上影象運算工作的微處理器GPU的工作大部分都計算量大,而且要重複很多很多次,是非常適合挖礦的。

目前像比特幣和以太坊的POW演算法都是重複性高的計算任務,相比於CPU來說GPU加有算力優勢。CPU作為通用性計算單元,裡面設計了很多諸如分支預測單元、寄存單元等等模組,這些對於提升算力是根本沒有任何幫助的。CPU根本不擅長於進行並行運算,一次最多就執行十幾個任務,這個和GPU擁有數以千計的流處理器差太遠了,GPU高太多了,因此大家慢慢針對GPU開發出對應的挖礦演算法進行挖礦。

算力

我們前面一直提到算力,算力就是代表礦機的計算能力、計算效能的衡量,具體代表的是每秒礦機的整體hash演算法運算次數。算力的單位是Hash/s,一般也表示為KHash/s, MHash/s:

 1 KHash/s =1000 Hash/s
 1 MHash/s = 1000 KHash/s

 1 GHash/s = 1000 MHash/s
 1 THash/s = 1000 GHash/s
 1 PHash/s = 1000 THash/s

挖礦的本質就是解決一個數學計算,誰先算出來誰就獲得獎勵(幣),這個數學計算方式也很簡單,就是一直不斷的嘗試碰撞結果就類似於你暴力破解一個手機密碼(假設嘗試多次手機不會被鎖)你不斷的嘗試密碼 111111~ 99999 一個一個的嘗試直到你解鎖成功,如果你1秒內能嘗試一次你的算力就是1/s1秒內能嘗試兩次你的算力就是2/s1秒內嘗試的次數越多你的算力就越大,你解鎖的時間也就越短礦機也是一樣,礦機1秒內能計算的hash演算法次數越多算力越大,挖的幣越多

不同的幣種的挖礦演算法是不一樣,比特幣是sha256演算法,萊特幣是scrypt演算法,以太坊是Ethash演算法,所以不用的幣種之間的算力是沒有任何關係的

礦池

隨著區塊鏈的流行,像比特幣和以太坊全網的算力在不斷的呈指數級別上漲,單個裝置挖礦(solo挖礦)幾乎無法獲得收益,對於個人來說只能加入礦池共享收益。

礦池是將分散在全球的礦工及礦場的算力進行聯結,一起挖礦。礦池負責資訊打包,接入進來的礦場負責競爭記賬權。由於集合了很多礦工的算力,所以礦池的算力佔比大,挖到區塊的概率更高。礦池挖礦所產生的獎勵會按照每個礦工貢獻算力的佔比進行分配。相較solo挖礦,加入礦池可以獲得更加穩定的收益。

支援以太坊的礦池有

  • 魚池(F2Pool):https://www.f2pool.com/
  • 蟻池(AntPool):https://www.antpool.com/


使用CPU挖礦以太幣

         使用CPU來挖礦以太幣,因為效率、效益太低了,在目前的階段已經很難挖到,所以這裡只是作為舉例介紹,本文是在Linux環境下進行:

首先使用geth同步以太坊區塊鏈:

$ nohup  geth \

--fast --cache=1024 \

--datadir=public_fast \

1>>eth_public_fast.log 2>>eth_public_fast.log &

同步程序執行後,可以另開視窗登入控制檯:

Welcome to the Geth JavaScript console!

instance: Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9.2

 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

同步需要花比較長的時間,同步情況可以通過web3.eth.syncing查詢,待web3.eth.syncing返回false說明同步完成:

>  web3.eth.syncing

false

>  web3.eth.blockNumber

5671651

挖礦前需要有賬號,如果沒有的話可以建立賬號,並且設定為挖礦的賬號

>  web3.personal.newAccount("password")

"0xa736b7dc09ab53c07b01c6e23b18d2e92271d4f3"

>  web3.eth.coinbase = "0xa736b7dc09ab53c07b01c6e23b18d2e92271d4f3"

開始挖礦,設定24個執行緒

>  miner.start(24)

Null

挖礦開始後可以檢視到日誌:

INFO [05-25|09:09:56] Updated mining threads                   threads=24

INFO [05-25|09:09:58] Commit new mining work number=5671670 txs=59   uncles=0 elapsed=120.660ms

可以通過命名查詢是否在挖礦:

>  web3.eth.mining

true


使用GPU挖礦以太幣

         目前來說即使是使用GPU進行solo挖礦也是比較難挖到的,所以推薦加入礦池。本文是使用Linux系統進行挖礦,機器顯示卡必須是NVIDIA或者AMD,本文是NVIDIA,可以用命令查詢:

$ lspci | grep -i vga

04:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (rev a1)

0b:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. G200eR2

42:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (rev a1)

本文加入魚池F2POOL,首先下載挖礦軟體Bminner

$ wget https://www.bminercontent.com/releases/bminer-v8.0.0-32928c5-amd64.tar.xz

$ tar xvf  bminer-v8.0.0-32928c5-amd64.tar.xz

$ cd bminer-v8.0.0-32928c5

然後執行:

$ ./bminer \

-uri ethproxy://0xa736b7dc09ab53c07b01c6e23b18d2e92271d4f3[email protected]:8008

具體參考https://www.f2pool.com/help/start-mining/eth-etc/eth-etc

挖礦程序執行後,可以查詢NVIDIA GPU的執行狀況:

如果執行正常就可以在礦池頁上查詢到賬戶資訊:

https://www.f2pool.com/eth/0xa736b7dc09ab53c07b01c6e23b18d2e92271d4f3

         

參考

  • http://baijiahao.baidu.com/s?id=1593093422301755464&wfr=spider&for=pc
  • http://www.cocoachina.com/blockchain/20180206/22161.html
  • http://miner.tools/tutorial/eth/45

作者簡介

吳龍輝,《Kubernetes實戰》作者,活躍於技術開源社群,貢獻程式碼和撰寫技術文件。 
郵箱:[email protected]

相關推薦

分析

以太坊介紹以太坊(Ethereum)是一個建立在區塊鏈技術之上,去中心化應用平臺。它允許任何人在平臺中建立和使用通過區塊鏈技術執行的去中心化應用。共識機制區塊鏈是一個去中心化的分散式賬本。去中心化就表示區塊鏈網路中的每個節點是分散和獨立的,同時又要保證整體的一致性(包括資料和

深入區塊鏈原始碼

// Miner creates blocks and searches for proof-of-work values. type Miner struct { mux *event.TypeMux worker *worker coinbase co

私有鏈操作指南

lin 鏈接 chain body 參數 golang安裝 java 文件的 語言 先總體說一下步驟: 1.操作系統準備 linux(centos6.7) 2. golang安裝 3.下載以太坊 4. 安裝以太坊 5. 創世區塊文件的準備 6. 創世區塊初始化 7. 以太坊

教程-搭建私鏈

安裝客戶端 安裝Gth,即Go語言實現的以太坊客戶端 (go-ethereum)。 brew tap ethereum/ethereum brew install ethereum 配置初始狀態 新建ethdev目錄 mkdir ethdev cd ethdev

Linux系統教程

烏班圖(Ubuntu)等linux環境下以太坊(ETH)怎麼挖礦,如何在linux在挖以太幣,有沒有最新的linux以太坊挖礦軟體?小編髮現網上的window以太坊挖礦教程很多,但是linux下的教程和軟體幾乎沒有,只能查到三年前的,今天小編給大家帶來最新的以太坊挖礦 教原版

分析 Solidity

以太坊介紹以太坊(Ethereum)是一個建立在區塊鏈技術之上,去中心化應用平臺。它允許任何人在平臺中建立和使用通過區塊鏈技術執行的去中心化應用。Solidity以太坊中可以使用任何高階語言一樣來編寫智慧合約,智慧合約的預設的程式語言是Solidity,副檔名以.sol結尾。

死磕原始碼分析流程分析

> 死磕以太坊原始碼分析之挖礦流程分析 > > 程式碼分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 ## 基本架構 以太坊挖礦的主要流程是由`miner`包負責的,下面是基本的一個架構: ![image-202012121

【智慧合約系列004-安全 Parity 第二次安全事件漏洞分析

Parity 多籤錢包的第二次漏洞發生於 2017年11月07日,不同於 17年7月19日那次,本次不是資產被黑客盜走,而是合約底層被破壞,導致資產就在那,但卻永遠也取不出,就像駕船到太平洋最深處,投下一枚硬幣,硬幣就在那,但你可能再也無法找到它。     

【智慧合約系列003-安全 Parity 第一次安全事件漏洞分析

截止目前,Parity 多重簽名錢包共發生過兩次安全事件,第一次發生在 2017年07月19日,涉及 Parity 1.5 及以上版本,造成 15萬以太幣約 3000萬美元被盜,第二次發生在 2017年11月07日,致使約 50萬枚以太幣被鎖在合約中無法取出,當時價值大約 1.5億美元,本篇先對發生

走進技術路:瓶頸、困境和方案

一、以太坊目前存在的技術瓶頸 以太坊網路目前存在的主要問題是:可擴充套件性、智慧合約的安全性、共識協議與隱私性。 1. 可擴充套件性困境 2017年的以太坊養貓遊戲中,佔到整個以太坊16%的交易量,導致以太坊網路大面積擁堵。網路擁堵問題暴露出了以太坊區塊鏈亟需擴容的現狀。以太坊被設計成為一個

DAO股東協會

Decentralized Autonomous Organization,簡稱DAO,以太坊中重要的概念。一般翻譯為去中心化的自治組織。 在上一節中,我們為了展示什麼是DAO建立了一個合約,就像一個採用邀請制的俱樂部,會員被總統的心血來潮邀請或禁止。但這有一些缺點:如果有人想改變他的主

DAO流動民主智慧合約

Decentralized Autonomous Organization,簡稱DAO,以太坊中重要的概念。一般翻譯為去中心化的自治組織。 投票支付合約的所有費用和行動需要時間,並要求使用者始終保持活躍,知情和專注。另一個有趣的方法是選擇一個可以控制合約的指定賬戶,然後能夠迅速做出決定。

DAO時間鎖定Multisig

Decentralized Autonomous Organization,簡稱DAO,以太坊中重要的概念。一般翻譯為去中心化的自治組織。 有時候,時間也可以用作一種很好的安全機制。以下程式碼基於DAO區塊鏈大會,但有不同的變化。不是每個操作需要X個成員批准,而是任何交易都可以由單個成員發起,但它們在執行之前

學習Java開發框架web3j的使用---部署合約

智慧合約名以 HelloContract 為例 1,編譯合約原始碼 命令:solc HelloContract.sol –bin –abi –optimize -o outputPath solc .sol –bin

深入區塊鏈原始碼p2p通訊

一、p2p網路中分為有結構和無結構的網路 無結構化的: 這種p2p網路即最普通的,不對結構作特別設計的實現方案。 優點是結構簡單易於組建,網路區域性區域內個體可任意分佈, 反正此時網路結構對此也沒有限制;特別是在應對大量新個體加 入網路和舊個體離開網路(“c

學習常用命令

miner.start(1) 啟動挖礦 miner.stop() 停止挖礦 miner.setEtherbase(addr) 設定主賬戶 personal.unlockAccount(eth.accounts[0]) 解鎖賬戶 p

原始碼分析(16)分析

### 從交易扔到tx的pending池開始分析,不言而喻現在該是礦工登場的時候了/miner/miner.go/Start```func (self *Miner) Start(coinbase common.Address) {    atomic.StoreInt32(&self.shouldS

跟著AK學三:重要的錢包:imToken

你可以在右上角看到你的錢包地址,記錄下來,發給想給你轉幣的人。總結:這個錢包你能拿到兩個憑據:UTC打頭的Keystore檔案,和打印出的紙錢包。紙錢包是明文私鑰,千萬不能讓人拍攝到。並安全存放。Keystore請放到U盤裡,隨身攜帶,平時使用。一旦丟失,可以通過紙錢包恢復,並重新生成一個Keystore。提

【我的區塊鏈路】- 原始碼剖析Geth 1.8.14版本邏輯調整

今天為什麼寫這個文章呢,首先,前段時間有朋友問過我,說現在geth的1.8.14版本的程式碼和網上各路大神們的分析不一樣了。我就趕緊看了下,確實,親的geth程式碼中的mine部分的邏輯有所改動,想必看過原始碼的都知道,之前的miner真正挖礦是由worker把所需挖礦的

區塊鏈入門(2):搭建私有鏈(private network of ethereum),以及的操作..

percent symbol 令行 sans miners margin ima ear 建立 在做一些測試工作的時候, 為了方便控制以及更快的進入真正的測試工作,可能需要搭建一個私有的以太坊網絡. 而以太坊節點之間能夠互相鏈接需要滿足1)相同的協議版本2)相同的netwo