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 目录下
通过执行 build/env.sh go run build/ci.go install 命令进行编译
只要go的环境变量没问题 执行肯定没问题,如果出错 查看下 go env 查看GOPATH 和 GOROOT是否正确
环境准备
等会儿要建立 2个 ethereum节点,并且都在这台电脑上跑,先到 GOPATH/src/github.com/ethereum/go-ethereum/build/bin目录下建立2个文件夹 分别为 node1 node2 ,node1 为授权打包节点,node2 是 ethereum client 。
建立 Ethereum 账号
接着我们要替这两个角色各建立一個 Ethereum 账号
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 是各互动式的程式,直接按照提示启动创建。
给个名字:叫 clique_poa
这里选 2 ,要建立一个新的创世区块
、
共识机制 选择2 Clique PoA
出块时间 默认 15秒,我这边设置10秒
设置授权打包的账号,这边设置为node1
给账号初始化eth 这边我把node2 账号 填上去了,看你需要是否填写
设定 Network Id 直接回车随机
看文字描述
Ctrl+C离开当前目录下就生成你刚刚创建的 创世区块文件
2个节点初始化 Private chain
初始化node1节点
./geth --datadir ./node1/data init clique_poa.json
初始化node2节点
./geth --datadir ./node2/data init clique_poa.json
2个节点初始化完毕,我们现在让他们启动
启动 geth client 并 addPeers
分別在 node1 启动 geth
启动命令:./geth --datadir ./node1/data --networkid 55661 --port 2000 console
新启动一个命令端口 启动 ndoe2
启动命令:./geth --datadir ./node2/data --networkid 55661 --port 2001 console
在启动信息中有这么一段来自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
node1使用命令:admin.addPeer
node2使用命令:admin.peers 可以查看连接的节点信息
目前node1 和 node2 已经建立连接,我们可以启动POA 挖矿
启动POA 挖矿
解锁node1的账号
解锁命令:personal.unlockAccount(eth.accounts[0])
然后node1 节点启动挖矿 命令:miner.start()
启动成功挖矿成功
上面是node2节点同步挖矿信息成功
我们测试下 node2节点启动挖矿会如何
也先解锁账号然后开启挖矿
无法挖矿
我们来尝试一笔转账 从 ndoe2 转账给 node1
先要解锁node2 账号 ,node1 开启挖矿,node1命令窗口下 执行
eth.sendTransaction({from:'0x6fea218cffc4c52d23fd475dcd2899ae14b332bc', to: '0xf6a1ffa6370b1509389f783f5b6637fc2bc0200f', value: web3.toWei(100, "ether")})