1801
中文 (Chinese) / 授权股权证明详解(关于假设及算法)
« on: April 17, 2014, 03:25:01 am »
DPOS授权股权证明是这样的一个过程:股东可以影响block的产生。股东如何去影响呢?就是去给代表投票。代表是这样的一个角色:在预定的时间,尽可能将所有合法的交易打包成block。
接下来的问题,就是怎么设计一个算法保证能有效可靠的产生block。这个网络要围绕一个目的来建立规则和程序,这个目的就是:保持权力分散和迅速纠正权力滥用。
假设和恒定
1. 算法设计前提是假设:客户端是在秒级的世界时下同步的。
2. 股东对某个代表要么投票赞成要么反对,不能又赞成又反对,这是始终不变的。第一笔交易投给了一个代表,下一笔交易可以投给另外的代表。
3. 代表接受投票的上限是股份额的2%,即8万票。系统拒接代表接受多余的票。
4. 大户可以在预定的时间投票给自己。如果大户滥用这个权利,股东可以投反对票。所以,即使是大户,也要关心小股东的声音。
5. 这种算法的目的是少出力多干活。用户使用这个系统时不需要额外交易(译者理解:相对于mastercoin),额外的内容(代表接受的投票)附加在了交易块里。
(bts::blockchain::transaction) http://bitshares.org/documentation/structbts_1_1blockchain_1_1transaction.html
(bts::blockchain::transaction::vote) http://bitshares.org/documentation/structbts_1_1blockchain_1_1transaction.html#a3cd65e9deb9efbb5fc899aa7b62226f3
代表注册
1. 代表要注册一个特殊标志符,作为股东们的投票对象。
(1) 标识符是int32格式,要简单易于引用。
http://bitshares.org/documentation/structfc_1_1signed__int.html#details
(2) 标识符的状态可以显示出被支持和被反对的情况。
(3) 注册用这个程序代码:bts::blockchain::claim_name_output
http://bitshares.org/documentation/structbts_1_1blockchain_1_1claim__name__output.html
<1>当,bts::blockchain::claim_name_output::delegate_id等于0时,表示没有获得投票。大于0,虽然有投票但投票额不在有效排行内,则代表为辞职状态。
<2> bts::blockchain::claim_name_output::name名字要是各民族人群都能识别的。
<3> bts::blockchain::claim_name_output::data这里面放附加信息,如一个网站域名。
2. 注册费是一个块税收额的100倍。
(1) 确保代表严肃重视这项工作。
(2) 某代表获取1000个block的投票的时间间隔是两周还是两个月,取决于网络。
3. 代表们每年要更新一次注册。
(1) 排名前100的代表,0付费。
(2) 其他代表重新支付一次注册费。
4. 注册时名程不能重复,要有信息沟通渠道,如一个网页。
投票算法
每个钱包都有以下信息:
1. trusted_delegates—本客户端保存的代表IDs数组,他们是可信的,他们在本客户端上没有污点记录。
2. distrusted_delegates—本客户端保存的代表IDs数组,他们是不可信的,本客户端掌握了他们的污点记录,即使是蛛丝马迹。
3. observed_delegates—这个数组保存本钱包观测到的代表IDs和统计数据。
Blockchain追踪这个:
1. ranked_delegates—这个数组保存所有当前block接收的网络投票。
一旦形成个交易,你的钱包就有按下面的规则精确的选择一个代表接收投票:
1. 如果你钱包里有一个distrusted_delegates,并且他在本轮投票中拍前200名,那就优先投这个反对票。
2. 如果没有反对票要投,就投一个排名落后的trusted_delegates。
3. 如果你的钱包没有怎么用过,没有trusted_delegates,那就从observed_delegates中找一个积分高,但本轮中别人使用少的代表。
一旦形成一个交易,你的钱包就要根据代表选择参与交易的币 (你的某个币也是经由投票得来的,传给你某币时经手的代表给你的币涂上了“颜色”),程序如下:
1. 如果是要投反对票,那就优先使用distrusted_delegates经手的币。(不信任了就断交吧,留着闹心)
2. 优先使用币龄大的。避免静止风险。
3. 如果币龄超过11个月了,那就自动参与交易进行更新。(可能类似找零机制)
代表评分
一个客户端,根据自己观察到的某代表工作性能为依据对其进行评分,统计工作性能的方法:
1. 所有block--这个代表产生的所有block。
2. 所有丢失的block—这个代表理应产生但未产生的block,以chain记录为准。
3. 平均向后延迟—从接收到产生block的要求到实际产生出来的延迟时间。延迟的因素很多,可能外因居多。
4. 平均向前延迟—产生block时抢跑,可能是客户端时钟问题,也可能是向后延迟的太厉害。一个代表出现这种行为,也可以怀疑是为了同其他代表竞争而作弊。跑的慢不好,但也要避免抢跑,大家的指标要尽量稳定。
5. 计划产量和实际产量的比值—这里的产量,即,block中包含的交易数量。漏掉的交易越少越好。比值为1最好。
6. Unkonwn交易在block中的比例。代表可能会添加奇怪交易,希望避免发生这种现象。
7. 无效block数目。代表们都是很严肃的,不要发生这种添乱的行为。
8. 上限收费行为所占的比例。收费上限:最近100个block平均手续费的10%。收费便宜的代表更有群众基础。
评分系统不是完美的,数据不是绝对的,只是鼓励代表们多多竞争,并且以排名进行分类。
Block确认
产生了一个新block时,钱包要产生下列行为:
查找observed_delegates,并进行记录:
a. 时钟周期。
b. Block中包含的合理的交易数据比例。
c. Block中包含的不合理的交易数据比例。
将证实了的block推送到blockchain。最后的一条交易通常是给代表的服务费。
Block制造者
任何一个有代表ID的钱包,如果这个ID在前100名里,就可以去制造block。制造的这个block一经推到blockchain里,就有一个钱包去确认Block,即,坚持这个ID的代表是否合格。合格,则运行下面的程序:
CURRENT_TIME = UTC_SEC / BLOCK_INTERVAL
ROUND_TIME = (CURRENT_TIME / 100) * 100
PRODUCE_TIME = (ROUND_TIME + RANK) * BLOCK_INTERVAL
If PRODUCE_TIME < CURRENT_TIME then PRODUCE_TIME += 100 * BLOCK_INTERVAL
备注:一个钱包,可以有多个代表ID。
原文出处: http://bitshares.org/documentation/group__dpos.html
中文wiki: http://p2p3p.com/index.php?title=Dpos%E6%8E%88%E6%9D%83%E8%82%A1%E6%9D%83%E8%AF%81%E6%98%8E
爱比特btc-address:12iZUK5VCFKHxJTgkKo7NHtxNGbZSTDabb
pts-address:PuhKqyVgzsptuCQjsV7ZPf96qQWoA2X9st
接下来的问题,就是怎么设计一个算法保证能有效可靠的产生block。这个网络要围绕一个目的来建立规则和程序,这个目的就是:保持权力分散和迅速纠正权力滥用。
假设和恒定
1. 算法设计前提是假设:客户端是在秒级的世界时下同步的。
2. 股东对某个代表要么投票赞成要么反对,不能又赞成又反对,这是始终不变的。第一笔交易投给了一个代表,下一笔交易可以投给另外的代表。
3. 代表接受投票的上限是股份额的2%,即8万票。系统拒接代表接受多余的票。
4. 大户可以在预定的时间投票给自己。如果大户滥用这个权利,股东可以投反对票。所以,即使是大户,也要关心小股东的声音。
5. 这种算法的目的是少出力多干活。用户使用这个系统时不需要额外交易(译者理解:相对于mastercoin),额外的内容(代表接受的投票)附加在了交易块里。
(bts::blockchain::transaction) http://bitshares.org/documentation/structbts_1_1blockchain_1_1transaction.html
(bts::blockchain::transaction::vote) http://bitshares.org/documentation/structbts_1_1blockchain_1_1transaction.html#a3cd65e9deb9efbb5fc899aa7b62226f3
代表注册
1. 代表要注册一个特殊标志符,作为股东们的投票对象。
(1) 标识符是int32格式,要简单易于引用。
http://bitshares.org/documentation/structfc_1_1signed__int.html#details
(2) 标识符的状态可以显示出被支持和被反对的情况。
(3) 注册用这个程序代码:bts::blockchain::claim_name_output
http://bitshares.org/documentation/structbts_1_1blockchain_1_1claim__name__output.html
<1>当,bts::blockchain::claim_name_output::delegate_id等于0时,表示没有获得投票。大于0,虽然有投票但投票额不在有效排行内,则代表为辞职状态。
<2> bts::blockchain::claim_name_output::name名字要是各民族人群都能识别的。
<3> bts::blockchain::claim_name_output::data这里面放附加信息,如一个网站域名。
2. 注册费是一个块税收额的100倍。
(1) 确保代表严肃重视这项工作。
(2) 某代表获取1000个block的投票的时间间隔是两周还是两个月,取决于网络。
3. 代表们每年要更新一次注册。
(1) 排名前100的代表,0付费。
(2) 其他代表重新支付一次注册费。
4. 注册时名程不能重复,要有信息沟通渠道,如一个网页。
投票算法
每个钱包都有以下信息:
1. trusted_delegates—本客户端保存的代表IDs数组,他们是可信的,他们在本客户端上没有污点记录。
2. distrusted_delegates—本客户端保存的代表IDs数组,他们是不可信的,本客户端掌握了他们的污点记录,即使是蛛丝马迹。
3. observed_delegates—这个数组保存本钱包观测到的代表IDs和统计数据。
Blockchain追踪这个:
1. ranked_delegates—这个数组保存所有当前block接收的网络投票。
一旦形成个交易,你的钱包就有按下面的规则精确的选择一个代表接收投票:
1. 如果你钱包里有一个distrusted_delegates,并且他在本轮投票中拍前200名,那就优先投这个反对票。
2. 如果没有反对票要投,就投一个排名落后的trusted_delegates。
3. 如果你的钱包没有怎么用过,没有trusted_delegates,那就从observed_delegates中找一个积分高,但本轮中别人使用少的代表。
一旦形成一个交易,你的钱包就要根据代表选择参与交易的币 (你的某个币也是经由投票得来的,传给你某币时经手的代表给你的币涂上了“颜色”),程序如下:
1. 如果是要投反对票,那就优先使用distrusted_delegates经手的币。(不信任了就断交吧,留着闹心)
2. 优先使用币龄大的。避免静止风险。
3. 如果币龄超过11个月了,那就自动参与交易进行更新。(可能类似找零机制)
代表评分
一个客户端,根据自己观察到的某代表工作性能为依据对其进行评分,统计工作性能的方法:
1. 所有block--这个代表产生的所有block。
2. 所有丢失的block—这个代表理应产生但未产生的block,以chain记录为准。
3. 平均向后延迟—从接收到产生block的要求到实际产生出来的延迟时间。延迟的因素很多,可能外因居多。
4. 平均向前延迟—产生block时抢跑,可能是客户端时钟问题,也可能是向后延迟的太厉害。一个代表出现这种行为,也可以怀疑是为了同其他代表竞争而作弊。跑的慢不好,但也要避免抢跑,大家的指标要尽量稳定。
5. 计划产量和实际产量的比值—这里的产量,即,block中包含的交易数量。漏掉的交易越少越好。比值为1最好。
6. Unkonwn交易在block中的比例。代表可能会添加奇怪交易,希望避免发生这种现象。
7. 无效block数目。代表们都是很严肃的,不要发生这种添乱的行为。
8. 上限收费行为所占的比例。收费上限:最近100个block平均手续费的10%。收费便宜的代表更有群众基础。
评分系统不是完美的,数据不是绝对的,只是鼓励代表们多多竞争,并且以排名进行分类。
Block确认
产生了一个新block时,钱包要产生下列行为:
查找observed_delegates,并进行记录:
a. 时钟周期。
b. Block中包含的合理的交易数据比例。
c. Block中包含的不合理的交易数据比例。
将证实了的block推送到blockchain。最后的一条交易通常是给代表的服务费。
Block制造者
任何一个有代表ID的钱包,如果这个ID在前100名里,就可以去制造block。制造的这个block一经推到blockchain里,就有一个钱包去确认Block,即,坚持这个ID的代表是否合格。合格,则运行下面的程序:
CURRENT_TIME = UTC_SEC / BLOCK_INTERVAL
ROUND_TIME = (CURRENT_TIME / 100) * 100
PRODUCE_TIME = (ROUND_TIME + RANK) * BLOCK_INTERVAL
If PRODUCE_TIME < CURRENT_TIME then PRODUCE_TIME += 100 * BLOCK_INTERVAL
备注:一个钱包,可以有多个代表ID。
原文出处: http://bitshares.org/documentation/group__dpos.html
中文wiki: http://p2p3p.com/index.php?title=Dpos%E6%8E%88%E6%9D%83%E8%82%A1%E6%9D%83%E8%AF%81%E6%98%8E
爱比特btc-address:12iZUK5VCFKHxJTgkKo7NHtxNGbZSTDabb
pts-address:PuhKqyVgzsptuCQjsV7ZPf96qQWoA2X9st