1. 程式人生 > >geth基於PoA共識機制構建聯盟鏈

geth基於PoA共識機制構建聯盟鏈

1 PoA共識機制

PoW機制的缺陷

以太坊現階段是基於PoW共識機制,PoW工作量證明機制就是區塊鏈網路中一堆計算機通過計算隨機數的Hash值,誰先找到這個隨機數誰就贏的當前區塊的記賬權。PoW通過比拼算力,誰的算力大,誰就能夠搶到記賬權。這樣導致網路大量算力用來計算毫無意義的隨機數工作中去了,而真正用來打包和驗證的算力就受到影響。

  • PoW機制存在51%算力共計問題。只要挖礦者掌握全網51%算力就能控制整個網路。
  • PoW機制消耗大量電力。
  • PoW機制造成了以太坊網路算力的損失,從而無法支援很高的tps。

PoA共識機制

所謂授權證明PoA(Proofof Authority),就是由一組授權節點來負責新區塊的產生和區塊驗證。

以太坊測試網(Kovan)便是採用PoA演算法。以太坊原始碼中帶有Clique共識演算法即為一種PoA共識演算法。

在PoA中,驗證者(validator)是整個共識機制的關鍵。驗證者不需要昂貴的顯示卡,也不需要足夠的資產,但他必須具有已知的,並且已獲得驗證的身份。驗證者通過放置這個身份來獲得擔保網路的權利,從而換取區塊獎勵。若是驗證者在整個過程中有惡意行為,或與其他驗證者勾結。那通過鏈上管理可以移除和替換惡意行為者。現有的法律反欺詐保障會被用於整個網路的參與者免受驗證者的惡意行為。

PoA共識機制的特點

PoA是依靠預設好的授權節點(signers),負責產生block.可以由已授權的signer選舉(投票超過50%)加入新的signer。即使存在惡意signer,他最多隻能攻擊連續塊(數量是 (SIGNER_COUNT / 2) + 1)
中的1個,期間可以由其他signer投票踢出該惡意signer。可指定產生block的時間。
2 PoA聯盟鏈搭建準備工作在ubuntu系統中首先安裝geth客戶端,這裡使用geth 1.8.8版本。
然後建立三個資料夾,分別是bootdir,boot1,boot2三個資料夾。在bootdir資料夾中建立bootnode節點用來做p2p網路路由。使用命令 sudo bootnode --genkey boot.key來建立名為boot.key的key檔案。然後使用 sudo bootnode --nodekey boot.key 命令啟動bootnode路由節點。
建立賬戶


使用puppeth來產生創世檔案

puppeth是geth自帶的程式,可以引導使用者建立geth的創世檔案。執行puppeth

[email protected]:/home/lzj/boot1# sudo puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
|                                                           |
| This tool lets you create a new Ethereum network down to  |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail.         |
|                                                           |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset.                                   |
+-----------------------------------------------------------+

Please specify a network name to administer (no spaces or hyphens, please)
> lzj

Sweet, you can set this via --network=lzj next time!

INFO [06-23|17:10:34] Administering Ethereum network           name=lzj
INFO [06-23|17:10:34] No remote machines to gather stats from 

What would you like to do? (default = stats)
 1. Show network stats
 2. Configure new genesis
 3. Track new remote server
 4. Deploy network components
> 2

Which consensus engine to use? (default = clique)
 1. Ethash - proof-of-work
 2. Clique - proof-of-authority
> 2

How many seconds should blocks take? (default = 15)
> 2

Which accounts are allowed to seal? (mandatory at least one)
> 0xd71ad920f80e6a1e06689a720f24b335f22d557e
> 0x8bbc43acd355be0cecc61872e13e0a0e53c700b7
> 0x

Which accounts should be pre-funded? (advisable at least one)
> 0x0xd71ad920f80e6a1e06689a720f24b335f22d557e
ERROR[06-23|17:11:33] Invalid address length, please retry 
> 0xd71ad920f80e6a1e06689a720f24b335f22d557e
> 0x

Specify your chain/network ID if you want an explicit one (default = random)
> 1500
INFO [06-23|17:12:05] Configured new genesis block 

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 2

 1. Modify existing fork rules
 2. Export genesis configuration
 3. Remove genesis configuration
> 2

Which file to save the genesis into? (default = lzj.json)
> genesis.json
INFO [06-23|17:12:27] Exported existing genesis block 

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> ^C
[email protected]:/home/lzj/boot1# ls
genesis.json  keystore
[email protected]:/home/lzj/boot1# 

將在boot1目錄下產生genesis.json檔案,將這個檔案拷貝到boot2目錄下去

初始化boot1和boot2倆個節點

/home/lzj/boot1# sudo geth --datadir ./ init genesis.json
/home/lzj/boot2# sudo geth --datadir ./ init genesis.json

啟動boot1節點


boot1節點啟動挖礦


boot1節點這個時候挖出了區塊1,在等待其它節點加入。

啟動boot2節點


因為在同一臺機器上,所以要注意boot2的port埠和rpc埠跟boot1的有所不同。

boot2啟動挖礦

boot1節點:


boot2節點:


