<audio id="audio" title="第13讲 | 深入区块链技术（五）：PoS共识机制" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/73/ff/730c1308679c52b92ce24440b9a574ff.mp3"></audio>

上一篇我们讲到了PoW共识机制，这一篇我们就来分享另外一种共识机制，PoS共识机制。

PoS全称是Proof of Stake，中文翻译为权益证明。这一篇我们会将PoS与PoW对比讲解，帮助你加深理解。

## PoS的由来

PoS最早出现在点点币的创始人Sunny King的白皮书中，它的目的就是为了解决使用PoW挖矿出现大量资源浪费的问题。PoS共识机制一经提出就引起了广泛关注，Sunny King 也基于PoW的基础框架实现了第一代PoS区块链：点点币。

PoW的具体实现有很多版本，但它们大多只是在挖矿算法上有所改进，主体逻辑并没有发生质的变化。PoS包含了多个变种实现，每个变种往往会涉及区块链代币经济模型的改动，可以说是牵一发而动全身。

这些实现有点点币、黑币、未来币、瑞迪币，它们都推动了PoS机制的发展，PoS研究前沿还有以太坊的 Casper ，以及 Cardano 的Ouroboros。

那到底是什么样的机制导致PoS具有这样的特性呢？让我们来看一看。

## 什么是PoS？

在讲PoS之前，我先来讲一个叫做币龄的概念，币龄这个概念其实很好理解，它的英文是 CoinAge，字面意思就是币数量乘以天数。

比如你有100个币，在某个地址上9天没有动，那么产生的币龄就是900，如果你把这个地址上这100币转移到任意地址，包括你自己的地址，那么900个币龄就在转移过程中被花费了，你的币数量虽然还是100个，但是币龄变更为0。币龄在数据链上就可以取到，任何人都可以验证。

我们回过头来看看PoS究竟是什么，区块链共识机制的第一步就是随机筛选一个记账者，PoW是通过计算能力来获得记账权，计算能力越强，获得记账权的概率越大。

PoS则将此处的计算能力更换为财产证明，就是节点所拥有的币龄越多，获得的记账的概率就越大。这有点像公司的股权结构，股权占比大的合伙人话语权越重。

以上算是简述了PoS的概念，实际上，PoS的发展经历了三个版本，第一个版本是以点点币为代表的PoS1.0版本，这个版本中使用的是币龄；第二个版本的代表是黑币（blackcoin），对应使用的是币数量，相当于是财产证明，后面黑币又升级到PoS3.0，这个版本又回到了币龄。

PoW早在比特币出现之前就已经应用了，而PoS是才是真正意义上为了区块链而创造出来的概念。

## PoS的实现原理

好了，现在我们开始讲解PoS的具体实现原理吧。这一部分公式较多，如果你在收听音频，可以点击文稿查看。

通过上一篇我们知道PoW挖矿的基本逻辑和步骤，我们先寻求一个nonce小于目标值，这一步用公式可表示为：

**Hash (block_header) &lt; Target**

从公式中我们可以看到，PoW下所有矿工的目标值是一样的，只要计算结果哈希小于目标值即可，简化来看就是前导0的个数。

而在PoS系统中，这个公式变更为：

**Hash (block_header) &lt; Target * CoinAge**

我们可以看出多引入了一个变量叫做CoinAge，也就是币龄，这里就有意思了。

这个变量为会造成每个矿工看到的目标值不一样，如果你的币龄越大，也就意味着你的获得答案越容易。这里的Target与PoW一致，与全网难度成反比，用来控制出块速度的。

例如当前全网的目标是4369，A矿工的输入的币龄是15，那么A矿工的目标值为65535，换算成十六进制就是0xFFFF，完整的哈希长度假设是8个字节，也就是0x0000FFFF。

而B矿工比较有钱，他输入的币龄是240，那么B矿工的目标值就是0x000FFFFF。你如果仔细观察肯定会发现，相比A矿工的目标值，B直接少了一个零。即如下：

- A 矿工    Hash( block_header ) &lt; 0x0000FFFF
- B 矿工    Hash( block_header ) &lt; 0x000FFFFF

所以B矿工获得记账权的概率肯定要比A高。

具体代码分析这里就不讲解了，这里需要币龄作为输入，如果我们写示例代码也只是一个简单的参数，PoS需要放到区块链的语境中才能运作。

## PoS的相关问题

通过上述的介绍我们知道：PoS似乎完美地解决了PoW挖矿资源浪费的问题，甚至还顺带解决了51%攻击的问题，这里可以顺便讲一下51%攻击是什么，它是指PoW矿工如果积累了超过51%的算力，则可以一定程度篡改账本。

这里顺便科普一下，什么是51%攻击呢，我们发现，矿工挖矿的成本不再是物理设备和电费，而是虚拟代币，它的边际成本几乎为零，本质上PoS让挖矿者和使用者合二为一了。

这也意味着如果挖矿者发起51%攻击，就需要拥有全网51%的币或币龄，这几乎不可能办到，即使你成功地实施了51%攻击，那么也意味着作为全网最大的持币大户的你，损失也会最大。

PoS看起来相当完美，其实并不然，PoS有很多缺陷。

PoS遇到的第一个问题就是币发行的问题。一开始的时候，只有创始区块上有币，意味着只有这一个节点可以挖矿，所以让币分散出去才能让整个网络壮大，那么如何分散出去又是另外一个难题了。

所以早期PoS币种基本都采用了分阶段挖矿，有的叫混合挖矿，其实，我并不同意混合挖矿这个说法，混合就意味着同时。很多币种其实是分了阶段的，即第一阶段是PoW挖矿，到第二阶段才是PoS挖矿。

随着ERC20类型的标准合约代币的出现，这个问题被解决了，不再需要第一阶段改成PoW，也可以将代币分散出去。

第二个问题是由于币龄是与时间挂钩的，这也意味着用户可以无限囤积一定的币，等过了很久再一次性挖矿发起攻击；所以解决方案是：PoS机制需要引入一个时间上限来控制时间因素的自然增长。

第三个问题是虽然引入了时间上下限，用户还是倾向于囤积代币，这会造成币流通的不充分；基于此，所以瑞迪币引入了币龄按时间衰减，构造了权益速度证明，鼓励用户流动代币，而不是倾向于囤积代币。

第四个问题是离线攻击，即使引入了时间上下限，时间仍然是自然流动的，也就是可以不需要求挖矿节点长时间在线。挖矿是可以离线的，这简直是灾难，所以任意一个PoS机制的实践形式都必须避免这个问题，因为网络节点数量的多少直接关系到区块链网络的健壮性。

当然这些问题都不是致命问题，还记得我们一开始提到了PoS经历了三个版本，而第二个版本PoS 2.0使用的不是币龄，而直接是币的数量。

这会造成完全不同的结果，上述第二、三、四问题都不存在了，似乎看起来直接使用币的数量会更好一些，但却出现了整个PoS机制的致命问题。

这个问题叫做Nothing at Stake，翻译过来叫做无成本利益问题。大体的意思在PoS系统中做任何事几乎没有成本，比如在PoS系统上挖矿几乎没有成本，这也就意味着分叉非常方便。

方便到什么程度呢，每个诚实矿工在产生孤块的时候都可以继续挖下去，反正也没什么成本，反正分叉链和主链都可以同时挖，也就是任何持币较少的用户都可以尝试分叉，并且把分叉链广播出去。

这个时候如果其他诚实矿工看到了，第一反应也是没有成本，那么咱们也来挖吧，说不定什么时候就值钱了，意思就是说任何逐利的矿工并不会使这个系统变得更强壮稳定，而是更加的混乱。

无成本利益问题无论以币龄还是币数量作为PoS的参数，都无法避免。

而PoW则没有这样的问题，我们回到PoW系统中来看，因为任何的分叉都会造成挖矿成本直接变成负收益，所以这会抵抗分叉的产生，矿工倾向于跟随“最长”的链。

由于以太坊部分采用了PoS共识，它的名字叫做Casper，它必须解决上述无成本利益问题攻击。所以Casper协议要求PoS矿工需通过抵押保证金的方法对共识结果进行下注，具体实践结果我们还需要拭目以待。

## 总结

最后我们来总结一下PoS共识机制，PoS的区块链系统无需外部物理输入，所以它相比PoW更为环保不费电，并且矿工就是使用者，这会在一定程度上抵御了51%攻击，所以基于PoS机制的数字货币属于理想状态的数字货币。

PoS的缺点是缺乏工业级的区块链应用，从逻辑上来看有点循环自证明的味道，就是用自己的币来维护系统的安全，而币的安全性是由系统保证的，所以现阶段PoS共识机制往往不是独立运行的，而是混合了PoW一起运行，这就可以弥补PoS的缺陷。

PoS共识机制目前也出现了矿池，也可能会出现中心化挖矿的风险。

虽然PoS共识机制未来变数依然很多，但它的可塑性比PoW好，技术上的探索空间大，目前PoS币种相比较PoW币种风险也较高。

那么有哪些区块链项目使用了PoS共识机制呢？你可以给我留言，我们一起讨论，感谢你的收听，我们下期再见。
