从零构建基于以太坊(Ethereum)钱包Parity联盟链
什么情况下可以建立自己测试用的PoA chain?
- 公司内网或无对外网络,无法同步区块
- 降低测试时等待区块的时间
- 不想碰到testrpc各种雷
PoA Chain特点有
- 有别于
PoW(Proof-of-Work)
需要解数学难题来产生block
,PoA
是依靠预设好的Authority nodes
,负责产生block
。 - 可依照需求设定
Authority node
数量。 - 可指定产生
block
的时间,例如收到交易的5
秒后产生block
。 - 一般的
Ethereum node
也可以连接到PoA Chain
,正常发起transactions
,contracts
等。
大纲
- Parity钱包下载安装
- 设置chain spec
- 设置两个节点
- 设置账号(Account)
- 启动Authority node
- 连接两个节点
- 发送交易
- 分享给其他节点
一、Parity钱包下载安装
之前的教程中我们讲解了Mist钱包、MetaMask、myetherwallet钱包,这篇教程中,我们系统介绍一下Parity钱包的使用,为下一篇文章中联盟链搭建做铺垫。Parity钱包下载安装https://parity.io。
如官网所示,The fastest and most secure way of interacting with the Ethereum blockchainParity
是最快最安全的钱包。
打开官网,我们看到有三种安装方式,第一种,直接下载安装,第二种,Brew
安装,第三种,Docker
安装。
在我们案例中,我们通过Brew
来进行安装。
1、Getting Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2、Adding Parity to your list of Homebrew 'kegs'
打开终端,输入下面的命令,按enter。brew tap paritytech/paritytech
3、Installing Parity
- 稳定版
brew install parity --stable
- 最新版
brew install parity
- 最新开发版
brew install parity --master
- 更新最新版本
brew update && brew upgrade parity
andbrew reinstall parity
4、查看安装版本
liyuechun:~ yuechunli$ parity --version Parity version Parity/v1.8.2-beta-1b6588c-20171025/x86_64-macos/rustc1.21.0 Copyright 2015, 2016, 2017 Parity Technologies (UK) Ltd License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
By Wood/Paronyan/Kotewicz/Drwięga/Volf Habermeier/Czaban/Greeff/Gotchac/Redmann
liyuechun:~ yuechunli$
二、设置chain spec
PoA chain 需要设置一个创世区块。{ "name": "DemoPoA", "engine": { "authorityRound": { "params": { "stepDuration": "5", "validators": { "list": [
] } } } }, "params": { "gasLimitBoundDivisor": "0x0400", "maximumExtraDataSize": "0x20", "minGasLimit": "0x1388", "networkID": "0x2323" }, "genesis": { "seal": { "authorityRound": { "step": "0x0", "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } }, "difficulty": "0x20000", "gasLimit": "0x5B8D80" }, "accounts": { "0x0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, "0x0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, "0x0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, "0x0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } } } }
stepDuration
设定成5秒产生一个区块。validators
设定Authority
的地方,目前先空著,后面创建account
之后再回来填入。
demo-spec.json
。三、设置两个节点
在我们这篇文章中,我们在同一台电脑设置两个节点,跟我们讲解以太坊私网建立 (2) - 同一台电脑/不同电脑运行多个节点时,如果在同一台电脑设置两个节点,需要将rpcport
和port
设置为不同的值,否则就会发生冲突,POA chain中也是一样,需要将一些参数设置为不同的值。-d
:指定存储资料与账号的目录--dport
:指定Parity的network port,可用来让其他node连接--jsonrpc-port
:这是JSON RPC port,使用web3.js时会需要ui-port
:Parity提供的Web-based UI port
Parity node
。parity --chain demo-spec.json -d parity0 --port 30300 --ui-port 8180 --jsonrpc-port 8540 --jsonrpc-apis web3,eth,net,personal,parity,parity_set,traces,rpc,parity_accounts
除了打一长串的指令外,Parity
也提供更为简洁的config
档案设定方式,使用 --config
即可引用配置文件。node0
使用如下配置文件node0.toml
:
[parity]
chain = "demo-spec.json"
base_path = "parity0"
[network]
port = 30300
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8180
[websockets]
port = 8456
node1
使用如下配置文件node1.toml
:
[parity]
chain = "demo-spec.json"
base_path = "parity1"
[network]
port = 30301
[rpc]
port = 8541
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8181
[websockets]
port = 8457
四、设置账号(Account)
我们总共需要设置三个账号,两个Authority
和一个user
账号。第一步:首先启动node0
: parity --config node0.toml

打开网页http://localhost:8180,按照步骤创建一个用户账号。
- 新增
Authority account
,使用Restore
功能,为了示范一致性,我们使用node0
当作pass phrase
。



到目前为止我们已经完成node0
的账号设置。
- Authority account:
0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e
- User account:
0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC
第二步:设置node1
的账号,启动parity --config node1.toml
。步骤相同,连接到 http://localhost:8181 ,pass phrase
使用 node1
。

这样就完成了node1
的账号设置。
- Authority account:
0x00F9B30838ca40c8A53c672840acbDec6fCDb180
第三步:将Authority account 写入 demo-spec.json 文件
"validators": {
"list": [
"0x00F9B30838ca40c8A53c672840acbDec6fCDb180",
"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
]
}
再将user account
加入accounts
,並给一些balance
,后续可以使用。"0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC": {
"balance": "10000000000000000000000"
}
完成后的demo-spec.json
如下:{
"name": "DemoPoA",
"engine": {
"authorityRound": {
"params": {
"stepDuration": "5",
"validators": {
"list": [
"0x00F9B30838ca40c8A53c672840acbDec6fCDb180",
"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
]
}
}
}
},
"params": {
"gasLimitBoundDivisor": "0x0400",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID": "0x2323"
},
"genesis": {
"seal": {
"authorityRound": {
"step": "0x0",
"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}
},
"difficulty": "0x20000",
"gasLimit": "0x5B8D80"
},
"accounts": {
"0x0000000000000000000000000000000000000001": {
"balance": "1",
"builtin": {
"name": "ecrecover",
"pricing": {
"linear": {
"base": 3000,
"word": 0
}
}
}
},
"0x0000000000000000000000000000000000000002": {
"balance": "1",
"builtin": {
"name": "sha256",
"pricing": {
"linear": {
"base": 60,
"word": 12
}
}
}
},
"0x0000000000000000000000000000000000000003": {
"balance": "1",
"builtin": {
"name": "ripemd160",
"pricing": {
"linear": {
"base": 600,
"word": 120
}
}
}
},
"0x0064B0999c0142eE99aB0ceC054BAb53fe0a3EcC": {
"balance": "10000000000000000000000"
},
"0x0000000000000000000000000000000000000004": {
"balance": "1",
"builtin": {
"name": "identity",
"pricing": {
"linear": {
"base": 15,
"word": 3
}
}
}
}
}
}
五、启动Authority node
为了启动Authority node
来产生区块,我们必须设定负责产生block
的signer
,分別是 node0
和 node1 account
。1、第一步,创建一个node.pwds
文件,写入node0
与node1
的password
,内容如下:
node0
node1
2、第二步,在node0.toml文件中加入[account]及[mining]设置,如下:
[parity]
chain = "demo-spec.json"
base_path = "parity0"
[network]
port = 30300
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8180
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
reseal_on_txs = "none"
3、第三步,在node1.toml文件中加入[account]及[mining]设置,如下:
[parity]
chain = "demo-spec.json"
base_path = "parity1"
[network]
port = 30301
[rpc]
port = 8541
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8181
[websockets]
port = 8457
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00F9B30838ca40c8A53c672840acbDec6fCDb180"
reseal_on_txs = "none"
4、第四步,Step 4 分別启动两个node
parity --config node0.toml
parity --config node1.toml
六、连接两个节点
使用Postman
透过JSON RPC
来测试。1、第一步,Post下列JSON数据至 http://localhost:8540 以取得 node0 的enode资料
{
"jsonrpc":"2.0",
"method":"parity_enode",
"params":[],
"id":0
}

获取到的数据如下:
{
"jsonrpc": "2.0",
"result": "enode://cfb3af513da3a7a8138450f0dc01fa38cb2ac837744dc645038940287f4dce3f416f0e7e17fd10619a263c360d9324fd2dcd8753c4500fcc54cf84e076b39cd6@192.168.10.101:30300",
"id": 0
}
"enode://cfb3af513da3a7a8138450f0dc01fa38cb2ac837744dc645038940287f4dce3f416f0e7e17fd10619a263c360d9324fd2dcd8753c4500fcc54cf84e076b39cd6@192.168.10.101:30300"
是node0
的标识。下一步中我们将将它加入到node1
中以实现两个节点之间的连接。