可以看到倆個節點都在挖礦,每個區塊產生間隔2s,每個節點挖礦間隔4s。

3 發起交易

在boot1節點再新建一個賬戶,從賬號0給新建賬號1轉賬:

> eth.sendTransaction({from:eth.coinbase,to:eth.accounts[1],value:web3.toWei(100,"ether")})

查詢賬號1的餘額:

web3.fromWei(eth.getBalance(eth.accounts[1])
100

然後再boot2新建一個賬號,從boot1的賬號1給boot2的新建賬號轉賬:

eth.sendTransaction({from:eth.accounts[1],to:"0xa114e1381cfa44d66682cbff4e7aa5f788c44a64",value:web3.toWei(10,"ether")})

查詢boot1的賬戶餘額:

> web3.fromWei(eth.getBalance(eth.accounts[1]))
89.999622

查詢boot2的賬戶1餘額:

> web3.fromWei(eth.getBalance("0xa114e1381cfa44d66682cbff4e7aa5f788c44a64"))
10

可見從從boot1的賬號0給賬號1轉賬100ether的交易成功,此時boot1的賬號1有錢100ether。從boot1的賬號1給boot2的賬號1轉賬10ether的交易也成功了,boot2的賬號1收到了10ether,轉賬後boot1的賬號1只剩下89.9996222ether,說明轉賬是收取了gas費用。

4 新加節點並提名挖礦

新建目錄boot3,拷貝創世檔案genesis.json到該目錄,然後按照前面的放方法啟動節點

建立新賬號


初始化節點

[email protected]:~/boot3$ sudo geth --datadir ./ init genesis.json

啟動節點


開始同步了:


這個時候由於boot3節點的賬號不在genesis.json指定的驗證節點列表裡,所以無法挖礦,驗證一下:


報了未授權的錯誤: 

WARN [06-25|10:45:09] Block sealing failed                     err=unauthorized

現在共有3個節點,所以需要一半以上的節點提名節點3的根賬號,它才能被加入驗證人列表。在boot1節點和boot2節點提名boot3的根賬號:

> clique.propose("0x5b5bb21eb5dede180d97fd014e3d4fb277b08dee",true)

這個時候boot3挖礦成功了:


5 踩坑記錄

(1)啟動節點挖礦時,需要帶上標誌--syncmode "full",否則彙報錯誤:

Clique : Discarded bad propagated block#1 when syncing

(2)啟動節點挖礦時,需要在啟動時帶上 --unlock "賬號",否則會在挖礦一定時間後會報挖礦失敗,需要解鎖的錯誤。

相關推薦

geth基於PoA共識機制構建聯盟

1 PoA共識機制PoW機制的缺陷以太坊現階段是基於PoW共識機制,PoW工作量證明機制就是區塊鏈網路中一堆計算機通過計算隨機數的Hash值,誰先找到這個隨機數誰就贏的當前區塊的記賬權。PoW通過比拼算力,誰的算力大,誰就能夠搶到記賬權。這樣導致網路大量算力用來計算毫無意義的

POA共識機制解答

想知道更多區塊鏈技術問答,請百度【鏈客區塊鏈技術問答社群】,有專業的區塊鏈技術問答。 使用puppeth工具建立PoA共識機制的時候,這裡提示,要提供至少一個賬戶,請問,這裡的賬戶作用是什麼? 是指挖礦的賬戶嗎? 答:poa是授權挖礦機制,這個設的是允許哪些賬戶挖礦,沒有設定的賬戶是不能

Hyperledger fabric基於kafka共識機制單機搭建

cd /opt/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples mkdir 181021 cd 181021 mkdir chaincode mkdir network cp ../../firs

迅雷基於智慧硬體的DPoA共識機制介紹

迅雷鏈基於海量的玩客雲裝置作為記賬節點來構建區塊鏈服務。這些玩客雲裝置放置在使用者家裡,共享家庭頻寬和儲存,作為CDN、雲端計算、區塊鏈等服務的基礎設施,構成了一個龐大的計算機網路。 玩客雲網絡相對於中心化的伺服器節點組成的網路,其特點可概括為以下幾個方面: 1)網路節點多:目前已經過150

以太坊POA搭建聯盟——geth命令手記

創世塊使用:puppeth建立 參考:https://blog.csdn.net/code_segment/article/details/78160660   密碼:123 node: 128809dd3d9fe616381ce21b868191ce90091c7e

從零構建基於以太坊(Ethereum)錢包Parity聯盟

什麼情況下可以建立自己測試用的PoA chain? 公司內網或無對外網路,無法同步區塊 降低測試時等待區塊的時間 不想碰到testrpc各種雷 PoA Chain特點有 有別於PoW(Proof-of-Work)需要解數學難題來產生

區塊共識機制POW、POS、DPOS、POA

一:POW   POW的全稱為Proof of Work,翻譯過來就是“工作證明”或者“工作量證明”。   比特幣、狗狗幣和萊特幣等都是基於POW模式的數字貨幣。就是說挖礦獲得多少貨幣獎勵,取決於挖礦貢獻的有效工作,也就是說,礦機的效能越好、挖礦時間越長,所獲得的貨幣獎勵就越

基於Go語言構建區塊:part1

defined 它的 com 工作 exit ngs slice ret bytes Golang語言和區塊鏈理論學習完畢後,快速入門方法無疑是項目實戰。本文將參考https://jeiwan.cc/tags/blockchain/教程,學習如何基於Go語言構建區塊鏈。 1

區塊共識機制及其叠代

誰的 led 例如 轉賬 提高 優勢 load nbsp 摘要 共識,Consensus,故名思義,共同的認識,共識問題研究的就是多個成員如何達成一致,典型的比如投票選舉。 區塊鏈是一種去中心化的分布式賬本系統,區塊鏈的共識問題實際上來源於分布式系統的一致性問題。 分布

《區塊100問》第54集:區塊共識機制是什麽?

sin 制度 tran bsp sele per 區別 img png 在區塊鏈系統當中,沒有一個像銀行一樣的中心化記賬機構,保證每一筆交易在所有記賬節點上的一致性,即讓全網達成共識至關重要。共識機制解決的就是這個問題。   目前主要的共識機制有工作量證明機制PoW和權益證

基於Java語言構建區塊(一)—— 基本原型

java 分布式 程序員 後端引言 區塊鏈技術是一項比人工智能更具革命性的技術,人工智能只是提高了人類的生產力,而區塊鏈則將改變人類社會的生產關系,它將會顛覆我們人類社會現有的協作方式。了解和掌握區塊鏈相關知識和技術,是我們每位開發人員必須要去做的事情,這樣我們才能把握住這波時代趨勢的紅利。 本文將基於Jav

基於Java語言構建區塊(二)—— 工作量證明

分布式 java引言 在 上一篇 文章中,我們實現了區塊鏈最基本的數據結構模型,添加區塊以及和前一個區塊連接在一起。但是,我們的實現方式非常簡單,而真實的比特幣區塊鏈中,每一個區塊的添加都是需要經過大量的計算才可以完成,這個過程就是我們熟知的挖礦。 工作量證明機制區塊鏈最關鍵的一個思想就是,必須進行大量且困難

基於Java語言構建區塊(三)—— 持久化 & 命令行

java 分布式 編程語言 程序員 引言上一篇 文章我們實現了區塊鏈的工作量證明機制(Pow),盡可能地實現了挖礦。但是距離真正的區塊鏈應用還有很多重要的特性沒有實現。今天我們來實現區塊鏈數據的存儲機制,將每次生成的區塊鏈數據保存下來。有一點需要註意,區塊鏈本質上是一款分布式的數據庫,我們這裏

區塊2.0-共識機制如何打破互聯網信息大爆炸

之一 分享 分享圖片 一起學 人生 利用 行業 浪費時間 cto 區塊鏈2.0-共識機制如何打破互聯網信息大爆炸   作者:Melon   如今打開頭部流量產品如:QQ、微信、抖音等。總是會收到各種垃圾遊戲的推薦廣告。頭部媒體公司更是用一樁樁的奇聞異事把我吸引進去看了不知真

第3講 | 淺說區塊共識機制

解釋 第一次 表示 然而 無法 很多 24點 con 控制 ————文章出自極客時間《深入淺出區塊鏈》 作者:元界 CTO 陳浩     我在第2講“區塊鏈到底是怎麽運行的”一文中,提到了&ldq

第13講 | 深入區塊技術(五):PoS共識機制

運行 離線 難題 感謝 並且 發現 即使 pos系統 分享   上一篇我們講到了PoW共識機制,這一篇我們就來分享另外一種共識機制,PoS共識機制。   PoS全稱是Proof of Stake,中文翻譯為權益證明。這一篇我們會將PoS與PoW對比講解,幫助你加深理解。

區塊 || PoW共識機制的學習

注:本文章通過閱讀討論工作量共識在垃圾郵件的使用的 Proof-of-Work-Proves-Not-to-Work-version-0.2 文章以及部落格知乎上關於 PoW 機制的討論完成。 原理: 首先 PoW 是一種共識機制,處於區塊鏈架構的共識層中。上次作業的學習中有了解到區

區塊兩大共識機制POW與POS有什麼區別?

          談到區塊鏈,都繞不開對其核心問題共識機制的討論,區塊鏈中存在多種共識機制,其中比較主流的兩大共識機制是POW與POS。那POW與POS分別是什麼?又有什麼區別呢? POW   所謂的POW,就是工作量證明(proof

基於Java語言構建區塊(三)—— 持久化 & 命令列

文章的主要思想和內容均來自:https://jeiwan.cc/posts/building-blockchain-in-go-part-3/ 原文連結:https://wangwei.one/posts/35c768a3.html 引言 上一篇文章我們實現

區塊為什麽有共識機制

代幣 就是 為什麽 獎勵 效率 ans 容易 鼓勵 人的   區塊鏈中為什麽需要一種共識機制呢?我們都知道加密貨幣大部分是采用去中心化的區塊鏈設計,每個節點都是各處分散且平行的,因此需要有一套制度來維護系統的運作順序與公平性,這就是共識機制設計的意義所在。   對於一些