怎么浅显易懂地解释 POW 和 POS 共识机制?

关注者
332
被浏览
172,412

44 个回答

谢邀。

xx证明这类共识机制的核心是,每发一条消息,你需要证明你付出了一定代价(或者你拥有一些东西),然后诚实的人会收到奖励,于是两者相加就相当于不诚实的人受到惩罚。

但是,既然需要付出代价,每个人又都是利己主义者,自然,如果有方法可以作弊,也就是在没有付出代价的情况下证明自己付出了代价,那么自然大家就都会去做。所以,在付出代价之后,你要给出一个证明,证明你确实付出了一些代价。

POW的方法最直观——哈希函数是密码学上计算难度经过反复验证的东西,所以用它来做证明是最有效不过的。每发一条消息(上传一个区块)的时候,你要证明你付出了一定的算力,你的证据就是某串你加在区块里的无意义字符串,而加上这个字符串之后,你的区块的哈希值正好小于某个数。哈希函数的特性告诉我们,你没有任何取巧的方法可以做到这一点——唯一的可能是,你真的一个一个字符串地去试了。所以,我们知道你确实付出了很多的代价才能给出这么一个字符串。

然而,POW不是没有缺陷,除了大量消耗能源之外,POW的另外一个问题是它的价值回路必须要通过外部输入。也就是说,采用POW的数字货币仍旧不是理想状态的数字货币,因为它们的安全性不直接与使用者相关,而是要通过矿工这个媒介(这个请见我的专栏)。

于是POS就被提出来了。POS的设想是非常好的——采用POS的货币的安全性直接与使用者相关,省去了矿工这个媒介。POS简单说就是,每当发表一条消息的时候,不用证明你付出了什么代价,而要证明你拥有一定数量的钱。而拥有钱代表着,如果你作弊损害了这个系统的安全性,你的钱会贬值,这变相地让你付出了代价。这东西更好的一点是,如果采用POS,实际上连挖矿奖励都不需要,因为POS实际上不需要付出任何代价。

需要注意的是,POW基本上原理都类似,而且,说到POW基本上就指的是比特币那种。可是POS是一类共识算法,或者说是一类共识算法的设计思想,而不是一个,最早采用POS的是peercoin,于是几乎所有的科普文章都把Peercoin的POS当做是POS的定义。这是不对的——因为Peercoin的POS是有漏洞的,漏洞简单说就是——越有钱的人,作弊付出的代价就越大,所以51%攻击在POS里面更不可行。然而,对于没钱的人而言,他们没代价可付,所以一些恶意行为对于他们是有益的,这就会导致著名的公地悲剧。这种叫Nothing-at-stake attack(无利益攻击),所有POS算法,必须有对付这种攻击的机制,否则就不能用。

目前,还没有一个区块链真正采用了POS,所以POS仍旧是一个缺乏足够实践检验的机制。但是从理论上来看,Ethereum的casper,ALGORAND和Ouroboros是几个比较成熟的POS算法。

至于POS的一个变种DPOS,实际上是解决Nothing-at-stake attack(无利益攻击)的另一种方式——没钱的滚蛋,只有有钱才能参加共识。所以,DPOS的本质实际上是一个中心化的共识机制。


——————————————————————————————————

既然题主的主要目的是自问自答,并且还回复了我,那么我回应一下。

题主自己的答案里的POS,就是peercoin里的POS,目前几乎所有中文的科普中,都只写这一种POS,这正是我反复强调的几乎整个中文社区的误区。然而,第一,我已经介绍了,这种POS是有重大缺陷的,就是它不防止无利益攻击,我再强调一遍,任何没有防止无利益攻击的POS都不能称之为完整的共识算法,这是个非常严重的问题。

第二,币龄这个概念并不是POS的必要概念之一,加入了币龄之后其实就不是权益证明,而是财产抵押证明了,也就是你证明的是你有一笔一段时间没有动用过的财产,而不是你有某笔财产。这个东西其实是很有争议的,因为它不仅改变了模型(例如这样的模型不鼓励交易而鼓励所有人都攒钱挖矿),而且带来了许多新的攻击例如save-up attack。

最后,再强调一遍——POS是一类共识算法,他们的特点就是字面上的意义——每发布一个消息,要证明自己拥有某些财产。许多共识算法可以归到此类,但POS并不特指某个共识算法,尤其不是peercoin的共识算法。

我主要用一个简单的例子——说说什么是POW、POS机制。


POW:


POW(Proof of Work),工作量证明,引入了对一个特定值的计算工作。


比特币采用的共识算法就是POW,矿工们在挖一个新的区块时,必须对SHA-256密码散列函数进行运算,区块中的随机散列值以一个或多个0开始。随着0数目的上升,找到这个解所需要的工作量将呈指数增长,矿工通过反复尝试找到这个解。


在这其中,如果想要对业已出现的区块信息进行修改,攻击者必须完成该区块外加之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。


用一个通俗的例子来说:


你上学的时候,班级里发生的行为需要被记在班级的一个大家公用的账本(区块链)上。


老师或者同学们用这个公用的账本进行记录,并且有一种专门用来支付这个账本上大家记录的、需要支付的代币,我们暂且把它叫做Good币。这些币可以兑换成钱。你们班级的公共账本不是一个大本子,而是由很多个小本子中间连接一条线组合成的。


每个小本子的启用需要进行一个数学运算,如果一个同学算出了某个小本子附带的数学题,就开启了一个新的小本子连着前面小本子,大家就会开始用新本子记账。


每个小本子开头都留一页,写上与其他小本子关联的信息、小本子的启用时间和开启这个小本子时算的数学题的答案。


因为同学们学习都很忙,如果没有报酬的话,就没有人会花费大量时间去班级的小本子上帮大家记账,因此老师做了一个规定:最先算出新的小本子附带的数学难题、开启小本子的人获得Good币,用币来奖励维持班级账本正常运转的同学。


一个期末,你得了奖,A同学算出了一个新小本子——第N个小本子带着的数学难题的解,然后帮你得奖的信息记在了小本子上,A同学获得了一笔奖励。


B同学一直不喜欢你,他想把记录在小本子上的信息修改成B同学得奖,这样老师就会把奖金发给他。


B同学开始计算第N个小本子上的数学难题,当他重新计算完第N个上面的数学题,其他同学已经计算出和第N个小本子连着线的第N+1个小本子的解了。因为b同学算的慢,其他同学只认最长链,所以b同学算的无效。


其他记账的同学根据最长链原则都跟在了第N+1个小本子的后面,所以B同学除非计算的速度变得很快,跟上另一条并超过,否则没办法将自己修改的错误信息的区块纳入整个账本系统中。


所以POW共识机制的优点之一:B在攻击公共账本的时要耗费大量的时间精力和脑力,但结果却很难成功,所以如果他选择攻击,不仅得不到奖励,还会对自己造成大量的消耗,就会得不偿失——即降低不诚实节点的攻击意图。


但,不得不说的是,攻击存在成功的可能性,如果B同学说服班上超过50%的同学一起承认错误他修改的错误的账本,那么被篡改的账本就会被达成共识。当然,就攻击这个公共账本而言,除非,超过50%的同学用被B同学的一己私欲说服。


以这个例子来看,缺点也很明显,为了维护这个公共账本的运作,班级的同学花费了大量的时间来算这些哈希函数的难题,浪费了大量的时间和精力,表现在比特币上就是:花费了大量的电力,浪费了大量的能源。


POS:拥有的币越多,有记账权的概率就越大?


POS(Proof of Stake),权益证明,试图解决POW机制中大量资源被浪费的情况。这种机制通过计算你持有占总币数的百分比,包括你占有币数的时间来决定记账权。


预告:在该处会引起不适的可能有1、2、3、4段,请大家稍作忍耐……


在POW机制中,由于想要找到符合条件的nonce值往往需要大量的电力和时间成本,为了避免这种浪费,PoS机制采用更快速的算法:


SHA256(SHA256(Bprev),A ,t)≤balance(A)m

这其中,H为某个哈希函数;t为UTC时间戳;Bprev指的是上个区块;balance(A)代表账户A额余额。


唯一可以不断调整得到参数是t,等式右边m是某个固定的实数,因此,当balance(A)越大,找到合理t的概率越大,网络中,普遍对t的范围有所限制,如可以尝试的时间不能超过标准时间戳1小时,也就是一个节点可以尝试7200次,来找到一个符合条件的t。因此在PoS中,一个账户的余额越多,在同等算力下,就越容易发现下一个区块。


这实在是太复杂了,不知道该怎么理解……(哭脸)


我们还是用上一个“你上学的时候,班级里发生的行为需要被记在班级公用的账本(区块链)上,老师或者同学们用这个账本进行记录”例子来说,这个时候规则变了。


假设同学们经过前一阶段都已经持有一定数量的Good币,老师觉得大家为了争夺记账的机会,浪费的时间和精力都太多了,所以就修改了规定:


不采用之前那种特别难的数学题的方法。通俗的来说,根据你持有币的多少和时间长短给你发利息。


币龄(每个币每天产生1币龄)越高的人和持币越多的人越有机会得到启用小本子和帮别人记账的权利,记账又可以得到奖励。


在期末的时候持有更多币的人会有更多的奖励,所以同学们都很勤奋地去争夺记账权。


假设班级Good币的年利率是5%(不同的币的年利率不一样,点点币的年利率是1%;)


现在你们班级的A同学拥有的币最多,在POS机制下,每个币每天产生1币龄,A同学拥有100个Good币,他已经持有这100个币30天,此时A同学的币龄为30✖100=3000。每产生一个区块,币龄就会被清空为0,每被清空365个币龄,就会从区块中获得0.05个币的利息。


A同学拥有3000币龄,他通过计算启用了一个小本子,他得到的利息就是=3000✖️5%➗365=0.41个Good币。


通过持有币的数量和时间长短来决定记账的节点,这样就省略了竞争记账造成的资源浪费。如果在POS机制中想要发起攻击,必须要收集全部币量的50%以上,不仅成本会非常大,并且执行难度非常高。


通过这些机制,使得区块链网络之间达成共识,以此来解决去中心化网络的信任问题。