Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
share
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张振华
share
Commits
e7a4c7e3
Commit
e7a4c7e3
authored
Jul 11, 2019
by
张振华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
5bbc7aeb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
25 deletions
+25
-25
Dpos投票合约介绍.md
dpos共识/Dpos投票合约介绍.md
+25
-25
No files found.
dpos共识/Dpos投票合约介绍.md
View file @
e7a4c7e3
#一.Dpos投票合约介绍
#
一.Dpos投票合约介绍
该合约主要是配合Dpos共识,完成:
该合约主要是配合Dpos共识,完成:
(1)候选节点的注册、去注册、投票及查询管理。
(1)候选节点的注册、去注册、投票及查询管理。
(2)Dpos共识运行过程中,得票数TopN(N为约定的受托节点数量)受托节点的VRF相关信息的分阶段发布管理。
(2)Dpos共识运行过程中,得票数TopN(N为约定的受托节点数量)受托节点的VRF相关信息的分阶段发布管理。
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
(7)新的cycle中,使用上述VRF信息进行受托节点的出块顺序的重新洗牌,按洗牌结果决定各受托节点出块的顺序
(7)新的cycle中,使用上述VRF信息进行受托节点的出块顺序的重新洗牌,按洗牌结果决定各受托节点出块的顺序
#二.测试准备
#
二.测试准备
./chain33-cli --rpc_laddr="${rpcAddr}" 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
museum company museum put digital march stadium dutch call matter mind error elbow battle avocado
...
@@ -41,7 +41,7 @@ museum company museum put digital march stadium dutch call matter mind error elb
...
@@ -41,7 +41,7 @@ museum company museum put digital march stadium dutch call matter mind error elb
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01" -l genesis2
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01" -l genesis2
#三.导入超级节点的私钥到各个超级节点上
#
三.导入超级节点的私钥到各个超级节点上
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "5A6A14DA6F5A42835E529D75D87CC8904544F59EEE5387A37D87EEAD194D7EB2" -l test1
./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 "754F53FCEA0CB1F528918726A49B3551B7F1284D802A1D6AAF4522E8A8DA1B5B" -l test2
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "85CA38F5FB65E5E13403F0704CA6DC479D8D18FFA5D87CE5A966838C9694EAFE" -l test3
./chain33-cli --rpc_laddr="${rpcAddr}" account import_key -k "85CA38F5FB65E5E13403F0704CA6DC479D8D18FFA5D87CE5A966838C9694EAFE" -l test3
...
@@ -49,8 +49,8 @@ museum company museum put digital march stadium dutch call matter mind error elb
...
@@ -49,8 +49,8 @@ museum company museum put digital march stadium dutch call matter mind error elb
公私钥用secp256k1体系的,无论是共识消息的签名验签,还是账户代币抵押,以及参与VRF运算,都是一套公私钥。
公私钥用secp256k1体系的,无论是共识消息的签名验签,还是账户代币抵押,以及参与VRF运算,都是一套公私钥。
#四.超级节点账户转入抵押用的代币
#
四.超级节点账户转入抵押用的代币
##(1)向各个超级节点的地址上转入代币,用于抵押
##
(1)向各个超级节点的地址上转入代币,用于抵押
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./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 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
./chain33-cli --rpc_laddr="${rpcAddr}" coins transfer -a 20000 -t 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
...
@@ -61,13 +61,13 @@ museum company museum put digital march stadium dutch call matter mind error elb
...
@@ -61,13 +61,13 @@ museum company museum put digital march stadium dutch call matter mind error elb
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt
##(2)查看账户余额
##
(2)查看账户余额
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b
./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 14w5JaGDrXTZwF5Wv51UAtuGgAupenLAok
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
./chain33-cli --rpc_laddr="${rpcAddr}" account balance -a 1DQUALqaqPUhJX6FWMCqhvnjrkb6ZfrRmf
##(3)构造交易,从各个超级节点的账户向DPos合约转入抵押抵押用的代币,比如10000个。
##
(3)构造交易,从各个超级节点的账户向DPos合约转入抵押抵押用的代币,比如10000个。
./chain33-cli --rpc_laddr="${rpcAddr}" coins send_exec -a 15000 -e dpos
./chain33-cli --rpc_laddr="${rpcAddr}" coins send_exec -a 15000 -e dpos
0a05636f696e731235180a2a311080b0def7d32b220464706f732a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d394420a08d0630998ee6f1c7f1afda6e3a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d3944
0a05636f696e731235180a2a311080b0def7d32b220464706f732a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d394420a08d0630998ee6f1c7f1afda6e3a2231435039566e7666534c594e5a75696864424a6e324e587179776d5178487a6d3944
...
@@ -79,7 +79,7 @@ museum company museum put digital march stadium dutch call matter mind error elb
...
@@ -79,7 +79,7 @@ museum company museum put digital march stadium dutch call matter mind error elb
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0x41b620574d0717364892799650509b4fd1184383e5d7e6e7668da599d643cc3f
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0x41b620574d0717364892799650509b4fd1184383e5d7e6e7668da599d643cc3f
#五.通过Dpos合约接口和合约进行交互
#
五.通过Dpos合约接口和合约进行交互


