Commit d1a97855 authored by 张振华's avatar 张振华

update

parent 96585425
0.Dpos投票合约介绍
0.Dpos投票合约介绍
该合约主要是配合Dpos共识,完成(1)候选节点的注册、去注册、投票及查询管理。(2)Dpos共识运行过程中,得票数TopN(N为约定的受托节点数量)受托节点的VRF相关信息的分阶段发布管理。
概要描述如下:
(1)系统初始运行时,会有默认的几个受托节点进行共识运行。
(2)系统运行后,可以重新选举受托节点,各个候选节点需要抵押10000个币,注册成为候选节点。
(3)候选节点可以在社区宣传,让大家为自己投票。
......@@ -15,16 +15,16 @@
1.测试准备
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" seed generate -l 0
./chain33-cli --rpc_laddr="${rpcAddr}" seed generate -l 0
museum company museum put digital march stadium dutch call matter mind error elbow battle avocado
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" seed save -s "museum company museum put digital march stadium dutch call matter mind error elbow battle avocado" -p zzh123456
./chain33-cli --rpc_laddr="${rpcAddr}" seed save -s "museum company museum put digital march stadium dutch call matter mind error elbow battle avocado" -p zzh123456
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet unlock -p zzh123456
./chain33-cli --rpc_laddr="${rpcAddr}" wallet unlock -p zzh123456
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account create -l zzh
./chain33-cli --rpc_laddr="${rpcAddr}" account create -l zzh
{
"acc": {
"balance": "0.0000",
......@@ -34,54 +34,54 @@ museum company museum put digital march stadium dutch call matter mind error elb
"label": "zzh"
}
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account import_key -k "CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944" -l genesis
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944" -l genesis
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account import_key -k "4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01" -l genesis2
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01" -l genesis2
2.导入超级节点的私钥到各个超级节点上
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account import_key -k "5A6A14DA6F5A42835E529D75D87CC8904544F59EEE5387A37D87EEAD194D7EB2" -l test1
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account import_key -k "754F53FCEA0CB1F528918726A49B3551B7F1284D802A1D6AAF4522E8A8DA1B5B" -l test2
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account import_key -k "85CA38F5FB65E5E13403F0704CA6DC479D8D18FFA5D87CE5A966838C9694EAFE" -l test3
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "5A6A14DA6F5A42835E529D75D87CC8904544F59EEE5387A37D87EEAD194D7EB2" -l test1
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "754F53FCEA0CB1F528918726A49B3551B7F1284D802A1D6AAF4522E8A8DA1B5B" -l test2
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "85CA38F5FB65E5E13403F0704CA6DC479D8D18FFA5D87CE5A966838C9694EAFE" -l test3
公私钥用secp256k1体系的,无论是共识消息的签名验签,还是账户代币抵押,以及参与VRF运算,都是一套公私钥。
3.超级节点抵押代币 。
3.超级节点账户转入抵押用的代币 。
(1)向各个超级节点的地址上转入代币,用于抵押
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" coins transfer -a 20000 -t 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" coins transfer -a 20000 -t 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" coins transfer -a 20000 -t 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt
(2)查看账户余额
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account balance -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account balance -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" account balance -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
(3)构造交易,从各个超级节点的账户向DPos合约转入抵押币,比如10000个。
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" coins send_exec -a 15000 -e dpos
(3)构造交易,从各个超级节点的账户向DPos合约转入抵押抵押用的代币,比如10000个。
./chain33-cli --rpc_laddr="${rpcAddr}" coins send_exec -a 15000 -e dpos
0a05636f696e731235180a2a311080b0def7d32b220464706f732a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d394420a08d0630998ee6f1c7f1afda6e3a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d3944
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" tx query -s 0x41b620574d0717364892799650509b4fd1184383e5d7e6e7668da599d643cc3f
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0x41b620574d0717364892799650509b4fd1184383e5d7e6e7668da599d643cc3f
4.通过Dpos合约接口和合约进行交互
![Dpos投票合约状态示意图](./dpos合约状态变迁.png)
user@zzh-PC:~/work/dposv2$ ./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos
user@zzh-PC:~/work/dposv2$ ./chain33-cli --rpc_laddr="${rpcAddr}" dpos
dpos vote management
Usage:
......@@ -99,39 +99,39 @@ Available Commands:
vrfQuery query vrf info
vrfRPRegist regist r,p of vrf
(1)抵押贷币后,可以注册为超级节点的候选节点,注册成功代币将被冻结在合约中。
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos regist -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -i 192.168.0.155 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
(1)转入足够数量的抵押代币后,可以注册为超级节点的候选节点,注册成功代币将被冻结在合约中。
./chain33-cli --rpc_laddr="${rpcAddr}" dpos regist -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -i 192.168.0.155 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos regist -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" dpos regist -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos regist -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -k 03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" dpos regist -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -k 03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
(2)可通过查询交易了解具体执行结果
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" tx query -s 0xd2649fe7ecf8e3fbd94044a46ee94c82cfc500f55ca63d3ffd314e3bcec6d47b
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0xd2649fe7ecf8e3fbd94044a46ee94c82cfc500f55ca63d3ffd314e3bcec6d47b
(3)已注册节点可以撤销注册,撤销成功后,抵押贷币解除冻结
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos cancelRegist -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
(3)已注册节点可以撤销注册,撤销成功后,抵押冻结的代币将被解除冻结
./chain33-cli --rpc_laddr="${rpcAddr}" dpos cancelRegist -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos cancelRegist -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" dpos cancelRegist -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
(4)已撤销节点可以重新注册,再次成为备选节点
(4)已撤销注册的节点可以重新注册,再次成为备选节点,抵押代币同样将被冻结
./chain33-cli --rpc_laddr="${rcpAddr}" dpos reRegist -a ${addr} -i ${ip} -k ${key}
./chain33-cli --rpc_laddr="${rcpAddr}" wallet sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
(5)任意账户地址在Dpos合约中有代币,都可抵押币(冻结在合约中)向超级节点投票:
(5)任意账户地址在Dpos合约中有代币,都可抵押币(冻结在合约中)向超级节点投票:
./chain33-cli --rpc_laddr="${rcpAddr}" dpos vote -k ${key} -v ${votes} -a ${addr}
./chain33-cli --rpc_laddr="${rcpAddr}" wallet sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
......@@ -141,19 +141,19 @@ Available Commands:
./chain33-cli --rpc_laddr="${rcpAddr}" wallet sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
(7)查询备选节点信息(支持按公钥查询,按TOPN查询--按投票数排序):
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos candidatorQuery -t pubkeys -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos candidatorQuery -t topN -n 1
(7)查询备选节点信息(支持按公钥查询,按TOPN(投票数排序)查询):
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t pubkeys -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t topN -n 1
(8)某个地址投票给某个超级节点的票数信息。
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos voteQuery -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
(8)某个地址投票给某个超级节点的票数信息。
./chain33-cli --rpc_laddr="${rpcAddr}" dpos voteQuery -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
5.超级节点切换逻辑
5.超级节点切换逻辑
如果超级节点数量超过约定数量(比如约定21个,实际100个),则将统计投票数进行切换,共识模块周期检测DPos投票合约,获取TopN(比如得票数前21)的节点,如果发现节点有变化,chain33将重启共识模块,用新的超级节点进行共识。
![Dpos超级节点替换处理流程](./Dpos超级节点替换处理流程.png)
这个处理过程可以逐步优化。
这个处理过程可以优化。
目前采用周期性发起jsonrpc调用,查询合约中的TOPN节点信息的方式。是否有更合适的方式?直接读数据库?
当超级节点有更新时,采用了重启共识模块的方式,是否有副作用? 有没有更好的方式?
......@@ -161,24 +161,28 @@ Available Commands:
6.采用VRF算法来确定超级节点的出块顺序
(1)各个超级节点,在一个Cycle开始时,发布各自的M
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos vrfMRegist -c 10001 -m data1 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfMRegist -c 10001 -m data1 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
(2)各个超级节点,在一个Cycle的下半周期开始,发布各自的R、P
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos vrfRPRegist -c 10001 -r 22a58fbbe8002939b7818184e663e6c57447f4354adba31ad3c7f556e153353c -p 5ed22d8c1cc0ad131c1c9f82daec7b99ff25ae5e717624b4a8cf60e0f3dca2c97096680cd8df0d9ed8662ce6513edf5d1676ad8d72b7e4f0e0de687bd38623f404eb085d28f5631207cf97a02c55f835bd3733241c7e068b80cf75e2afd12fd4c4cb8e6f630afa2b7b2918dff3d279e50acab59da1b25b3ff920b69c443da67320 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfRPRegist -c 10001 -r 22a58fbbe8002939b7818184e663e6c57447f4354adba31ad3c7f556e153353c -p 5ed22d8c1cc0ad131c1c9f82daec7b99ff25ae5e717624b4a8cf60e0f3dca2c97096680cd8df0d9ed8662ce6513edf5d1676ad8d72b7e4f0e0de687bd38623f404eb085d28f5631207cf97a02c55f835bd3733241c7e068b80cf75e2afd12fd4c4cb8e6f630afa2b7b2918dff3d279e50acab59da1b25b3ff920b69c443da67320 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
(3)可以按时间或者时间戳或者cycle来查询某个时间点或者周期内各超级节点生成的VRF信息。
./chain33-cli --rpc_laddr="http://192.168.0.155:9801" dpos vrfQuery -t time/timestamp/cycle -d “2019-07-10 18:00:00” / -s 121212123 / -c 10001
(4)每个周期的VRF信息,用于新周期的超节点出块排序。超级节点根据上一周期的VRF信息来决定新一周期的出块顺序
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfQuery -t time -d “2019-07-10 18:00:00”
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfQuery -t timestamp -s 121212123
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfQuery -t cycle -c 10001
(4)每个周期的VRF信息,用于新周期的超级节点出块排序。超级节点根据上一周期的VRF信息来决定新一周期的出块顺序
针对每个超级节点的M,R,P进行计算:hash(上一周期的blockhash+R),结果进行排序,决定节点在新周期的出块顺序。
问题:
(1)如果超级节点不变,好处理。
(2)如果超级节点发生变化,如何处理比较合适?仍然直接使用?
(3)对于m、r、p验证不通过或者未提交、未提交完整的节点,如何惩罚? 暂不允许出块吗?
(4) 目前对于激励还缺乏整体设计,没有加入挖矿,超级节点如何收益?如何激励投票?
(5)整体上还有不少细节场景需要考虑。
///////////////
附录:以下为使用快捷脚本的命令,减少命令输入,方便测试使用。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment