风险提示:理性看待区块链,提高风险意识!
以太坊研究:ETH基于POA的环境搭建
首页 > 币界资讯 > 区块链知识 2018-08-22 14:58:00

许多同学有研究POA的想法,那么今天我们尝试创建以太坊基于 POA 的环境,首先搭建环境前的准备:

1.安装 go-ethereum,下载 go 的源码

1
git clone https://github.com/ethereum/go-ethereum

2.编译go

1
2
3
cd go-ethereum

Make geth

3.创建4个文件夹

执行完成之后再bin的目录下会生成可执行文件geth,分别命名为node1.node2.signer1.signer2.node 是普通节点,用于后期节点间发起交易,在接下来的实验中,signer1 设置为创世块指定的授权节点;signer2为后期加入信任名单授权节点,目录如下:

1
2
3
root@test # ls

geth, node1,node2,signer1,signer2 

4.私有链搭建创建新账户,将启动的数据分别存在不同的文件夹中。

1
./geth --datadir node1/data account new

至此我们有了四个账户,四个账户分别为

1
2
3
4
5
6
7
Node1: 93ab57b1c1ae82537d6c7956d2817916166f6389

Node2: c2fdb2dffa3a14740e3d8b3baeeea504a699229f

Signer1: 7d848a70962ad3830c59ad35c6811b1fc3d07360 

Signer2:  f5413187e29113841db0ec73a2c559a53b6be7fe

5.初始化创世块

在 1.6 之后的以太坊中提供了初始化创世块的工具:puppeth, 请选择含有 Geth & Tools 的版本下载,如下图标红处。下载地址:https://geth.ethereum.org/downloads/ , 也可以按照上文自行编译。

puppeth 是个互动式的程序,直接启动照着指示输入相关信息。设置 Private chain 名称,假定为 poa_test,如下:

6.指定每隔 30 秒生成一个区块

我们指定了第一个 signer1 这个用户用来挖矿,指定了 node1和 signer1 开始被填充了余额。

7.按照如下步骤将生成的初始块进行导出

8.导出后的配置文件如下如所示:

9.创世块为 json 格式

我们将创世块的内容列举如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{

"config": { "chainId": 40783,

"homesteadBlock": 1,

"eip150Block": 2, "eip150Hash":

"0x0000000000000000000000000000000000000000000000000000000000000000",

"eip155Block": 3,

"eip158Block": 3,

"byzantiumBlock": 4, "clique": {

"period": 30,

"epoch": 30000

}

},

"nonce": "0x0", "timestamp": "0x59fa93a0", "extraData":

"0x00000000000000000000000000000000000000000000000000000000000000007d848a70962a d3830c59ad35c6811b1fc3d07360000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000

0",

"gasLimit": "0x47b760", "difficulty": "0x1",

"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000",

"alloc": { "0000000000000000000000000000000000000000": {

"balance": "0x1"

},

….. // 此部分列举了部分内容,剩下为从 00 到 ff "00000000000000000000000000000000000000ff": {

"balance": "0x1"

}, "7d848a70962ad3830c59ad35c6811b1fc3d07360": {

"balance": "0x200000000000000000000000000000000000000000000000000000000000000"

}, "93ab57b1c1ae82537d6c7956d2817916166f6389": {

"balance": "0x200000000000000000000000000000000000000000000000000000000000000"

}

},

"number": "0x0",

"gasUsed": "0x0",

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"

}

参数解释如下:

mixhash 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。注意他和 nonce 的设置需要满足以太坊的 Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的 条件。.
nonce nonce 就是一个 64 位随机数,用于挖矿,注意他和 mixhash 的设置需要满足以太 坊的 Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。 |
difficulty 设置当前区块的难度,如果难度过大,cpu 挖矿就很难,这里设置较小难度 |
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要 预置有币的账号,需要的时候自己创建即可以。 |
coinbase 矿工的账号,随便填 |
timestamp 设置创世块的时间戳 |
parentHash 上一个区块的 hash 值,因为是创世块,所以这个值是 0 |
extraData 附加信息,在 POA 挖矿中 |
gasLimit 该值设置对 GAS 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我 们是私有链,所以填最大。 |

10.初始化私有链

使用 geth init 指令,分别初始化 4 个节点的 datadir,比如初始化 node1 可执行:

1
./geth --datadir node1/data init poa_test.json

初始化完成之后,在每个文件夹中会生成两个子文件夹。

其中 geth 用来存储区块链的数据信息,keystore 用来存储账户信息,启动节点,分别执行以下命令:

1
2
3
4
5
6
7
./geth --datadir node1/data --networkid 66300 --port 3000 console

./geth --datadir node2/data --networkid 66300 --port 3001 console

./geth --datadir signer1/data --networkid 66300 --port 3002 --unlock 7d848a70962ad3830c59ad35c6811b1fc3d07360 console

./geth --datadir signer2/data --networkid 66300 --port 3003 console

11.建立data目录

datadir先前的步骤已经在每个节点各自的目录下都建立了data目录,networkid geths之间一定都要用同一个值才可以互相通信,比如实验中的66300. Portgeths 之间通信时,监听的一个port,由于四个节点都在本机,所以这里必须指定不同的值,使用 node1 对应 3000, node2 对应 3001, signer1 对应 3002, signer2 对应 3003.

Geth 参数含义如下:

identity 区块链的标示,随便填写,用于标示目前网络的名字
init 指定创世块文件的位置,并创建初始块 |
datadir 设置当前区块链网络数据存放的位置 |
port 网络监听端口 |
rpc 启动 rpc 通信,可以进行智能合约的部署和调试 |
rpcapi 设置允许连接的 rpc 的客户端,一般为 db,eth,net,web3 |
networkid 设置当前区块链的网络 ID,用于区分不同的网络,是一个数字 |
console 启动命令行模式,可以在 Geth 中执行命令 |

12.启动成功后的截图如下

因为 signer1 为挖矿节点,所以在启动的时候需要进行解锁。

13.建立节点之前的通信

目前各个节点虽然已经启动,但是各个节点之间仍然处于孤立状态。各节点启动后无法相互通信的,所以geth要连上对方的节点就必须先设置好enode://@:,复制刚刚启动node1时出现的enode信息,将[::]替换为127.0.0.1,这样就可以让其他节点加入。如上面提示的的红色提示所见, node1 的 enode 为

1
enode://720d04c0fcf239fa773493e85d3393ef3a2ce581858cbaf1756288c2decc8f08c738fabbd6b4c79fa300292755601714522fcf4febe3f6f224ea119eaac41f72@127.0.0.1:3000

在node2,singer1,singer2的geth console界面下分别运行如下指令:

完成后,在 node1 的 geth console 输入 admin.peers 应该要看到三个节点资讯,如下:(每个id 对应其他节点的 encode 字段信息)

至此四个节点之前的关系已经初步建立。

14.开始挖矿

按照实验的设计,在本实验中 signer1 为挖矿节点,我们下面开始进行模拟挖矿,在 signer1 的console 界面,键入 miner.start(),geth 就会开始挖矿了,在 signer1 的 console 会出现正在mining 的信息。

从上面可以看出挖矿的时间间隔为 30 秒,与我们创世块的中参数一致,同时在其他节点(node1 和 node2 和 signer2)则会收到 import block 的信息。如下:

15.交易转账

按照我们的预设,在 node1 和 signer1 上是已经初始化了余额的。我进行查询如下:

但是目前的账户处于锁定状态,所以首先我们要进行解锁。

进行解锁的命令如下:

1
personal.unlockAccount("0x93ab57b1c1ae82537d6c7956d2817916166f6389")

我们开始对 node2 进行转账,如下图所示:

16.查看矿机的挖矿状态

此时已经将挖到的交易打入到区块中。查看 node2 账户的余额,展示如下:

到目前为止已经完成了 POA 私有链的所有内容的搭建。

17.加入新可信节点

按照预先实验设计,signer2 也为挖矿节点,如果此时启动 signer2 节点进行挖矿,则会出现未授权的异常,如下图所示:

18.节点授权

必须回到已经在授权名单内的节点的 console 界面下,将新的节点加入。在 signer1 的 console输入指令:

此时 signer1 挖矿节点的日志已经发生变化,已经签名,等待其他签名者。

19.重新启动

此时需要以输入密码的形式重新启动 signer2

1
./geth --datadir signer2/data --networkid 66300 --port 3003 --unlock f5413187e29113841db0ec73a2c559a53b6be7fe console   

建立连接,使用 admin.addPeer()重新建立连接

1
 admin.addPeer("enode://0d2d75b5e6fd5a7e3f82da882e49b4f74206c136a241b04a2f8ba95246df 8eb55f79de9562ffe68d5582f6e0424cfea950166236a3a7cee3f3d4cd084fc33cef@127.0.0.1:3003")

20.启动 singer2 开始挖矿

可以看到 signer1 和 signer2 在交替进行挖矿。

在 40 分 36 时,singner1,挖到了一个合适的区块, 进行签名后并立即进行广播,同时 signer2 获取到了最新的区块段,签名后并提交到网络中。singner1 在收到签名后进行打包,合并到区块中,并广播最新的消息。

至此,环境搭建全部完成

感谢HPB团队整理。

上一篇: 浅析Hyperledger Fabric共识算法
下一篇: Last Winner的最后赢家:智能合约超大规模黑客攻击手法曝光
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,358.04
37,039.98 USDT
-0.08%
ETH以太坊
¥14,381.54
2,015.04 USDT
-0.33%
USDT泰达币
¥7.20
1.01 USDT
+0.03%
BNB币安币
¥1,622.26
227.30 USDT
-0.04%
XRP瑞波币
¥4.34
0.60860 USDT
+1.11%
USDC
¥7.14
1.00 USDT
+0.04%
SOLSolana
¥397.24
55.66 USDT
+0.89%
OKBOK币
¥398.18
55.79 USDT
-1.98%
ADA艾达币
¥2.68
0.37490 USDT
-1.52%
DOGE狗狗币
¥0.55410
0.07765 USDT
-1.04%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.433E-5 USDT
-17.92%
Gala
¥0.18
0.025395 USDT
-4.47%
dYdX
¥22.45
3.1738 USDT
-1.74%
比特股
¥0.05
0.006817 USDT
+3.93%
PancakeSwap
¥15.45
2.1845 USDT
-3.6%
Conflux
¥1.07
0.1514 USDT
-3.57%
Filecoin
¥31.38
4.4363 USDT
-1.25%
FTX Token
¥30.21
4.2702 USDT
+16.02%
Shiba Inu
¥0.00
8.12E-6 USDT
-2.52%
Yield Guild Games
¥2.54
0.3591 USDT
-0.91%
比特币
¥262,018.97
37039.98 USDT
-0.08%
比原链
¥0.07
0.010012 USDT
-5.35%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP