heco private chain 通过智能合约添加验证人
接着上一篇 heco private chain 搭建流程
最高可添加 21个 validator节点, miner.start()的 validator节点大于总量的 1/2+1时会正常出块
1. 扒合约
把 heco系统合约地址 https://github.com/stars-labs/heco-contracts/tree/master/contracts 的合约代码扒下来, 想办法弄到remix里
2. 编译版本
修改 Solidity compiler
的 COMPILER
编译版本为 v0.6.1
, 其他版本会编译不通过
3. 选择验证者
编译通过后到 Deploy&run transactions
页面, 点击 ENVIRONMENT
下面的选项, 选择 Injected Web3
, ACCOUNT
连接到初始验证者(genesis.json里的那一个)地址, 保证账户有余额
contract address
0x000000000000000000000000000000000000f000
// validators contract address0x000000000000000000000000000000000000f001
// punish contract address0x000000000000000000000000000000000000f002
// proposal contract address
选择 CONTRACT 下的 Proposal-Proposal.sol, 设置 At Address
为 0x000000000000000000000000000000000000f002
, 然后点击 At Address
按钮, 点击展开 Deployed Contracts
下的 PROPOSAL AT 0X000...0F002 (BLOCKCHAIN)
第 5, 6, 7步会用到
4. 获取事件 id
使用 web3监听以太坊合约, 下面会用到, 代码执行会报错, 不用管, 提出返回数据的 returnValues
中的 id
执行第 6步前需要运行监听代码, 第 6步执行后提取 id
5. 申请成为出块节点
选择执行 createProposal
参数
dst
需要申请添加的地址details
附加信息 (选填)
对于 genesis.json
的预设地址, 默认会在系统初始化时, 自动添加到审核通过
6. 审核出块申请
选择执行 voteProposal
,当前设计, 合约签名地址需要为已经通过申请的用户, 赞同总数或者拒绝总数, 哪个先超过当前正在出块人数的 1/2+1, 就执行对应的决定, 这个不合理, 应该是需要正在出块人中的1/2+1赞同才有效, 那些之前通过审核, 但不是正在出块的地址, 没有审核资格
参数
id
对应第 4 步提出的 idauth
是否通过(true/false)
7. 取消出块资质
选择执行 setUnpassed,目前合约需要当前合约权限才能禁止掉其他人, 不合理, 后面进行合约修改, 同样需要发起申请, 通过1/2+1人通过, 才会取消对应地址的资格
8. 切换到申请者地址
选择 CONTRACT 下的 Validators-Validators.sol, 设置 At Address
为 0x000000000000000000000000000000000000f000
, 然后点击 At Address
按钮, 然后点击展开 Deployed Contracts
下的 VALIDATORS AT 0X000...0F000 (BLOCKCHAIN)
第 9, 10, 12步会用到
点击 ENVIRONMENT
下面的选项, 选择 Injected Web3
, ACCOUNT
切换到申请者地址, 保证账户有余额
9. 创建 validator地址
选择执行 createOrEditValidator
, 需要先申请, 通过后才允许创建
参数
- feeAddr 该矿工领取奖励时的接收地址 (申请者地址)
- moniker 昵称 (选填)
- identity 身份 (选填)
- website 网址 (选填)
- email 邮箱 (选填)
- details 附加信息 (选填)
10. 抵押系统代币
在 VALUE
下面的第一个文本框里输入质押数量, 第二个选择单位为 Ether
选择执行 stake
, 需要创建完 validator, 才能进行抵押,抵押量不小于 32 ether, 后面挖矿奖励会根据当前用户抵押量所占总比例进行分配
11. 矿工主动提交所得,进行分配
链程序出块后, 自动执行 distributeBlockReward
将打包所得手续费转到合约进行池分配 (后期排查, 节点程序是否可作恶, 抽水), 代币总量到合约后, 合约根据currentValidatorSet中各自地址抵押总额, 以及各自占比进行分配记账 (validatorInfo[地址].hbIncoming)
12. 领取出块奖励
选择执行 withdrawProfits
, 参数validator为矿工地址, 执行签名地址需要与创建时设置的feeAddr一致, 领取时间间隔24小时 (28800块)
参考:
Heco 编译及多节点部署: https://www.bcskill.com/index.php/archives/1017.html