...
@@ -102,7 +102,7 @@ Available Commands:
...
@@ -102,7 +102,7 @@ Available Commands:
vrfQuery query vrf info
vrfQuery query vrf info
vrfRPRegist regist r,p of vrf
vrfRPRegist regist r,p of vrf
##(1)转入足够数量的抵押代币后,可以注册为超级节点的候选节点,注册成功代币将被冻结在合约中。
##
(1)转入足够数量的抵押代币后,可以注册为超级节点的候选节点,注册成功代币将被冻结在合约中。
./chain33-cli --rpc_laddr="${rpcAddr}" dpos regist -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -i 192.168.0.155 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./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 sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
...
@@ -117,10 +117,10 @@ Available Commands:
...
@@ -117,10 +117,10 @@ Available Commands:
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
##(2)可通过查询交易了解具体执行结果
##
(2)可通过查询交易了解具体执行结果
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0xd2649fe7ecf8e3fbd94044a46ee94c82cfc500f55ca63d3ffd314e3bcec6d47b
./chain33-cli --rpc_laddr="${rpcAddr}" tx query -s 0xd2649fe7ecf8e3fbd94044a46ee94c82cfc500f55ca63d3ffd314e3bcec6d47b
##(3)已注册节点可以撤销注册,撤销成功后,抵押冻结的代币将被解除冻结
##
(3)已注册节点可以撤销注册,撤销成功后,抵押冻结的代币将被解除冻结
./chain33-cli --rpc_laddr="${rpcAddr}" dpos cancelRegist -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./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 sign -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
...
@@ -129,30 +129,30 @@ Available Commands:
...
@@ -129,30 +129,30 @@ Available Commands:
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -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}" 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 sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
./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}" 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 sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
##(6)任务账户地址投票后,可以撤回投票,抵押的代币解除冻结:
##
(6)任务账户地址投票后,可以撤回投票,抵押的代币解除冻结:
./chain33-cli --rpc_laddr="${rcpAddr}" dpos cancelVote -k ${key} -v ${votes}
./chain33-cli --rpc_laddr="${rcpAddr}" dpos cancelVote -k ${key} -v ${votes}
./chain33-cli --rpc_laddr="${rcpAddr}" wallet sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet sign -a ${addr} -d $tx
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
./chain33-cli --rpc_laddr="${rcpAddr}" wallet send -d "$sig"
##(7)查询备选节点信息(支持按公钥查询,按TOPN(投票数排序)查询):
##
(7)查询备选节点信息(支持按公钥查询,按TOPN(投票数排序)查询):
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t pubkeys -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t pubkeys -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t topN -n 1
./chain33-cli --rpc_laddr="${rpcAddr}" dpos candidatorQuery -t topN -n 1
##(8)某个地址投票给某个超级节点的票数信息。
##
(8)某个地址投票给某个超级节点的票数信息。
./chain33-cli --rpc_laddr="${rpcAddr}" dpos voteQuery -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
./chain33-cli --rpc_laddr="${rpcAddr}" dpos voteQuery -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -k 027848E7FA630B759DB406940B5506B666A344B1060794BBF314EB459D40881BB3
#六.超级节点切换的逻辑
#
六.超级节点切换的逻辑
如果超级节点数量超过约定数量(比如约定21个,实际100个),则将统计投票数进行切换,共识模块周期检测DPos投票合约,获取TopN(比如得票数前21)的节点,如果发现节点有变化,chain33将重启共识模块,用新的超级节点进行共识。
如果超级节点数量超过约定数量(比如约定21个,实际100个),则将统计投票数进行切换,共识模块周期检测DPos投票合约,获取TopN(比如得票数前21)的节点,如果发现节点有变化,chain33将重启共识模块,用新的超级节点进行共识。


