From: mars Date: Tue, 2 Apr 2019 09:24:11 +0000 (+0800) Subject: Add doc of consensus X-Git-Tag: v1.0.5~215^2~1^2~6 X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=commitdiff_plain;h=7effa49673101d78a462fe1fc82c81d4ab73cbc9 Add doc of consensus --- diff --git a/docs/vapor-docs/0.1/core/consensus.md b/docs/vapor-docs/0.1/core/consensus.md index a3fc8d2d..bc777008 100644 --- a/docs/vapor-docs/0.1/core/consensus.md +++ b/docs/vapor-docs/0.1/core/consensus.md @@ -18,4 +18,177 @@ - 注册、投票的信息由vapor底层协议负责传输。 - 把注册、投票信息保存在内存以及db中。 -- DPoS 共识模块查看注册、投票信息,完成共识。 \ No newline at end of file +- DPoS 共识模块查看注册、投票信息,完成共识。 + + + +## 业务流程 + +1、vapor侧链启动,由创始块中超级出块人出块 + +2、用户从主链转移资产到侧链,并注册为候选出块人 + +3、用户投票给候选出块人,赛选出块人 + +## dpos逻辑 + +1、交易格式 + +~~~json + + ``` + { + "base_transaction":null, + "actions":[ + { + "address":"vsm1qndq3w79kwtk9acnuswxlwxjqweglwhg8yrzp2c", + "amount":100000000, + "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name":"test-node1", + "dpos_type":1, + "type":"dpos" + } + ], + "ttl":0, + "time_range":43432 + } + ``` +~~~ + +​ dpos_type: 1代表注册为候选出块人,2代表投票,3代表取消投票 + +​ type: dpos表示跟共识有关系的交易 + +​ amount: 表示注册交易的交易费,目前是1btm + +2、逻辑说明 + +​ (1)、检查交易费在用户地址是否够用,序列化的注册、注册类型(用op表示)序列化后放入tx的referenceData + +​ (2)、在内核chain做saveBlock之前做dpos验证 + +- 验证块的时间-当前时间的>出块时间间隔 +- 通过上一个块与当前出的块的时间获取出块轮数以及当前轮的出块索引,判断当前出块的顺序是否正确 + +​ (3)、验证不可逆的区块时候有效(针对同步) + +​ (4)、验证block中的候选人列表时候正确,并且生成不可逆区块 + +- 如果当前block与上一个不是同一个出块的轮,验证出块人列表,并确认不可逆的区块 +- 如果在同一个出块轮,验证出块顺序以及出块人列表。 +- 验证当前的出块人是否正确 + +​ (5)、验证交易完成后,先计算用户的余额,在处理与dpos相关的交易(注册、投票、取消投票) + +### 计算余额 + +统计交易的输入输出计算每个地址的余额 + +### 注册逻辑 + +1、判断注册交易的交易费是否大于RegisrerForgerFee + +2、判断注册的名字是否已经注册,存在则注册失败 + +3、判断注册的地址是否已经注册,存在则注册失败 + +4、否则,添加到name、address的注册列表 + +### 投票逻辑 + +1、判断投票人的投票的出块人是否大于MaxNumberOfVotes + +2、判断被投票人地址是否已经注册 + +3、判断被投票人是否被投票人投过 + +4、判断通过写入到投票人、被投票人的投票列表 + +### 取消投票逻辑 + +1、判断被投票人是否已经投票,投过就从被投票人列表中删除 + +2、从投票人列表删除被投票人信息 + + + +### dpos注册、投票、取消投票的数据结构 + +1、交易结构ReferenceData的数据 + +type DposMsg struct { + +​ Type vm.Op `json:"type"` + +​ Data []byte `json:"data"` + +} + +Data:是以下的数据结构的序列化 + +Type: + +​ OP_DELEGATE Op = 0xd0 + +​ OP_REGISTE Op = 0xd1 + +​ OP_VOTE Op = 0xd2 + +​ OP_REVOKE Op = 0xd3 + +2、coinbase交易中的出块人列表 + +// DELEGATE_IDS PUBKEY SIG(block.time) + +type DelegateInfoList struct { + +​ Delegate DelegateInfo `json:"delegate"` + +​ Xpub chainkd.XPub `json:"xpub"` + +​ SigTime chainjson.HexBytes `json:"sig_time"` + +} + +type Delegate struct { + +​ DelegateAddress string `json:"delegate_address"` + +​ Votes uint64 `json:"votes"` + +} + +type Delegate struct { + +​ DelegateAddress string `json:"delegate_address"` + +​ Votes uint64 `json:"votes"` + +} + + + +3、注册出块人的信息 + +type RegisterForgerData struct { + +​ Name string `json:"name"` + +} + +4、投票的信息 + +type VoteForgerData struct { + +​ Forgers []string `json:"forgers"` + +} + +5、取消投票的信息 + +type CancelVoteForgerData struct { + +​ Forgers []string `json:"forgers"` + +} +