Author Topic: 授权股权证明详解(关于假设及算法)  (Read 6657 times)

0 Members and 1 Guest are viewing this topic.

Offline ebit

  • Committee member
  • Hero Member
  • *
  • Posts: 1905
    • View Profile
  • BitShares: ebit
下午被maidsafe吸引过去了。好东西太多了。
telegram:ebit521
https://weibo.com/ebiter

Offline Amazon

  • Hero Member
  • *****
  • Posts: 830
    • View Profile
    • Bitshares Forum
赞科普


(1)   排名100的代表,0付费。


是排名前100,不是第100
« Last Edit: April 17, 2014, 03:30:06 pm by Amazon »
Forum Donation: PforumPLfVQXTi4QpQqKwoChXHkoHcxGuA

Offline yidaidaxia

  • Full Member
  • ***
  • Posts: 179
    • View Profile
感谢楼主。也看了下原文后半段,后半段也很关键。楼主打算翻译吗?

感觉整个算法设计还是很巧妙的。对DPOS多了很多信心。 :D
PTS: PmUT7H6e7Hvp9WtKtxphK8AMeRndnow2S8   /   BTC: 1KsJzs8zYppVHBp7CbyvQAYrEAWXEcNvmp   /   BTSX: yidaidaxia (暂用)
新浪微博: yidaidaxia_郝晓曦 QQ:36191175试手补天

Offline Musewhale

  • Hero Member
  • *****
  • Posts: 2881
  • 丑,实在是太丑了 !
    • View Profile
MUSE witness:mygoodfriend     vote for me

Offline ebit

  • Committee member
  • Hero Member
  • *
  • Posts: 1905
    • View Profile
  • BitShares: ebit
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
« Last Edit: April 18, 2014, 04:42:48 am by ebit »
telegram:ebit521
https://weibo.com/ebiter