...
@@ -162,23 +162,23 @@ Available Commands:
...
@@ -162,23 +162,23 @@ Available Commands:
当超级节点有更新时,采用了重启共识模块的方式,是否有副作用? 有没有更好的方式?
当超级节点有更新时,采用了重启共识模块的方式,是否有副作用? 有没有更好的方式?
#七.采用VRF算法来确定超级节点的出块顺序
#
七.采用VRF算法来确定超级节点的出块顺序
##(1)各个超级节点,在一个Cycle开始时,发布各自的M
##
(1)各个超级节点,在一个Cycle开始时,发布各自的M
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfMRegist -c 10001 -m data1 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./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 sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
##(2)各个超级节点,在一个Cycle的下半周期开始,发布各自的R、P
##
(2)各个超级节点,在一个Cycle的下半周期开始,发布各自的R、P
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfRPRegist -c 10001 -r 22a58fbbe8002939b7818184e663e6c57447f4354adba31ad3c7f556e153353c -p 5ed22d8c1cc0ad131c1c9f82daec7b99ff25ae5e717624b4a8cf60e0f3dca2c97096680cd8df0d9ed8662ce6513edf5d1676ad8d72b7e4f0e0de687bd38623f404eb085d28f5631207cf97a02c55f835bd3733241c7e068b80cf75e2afd12fd4c4cb8e6f630afa2b7b2918dff3d279e50acab59da1b25b3ff920b69c443da67320 -k 03EF0E1D3112CF571743A3318125EDE2E52A4EB904BCBAA4B1F75020C2846A7EB4
./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 sign -a 15LsTP6tkYGZcN7tc1Xo2iYifQfowxot3b -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
./chain33-cli --rpc_laddr="${rpcAddr}" wallet send -d
##(3)可以按时间或者时间戳或者cycle来查询某个时间点或者周期内各超级节点生成的VRF信息。
##
(3)可以按时间或者时间戳或者cycle来查询某个时间点或者周期内各超级节点生成的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 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 timestamp -s 121212123
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfQuery -t cycle -c 10001
./chain33-cli --rpc_laddr="${rpcAddr}" dpos vrfQuery -t cycle -c 10001
##(4)每个周期的VRF信息,用于新周期的超级节点出块排序。超级节点根据上一周期的VRF信息来决定新一周期的出块顺序
##
(4)每个周期的VRF信息,用于新周期的超级节点出块排序。超级节点根据上一周期的VRF信息来决定新一周期的出块顺序
针对每个超级节点的M,R,P进行计算:hash(上一周期的blockhash+R),结果进行排序,决定节点在新周期的出块顺序。
针对每个超级节点的M,R,P进行计算:hash(上一周期的blockhash+R),结果进行排序,决定节点在新周期的出块顺序。
问题:
问题:
(1)如果超级节点不变,好处理。
(1)如果超级节点不变,好处理。
...
@@ -188,7 +188,7 @@ Available Commands:
...
@@ -188,7 +188,7 @@ Available Commands:
(5)整体上还有不少细节场景需要考虑。
(5)整体上还有不少细节场景需要考虑。
///////////////
///////////////
#八.附录1:
#
八.附录1:
以下为使用快捷脚本的命令,减少命令输入,方便测试使用。
以下为使用快捷脚本的命令,减少命令输入,方便测试使用。
./init.sh init
./init.sh init
...
@@ -218,7 +218,7 @@ Available Commands:
...
@@ -218,7 +218,7 @@ Available Commands:
./init.sh cancelVote 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt 03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE 200
./init.sh cancelVote 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt 03F4AB6659E61E8512C9A24AC385CC1AC4D52B87D10ADBDF060086EA82BE62CDDE 200
#九.附录2:
#
九.附录2:
以下为方便测试使用的init.sh脚本的内容:
以下为方便测试使用的init.sh脚本的内容:
```
shells
```
shells
rcpAddr="http://192.168.0.155:9801"
rcpAddr="http://192.168.0.155:9801"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment