参考:http://www.8btc.com/ethereum-parity
https://wiki.parity.io/Demo-PoA-tutorial
什么情况下可以建立自己测试用的PoA chain?
- 公司内网或无对外网络,无法同步区块
- 降低测试时等待区块的时间
- 不想碰到testrpc各种雷
Parity POA官方文档:https://wiki.parity.io/Demo-PoA-tutorial
Parity UI:https://wiki.parity.io/Parity-Wallet
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。
安装Parity各系统参考:https://github.com/paritytech/parity-ethereum
例:Mac下通过Homebrew来安装。
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
and
brew reinstall parity
4、查看安装版本
parity --version
二、设置chain spec
{
"name": "DemoPoA",
"engine": {
"authorityRound": {
"params": {
"stepDuration": "5",
"validators" : {
"list": []
}
}
}
},
"params": {
"gasLimitBoundDivisor": "0x400",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID" : "0x2323",
"eip155Transition": 0,
"validateChainIdTransition": 0,
"eip140Transition": 0,
"eip211Transition": 0,
"eip214Transition": 0,
"eip658Transition": 0
},
"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 = 8450 - 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 = 8451
[ipc]
disable = true - base_path是指与parity demo-spec.json 同级的目录路径
我们将创建三个帐户:两个权限和一个用户帐户。这里只记录两种:
方法1.使用RPC
使用启动节点0 parity --config node0.toml。
RPC可以通过访问web3,parity.js或简单地使用curl。这将创建第一个权限地址:
curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["node0", "node0"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
返回的地址应该是0x00bd138abd70e2f00903268f3db08f2d25677c9e。
用户地址:
curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["user", "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
返回的地址应该是0x004ec07d2329997267ec62b4166639513386f32e。
现在启动另一个节点parity --config node1.toml并创建第二个权限帐户:
curl --data '{"jsonrpc":"2.0","method":"parity_newAccountFromPhrase","params":["node1", "node1"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8541
返回的地址应该是0x00aa39d30f0d20ff03a22ccfc30b7efbfca597c2。
方法2.使用UI
- 使用启动节点0 parity --config node0.toml
- 启动Parity UI并完成初始设置
- 点击“RESTORE ACCOUNT”
- 使用短语“node0”和密码“node0”
- 新创建的帐户应该有地址 0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e
- 现在从另一个短语“用户”和密码“用户”恢复,这将导致帐户0x004ec07d2329997267ec62b4166639513386f32e
- 使用启动节点1 parity --config node1.toml
- 去 localhost:8181
- 再次从短语“node1”和密码“node1”中恢复,这将创建帐户 0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2
3.完成链规范
如果帐户是根据短语创建的,我们现在应该进行以下设置:
- 节点0具有0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e权限帐户和0x004ec07d2329997267Ec62b4166639513386F32E用户帐户
- 节点1具有0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2权限帐户
现在可以将帐户添加到spec文件中。打开demo-spec.json备份并将我们刚创建的权限添加到"validators"数组中:
"validators" : {
"list": [
"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e",
"0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
]
}
然后将我们的用户帐户添加到创世纪,以便我们有一些平衡发送:
"0x004ec07d2329997267ec62b4166639513386f32e": { "balance": "10000000000000000000000" }
完整demo-spec.json应该如下所示:
{
"name": "DemoPoA",
"engine": {
"authorityRound": {
"params": {
"stepDuration": "5",
"validators" : {
"list": [
"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e",
"0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
]
}
}
}
},
"params": {
"gasLimitBoundDivisor": "0x400",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID" : "0x2323",
"eip155Transition": 0,
"validateChainIdTransition": 0,
"eip140Transition": 0,
"eip211Transition": 0,
"eip214Transition": 0,
"eip658Transition": 0
},
"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 } } } },
"0x004ec07d2329997267Ec62b4166639513386F32E": { "balance": "10000000000000000000000" }
}
}
4.运行授权节点
现在规范已经完成,我们可以启动将运行链的两个节点。要将节点作为权限运行,我们需要启用它来签署共识消息。
首先,让我们用节点密码创建一个文件node.pwds。每行将包含我们在创建权限帐户时使用的密码,要存储在名为node.pwds的文件中的内容为:
node0
node1
现在我们可以添加engine-signer到配置文件中。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 = 8450
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e"
reseal_on_txs = "none"
并且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 = 8451
[ipc]
disable = true
[account]
password = ["node.pwds"]
[mining]
engine_signer = "0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2"
reseal_on_txs = "none"
现在可以启动这两个节点。节点0:
parity --config node0.toml
和节点1:
parity --config node1.toml
5.连接节点
为了确保节点彼此连接,我们需要知道它们的enode地址并通知另一个节点。有三种方法可以获得enode:
- RPC
- UI(在页脚中)
- 启动控制台输出
获得后,可以将它们作为引导节点添加到demo-spec.json保留对等体中。
在这里我们将简单地使用curl。获取节点0 enode:
curl --data '{"jsonrpc":"2.0","method":"parity_enode","params":[],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
将“结果”添加到节点1(enode://RESULT在命令中替换):
curl --data '{"jsonrpc":"2.0","method":"parity_addReservedPeer","params":["enode://RESULT"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8541
现在节点应该0/1/25 peers在控制台中指示,这意味着它们彼此连接。
6.发送交易
发送事务的两种主要方式是RPC和UI。
RPC
从用户帐户向权限node0发送一些令牌:
2b5e3af16b1880000
curl --data '{"jsonrpc":"2.0","method":"personal_sendTransaction","params":[{"from":"0x004ec07d2329997267Ec62b4166639513386F32E","to":"0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e","value":"0xde0b6b3a7640000"}, "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
提交请求后,应在几秒钟后发出阻止。您可以检查其他帐户是否收到了资金:
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "latest"],"id":1}' -H "Content-Type: application/json" -X POST localhost:8540
我们还可以将一些发送到另一个节点上的帐户:
curl --data '{"jsonrpc":"2.0","method":"personal_sendTransaction","params":[{"from":"0x004ec07d2329997267Ec62b4166639513386F32E","to":"0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2","value":"0xde0b6b3a7640000"}, "user"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8540
并检查是否收到询问另一个节点:
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x00Aa39d30F0D20FF03a22cCfc30B7EfbFca597C2", "latest"],"id":1}' -H "Content-Type: application/json" -X POST localhost:8541
7.进一步发展
您现在可以创建更多帐户,发送价值,编写合同并进行部署。用于开发和使用以太坊网络的所有工具也可用于此网络。
要在多台计算机上部署Parity,您可能会发现docker构建很有用。
要添加非授权节点,可以使用以下更简单的配置:
[parity]
chain = "demo-spec.json"
base_path = "/tmp/parity2"
[network]
port = 30302
[rpc]
port = 8542
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
[ui]
port = 8182
[websockets]
port = 8452
[ipc]
disable = true
然后,帐户和连接节点可以与权限节点相同。为了确保接受事务,权限也可以在usd_per_tx = "0"字段下运行[mining]。任何提交交易的节点都可以免费提供。
在不同的机器上运行节点时,大多数字段都是冗余的,因此基本配置只有链和可能的RPC apis:
[parity]
chain = "demo-spec.json"
[rpc]
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts”]
或者只是跑parity --chain demo-spec.json!
-
补充:分享给区网内其他人使用
在开发时通常会将node跑在server上,让其他人可以透过JSON RPC port连接上去使用,此时只要在config里面加入 [interface] 设定即可。
假设server ip为192.168.1.1,将 node0.toml 修改如下:
[rpc]
port = 8540
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces", "rpc", "parity_accounts"]
interface = "192.168.1.1"- 坑点:我在使用时,使用Vmware虚拟机搭建,parity默认绑定的是本机的IP,导致外部一直不能访问,写入interface = "0.0.0.0"后解决外部访问问题。
*在JSONRPC接口的调用过程中,如果遇到跨域问题,需要在配置文件中添加cors=all 或者 cors=:
[rpc]
cors = ["all"]**钱包交易转账时,可能会遇到交易接口调用成功,但balance并没有发生变化的情况,你需要用以下命令启动:
parity --config node0.toml --nat extip:X.X.X.X**如果你需要获取钱包的操作记录,你需要给你的钱包开启此功能,在配置文件中添加如下:
[footprint]
tracing = "on"
然后调用trace_filter接口即可,但此功能比较占用服务资源,如果不是特别需要,建议不要开启。
网友评论