使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

时间:2024-03-18 16:19:06

Ethereum Proof of Authority

       在基于PoA的网络中,事务和块由经批准的帐户验证,称为验证器。验证器运行软件,允许它们将事务放入块中。该过程是自动化的,不需要验证器持续监控其计算机。但是,它确实需要维护计算机(权限节点)不妥协。该术语由以太坊和Parity Technologies的联合创始人Gavin Wood创造。

       PoA个人有权成为验证人,因此有动力保留他们获得的职位。通过将声誉附加到身份上,验证者可以通过激励来维护交易过程,因为他们不希望自己的身份与负面声誉相关联。这被认为比PoS更强大,如:

       在PoS中,虽然两方之间的股份可能是平等的,但它没有考虑到每一方的总持股量。这意味着激励可能是不平衡的。
同时,PoW使用了大量的计算能力,这本身就降低了激励。它也容易受到攻击,因为潜在的攻击者只需要拥有51%的挖掘资源(哈希值)来控制网络,尽管这并不容易。
另一方面,PoA仅允许来自任何一个验证器的非连续块批准,这意味着严重损坏的风险被最小化。

     PoA适用于私有网络和公共网络,如POA网络,其中信任是分布式的。

安裝 geth(建议全程命令窗口root权限)

    直接去gitHub下载项目 https://github.com/ethereum/go-ethereum (我当前使用master 对应分支大概 1.8版本)

    运行需要go环境,百度安装下go 的相关 GOROOT,GOPATH (运行环境为 ubuntu 16.04.4)

    将文件通过git命令 拉取到 GOPATH/src/github.com/ethereum 目录下

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

通过执行 build/env.sh go run build/ci.go install 命令进行编译

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

只要go的环境变量没问题 执行肯定没问题,如果出错 查看下 go env 查看GOPATH 和 GOROOT是否正确

环境准备

等会儿要建立 2个 ethereum节点,并且都在这台电脑上跑,先到 GOPATH/src/github.com/ethereum/go-ethereum/build/bin目录下建立2个文件夹 分别为 node1 node2 ,node1 为授权打包节点,node2 是 ethereum client 。

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

建立 Ethereum 账号

接着我们要替这两个角色各建立一個 Ethereum 账号

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

GOPATH/src/github.com/ethereum/go-ethereum/build/bin# ./geth --datadir ./node1/data account new

以下是我创好的账号地址:

  • node1: f6a1ffa6370b1509389f783f5b6637fc2bc0200f
  • node2: 6fea218cffc4c52d23fd475dcd2899ae14b332bc

账号创建完毕,我们开始启动我们的私链

创建创世区块文件

Clique 是将授权节点的相关信息放在 Block Header 中,所以我们必须对创世区块做一些设定才可以让授权机制生效。

Clique 是将授权的信息放在 extraData 中,这些数据的格式并沒有那么直观,所以在此使用 geth提供的建立 Private Chain 的工具 puppeth 来建立创世块,puppeth 是各互动式的程式,直接按照提示启动创建。

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

给个名字:叫 clique_poa

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

这里选 2 ,要建立一个新的创世区块

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

共识机制 选择2 Clique PoA

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

出块时间 默认 15秒,我这边设置10秒

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

设置授权打包的账号,这边设置为node1

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

给账号初始化eth 这边我把node2 账号 填上去了,看你需要是否填写

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

设定 Network Id 直接回车随机

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

看文字描述

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

Ctrl+C离开当前目录下就生成你刚刚创建的 创世区块文件

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

2个节点初始化 Private chain

初始化node1节点

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

./geth --datadir ./node1/data init clique_poa.json

初始化node2节点

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

./geth --datadir ./node2/data init clique_poa.json

2个节点初始化完毕,我们现在让他们启动

启动 geth client 并 addPeers

分別在 node1 启动 geth

启动命令:./geth --datadir ./node1/data --networkid 55661 --port 2000 console

 

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

新启动一个命令端口 启动 ndoe2

启动命令:./geth --datadir ./node2/data --networkid 55661 --port 2001 console

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

在启动信息中有这么一段来自node1

INFO [07-31|10:27:44.458] RLPx listener up                         self=enode://d3296e7eca9b1185ed7fbce1859e073ca115f967dc54a0e3cd127cf320c368273[email protected][::]:2000
需要node2 连接node1

将 [::]替换 127.0.0.1

enode://d3296e7eca9b1185ed7fbce1859e073ca115f967dc54a0e3cd127cf320c368273[email protected]127.0.0.1:2000

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

node1使用命令:admin.addPeer

node2使用命令:admin.peers 可以查看连接的节点信息

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

目前node1 和 node2 已经建立连接,我们可以启动POA 挖矿

启动POA 挖矿

解锁node1的账号

解锁命令:personal.unlockAccount(eth.accounts[0])

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

然后node1 节点启动挖矿 命令:miner.start()

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

启动成功挖矿成功

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

上面是node2节点同步挖矿信息成功

我们测试下 node2节点启动挖矿会如何 

也先解锁账号然后开启挖矿

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

无法挖矿

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

我们来尝试一笔转账 从 ndoe2 转账给 node1

先要解锁node2 账号 ,node1 开启挖矿,node1命令窗口下 执行 

eth.sendTransaction({from:'0x6fea218cffc4c52d23fd475dcd2899ae14b332bc', to: '0xf6a1ffa6370b1509389f783f5b6637fc2bc0200f', value: web3.toWei(100, "ether")})

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)

使用 go-ethereum Clique PoA consensus 建立 私有链、联盟链(亲手操作,包含POA创世文件创建,启动,挖矿,转账)