区块链学习笔记(四)

我的博客地址:https://blog.csdn.net/qq_41907991

            本节主要学习股份授权证明(DPoS)。每篇文章都会涉及我之前的笔记,大家可以抽空看下~

       股份授权证明(DPoS)

            PoS机制使用一个确定性算法以随机选择一个股东来产生下一个区块,该算法中,账户余额决定了节点被选中的可能性。然而,该系统并未使区块链变得越来越安全而不可逆,因为最终区块链的区块产生权掌握在账户余额最多的少数节点手中。同时PoS面临的挑战是如何通过即使而高效的方法达成共识。(此节内容可参考我的上一篇区块链的文章)。

           为了达到这个目标,每个持币节点可以将其投票权授予一名代表。获票数最多的前101名代表按既定时间表轮流产生区块。每名代表被分配到一个时间段产生区块。所有的代表将收到等同于一个平均水平的区块所含交易费的1%作为报酬。如果一个平均水平的区块含有100股作为交易费,一名代表将获得1股作为报酬,即可大大提高共识效率。这就是DPos的核心思想。

       其所被授权的投票权无关,这前100人所获得的权力权重是相同的,每名代表都有一份相等的投票权。因此,无法通过获得超过1%的选票而将权力集中到一个单一代表手上个人或者组织控制区块链的多名代表是有可能的。但是这个过程将需要欺骗很大比例的股东数去支持“傀儡”。
        即使可以建立这51%傀儡,他们扰乱网络的能力仍将是有限的、能够被快速识别快速纠正的。没有工作量证明机制设置的进入障碍,占据多数的诚实用户会把攻击鉴别出来,然后将代码分叉并无视攻击者生产的区块。这种攻击可以扰乱网络,但不会是致命的。

        背景介绍

           通过引入“受托人”这个角色,DPOS可以降低中心化所带来的负面影响。一共有101位受托人通过网络

上的每个人经由每次交易投票产生,他们的工作是签署(生产)区块。通过去中心化的投票过程,DPOS能让网

络比别的系统更加民主。与其要让我们完成在网络上信任所有人这个不可能完成的任务,不如让DPOS通过技术 

保护措施来确保那些代表网络来签署区块的人们(受托人)能够正确地工作。除此之外,在每个区块被签署之

前,必须先验证前一个区块已经被受信任节点所签署。像DPOS这样的设计,实际上缩减了必须要等待相当数量

的未授信节点进行验证后才能够确认交易的时间成本。

           缩减对于确认的需求将会让交易速度直线上升。签署区块的任务将会托付给由网络选出的可信之人。这样

的设计中,我们不用再设置人为的障碍来减缓区块签署的过程。相较于传统的POW和POS系统,DPOS能够在单

一区块内容纳更多笔交易。这会将加密货币技术带到一个新的层次,使其能够与中心化的结算系统相媲美,例如

目前被使用最广泛的电子支付体系的巨鳄 – Visa和万事达卡。

        在DPOS系统中,中心化现象仍然存在,但它是受约束的。区别于其他保障加密货币安全的算法,DPOS体

系里每个客户端都能够决定谁能够被信任,而不用必须信任拥有最多资源的人。这使得DPOS网络能够获取中心

化的一些主要优点,同时又以适当的程度维持了去中心化的本质。系统会通过公平选举的方式进行强化,并让每

个人都有机会成为代表大多数用户的受托人

     中心化问题的说明

     100名代表是去中心化的吗?

        因为去中心化已经成为一个流行术语,所以其定义很难完全固定。我们将自由市场看作去中心

的基本形式,并将对进入自由市场设置障碍看作是所有中心化的基础。像任何事物一样,中心化有

度之分,所以我们把授权股权证明机制与其它方案的中心化程度进行对比。对比如下:

       1.比特币(pow机制)

      比特币系统目前正以授权工作量证明(Delegated Proof of Work, DPOW)为基础而运行,因此有大约10名代表控制了绝大多数的哈希算力(补充:使用比特币,用户必须选择一个矿池,每个池通常具有10%或更多的哈希算力。 这些矿池的运营者就像矿工委任的代表。 比特币希望用户在矿池间切换以避免算力过度中心化,但总体而言五个主要池控制网络,并且如果其中一个矿池出了问题,就需要用户进行手动干预。 如果一个矿池出现故障,那么直到它恢复之前,区块的生产率都会等比例地下降。由哪个矿池挖矿成为了一个政治问题。)。在那些为其竞争而能使用规模经济进行无收益挖矿的人手中,哈希算力本身就是中心化的。最后,工作量证明机制为进入市场设置障碍,使得“在职”的区块制造者无法轻易被取代。与比特币系统相比,DPOS在区块生产方面至少去中心化了10倍,并且也许在市场竞争方面去中心化了无数倍尽管在哈希算力方面有一定量的去中心化,当想到掌控比特币系统的股东(比特币持有者)所持股份的占比,我们认为比特币系统是最中心化的。如果你考虑使用比特币体系的用户总数,其中参与挖矿的人很可能少于百分之一。

       2.点点币  (pow pos混合机制)

       点点币是一个混合系统,所以它由于工作量证明机制而是部分中心化的。和比特币系统一样,它也有矿池。

与比特币相比,点点币无疑是更去中心化的,然而,因为股权证明机制矿池需要用户保持他们的电脑在线且钱包

解锁,只有一小部分的股东参与了任何形式的挖矿。

      基本策略

• 给持股人一把可以开启他们所持股份对应的表决权的钥匙,而不是给他们一把能挖矿的铲子。
• 最大化持股人的盈利。
• 最小化维护网络安全的费用。
• 最大化网络的效能。
• 最小化运行网络的成本 (带宽、CPU等)。
 
   

     运作步骤

1成为一名代表

        成为一名代表,你必须在网络上注册你的公钥,然后分配到一个32位的特有标识符。然后该标识符会被每笔交易数据的“头部”引用

2. 投票批准
       每个钱包有一个参数设置窗口,在该窗口里用户可以选择一个或更多的代表,并将其分级。一经设定,用户所做的每笔交易将把选票从“输入代表”转移至“输出代表”。一般情况下,用户不会创建特别以投票为目的的交易,因为那将耗费他们一笔交易费。但在紧急情况下,某些用户可能觉得通过支付费用这一更积极的方式来改变他们的投票是值得的。 

3. 保持代表诚实
        每个钱包将显示一个状态指示器,让用户知道他们的代表表现如何。如果他们错过了太多的区,那么系统将会推荐用户去换一个新的代表。如果任何代表被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一个新代表。

4. 解决区块链分叉
        和工作量证明系统及其他股权证明系统一样,最佳区块链是最长的有效区块链。任何时候,一名代表错过签发一个区块的机会,该区块链将比潜在竞争对手短。只要在你的交易被写入区块后的100个区块中的51%被生产出来了,那么你就可以安全地认为你在主区块链上。
        也许,在防止区块链分叉所导致的损失方面,最重要的事是在事发后第一时间得知消息。因为代表们通过生产区块得到很好的报酬,他们将保持接近100%的在线时间来防止因被投票罢免而损失收入。你可以安全地认为如果在过去的10个区块中,有一两个区块错过生产,则互联网的某些部分可能正发生连接问题,那么用户应该对此特别警觉并要求额外的确认数。如果10区块中有超过5个错过生产,那么这意味着你很可能在一条支链上,因此应该停止所有交易,直到分叉得到解决。
以一种及时的方式(少于5分钟)简单地发现并警示用户网络分叉,是可以最小化潜在损失的非常重要的能力。而知道你是否正处在一条支链上则更为重要。

        

      其他问题

1.不随机从所有用户中选取受托人的原因
有相当高的机率他们不在线。
• 作恶者将能够通过获取更多股份来控制网络,而且不用通过节点审查。
• 在没有任何挖矿行为的情况下,要以去中心化的方式生成随机数是不可能的,因此攻击者可能可以控制随机数 的生成。

2.受托人的角色和作用

• 受托人,是生产并广播区块的被授权方。目前在比特股XT测试网络中有101位受托人。

• 生产区块,这些区块当中包括由P2P网络上收集的交易信息,并以受托人的私钥签署。

• 在每一轮中,所有的101位受托人都拥有“生产且只生产”一个区块的权力。

• 假设你作为一名受托人的选票足够排在前101名当中,那么你在本轮出块中的位置是由前一个区块的广播后随机

指定的。

3.如何成为一名受托人

• 你需要使用以下指令,在区块链中注册一个名称并标记'delegate'-flag:wallet_account_register {} true

• 如果你已经有了一个账号,便可以用以下指令将你的账号升级为受托人:

wallet_account_update_registration {} true

注册为受托人并不是免费的,它(目前)需要大约10 XTS 的费用,并将会从__所指定的账号支付。这笔费用大约

相当于担任受托人两周的收益。这表示如果一位受托人想要保本的话,他应该要维持受托人的职位达两周以上

4.投票算法

我要如何获得“选票”?

• 你需要说服其他人执行以下指令来给你投赞成票:wallet_set_delegate_trust_level 1

• 当另一位用户将赞成票投给你的受托人(可能同时也投给他人),“并且”将带有该选票的(部份)股份进行交易或转账。

• 一位用户可以将赞成票投给不止一位受托人。那么,所有获得赞成票的受托人将会依据交易中包含的股份数量,在交易完成之后获得相应数量的选票。

为何选择只使用投赞成票的方式?

• 只使用投赞成票的方式,并允许每单位股份拥有多张投票权,这样的方式称之为“投票批准”,其相对于以往的“授权投票”多了许多优点。

• 目前每单位股份,可以在任意一轮中最多投给1/3数量的有效受托人 (目前101/3=33)。

优点
• 没有反对票可以简化易用性,同时也减少了代码量以及复杂度。

• 钱包中可以设定一个投票组合 (从101位或更少的受托人挑出的一组人),并在每一笔交易当中都投给该组合。设定好的投票组合可以在用户之间分享,也可以让钱包识别并进行随机选取。

• 区块链可以在隐私(每次都生成一个独特的投票组合)和效率 (重复使用现存的投票组合)这两种极端情况之间取得平衡。

• 当用户并未给任何受托人投赞成票时,他其实“投”给的是“空的”投票组合。

• 不需要总是和做恶的受托人玩“打地鼠游戏”。

缺点
• 假设受托人的候选人数量少于3万名时,要从中选出101位受托人,将会使每笔转账的代码中增加202字节数,这将会使正常的交易数据翻倍。不过幸好区块链会被精简,并只保留365天(一年)之内的交易纪录。

• 作恶的受托人被移除的速度快慢可能会导致增加交易成本。

• 比较难在受托人中呈现少数人的意见。

选票如何计算?
• 如果在一笔交易当中发送了N个XTS,并投给了指定的投票组合,那么这些受托人将会获得N票!

有反对票吗?
• 不再有了。在发现了[emski攻击法](https://bitsharestalk.org/index.php?topic=5164.msg67657#msg67657) 之后,开发者决定抛弃这种设计,并采用“赞成票”方式。

5.随机数的生成

在DPOS中我们有101个节点,并拥有超过99.9%在线时间。这意味着:即使其中只有一个节点在运行,我们就可以可靠地生成一

组安全的随机数。

 struct Block{

hash secret;     // HASH( S[n] ) where n is the index in the array of secrets generated by this delegatehash revealed_secret;   // S[n-1]

};

对于每一个区块,在标头(header)区域加入HASH(S[n])。S[n]则是下一轮受托人产生区块时需要展示的秘钥。同时也在标头中写入S[n-1]。

现在我们能够在每次区块产出时(每15-30秒)拥有一连串的秘钥。从这一连串的秘钥中,我们可以通过以下方式,在该区块生成随机数R:

if( first_block_produced_by_delegate ) then Block[HEAD].revealed_secret = 0
ASSERT( HASH( Block[HEAD].revealed_secret) == GetLastBlockProducedByDelegate(Block[HEAD].delegate_id).secret )
R = HASH( Block[HEAD].revealed_secret )
for( uint32_t i = 1; i < 101; ++i )
{
R = HASH( Block[HEAD-i].revealed_secret + R) // where + is concat
}
R = 本区块生成的随机数。

每个R是经由101位受托人在上述过程中导入的秘钥所计算得出的。而即使101位受托人当中只有一位在工作,所生成的R也会是真正的随机数。

对作恶行为的描述及惩罚措施

每轮中只有101位受托人中的最后一位有机会做出这样的抉择 (不生产区块,进而不展示秘钥),所以其作恶的机会是很渺茫的。

如果选择不生产区块,他们将可能被开除,并且失去了在未来所将获得的盈利(还会没收缴纳的保证金)。

即使作为一名作恶的受托人,他所能做的只不过是不生产一个区块而已。

• 举例来说,如果某期乐透开奖只发给赢家总投注金额的50% (另外50%作为慈善用途),那么作恶的受托人最多只能够做到不赚不赔。还是拿乐透DAC举例,如果一个作恶者能够控制开奖前最后的N位受托人,那么他的胜算将会上升2^N倍。为了解决所有这些问题,我们决定,在一个指定的出块轮中生成随机数的规则必须遵守“全有全无定律”。也就是说,必须要101位受托人全体报到,否则就不会生成随机数。

参考文章:http://www.bts.hk/dpos-wiki.html



猜你喜欢

转载自blog.csdn.net/qq_41907991/article/details/80305033