本文主要介绍现有区块链技术里常见的共识算法: PoW, PoS, DPoS 等.

区块链本质上讲是一个去中心化的分布式账本, 会同时存在多个节点往这个账本里写数据. 由于整个系统所有节点都是平等的, 不存在中心节点, 就会存在下面的问题:

  • 当多个节点同时往区块链中添加数据时, 应该选择那部分数据写入到最终的区块链中

PoW 等共识算法就是解决这个问题的方案.

PoW (Proof of Work)

PoW 对节点提交的区块 B 的格式有如下的要求:

$$ H(B) \le target $$

其中 H 是某种 hash 算法, target 是一个固定的数. 也就是说整个区块的 hash 值要小于某个给定的数 target. 只有当区块满足这个条件时才是一个合法的区块, 这个区块才能够被别的节点接受. 而当某个节点找到了这样的合法的区块, 也就是挖到了矿, 会获得一定的数字货币奖励. 这也就解决了无中心多节点的结果决策问题: 整个网络采用最早找到合法区块的节点的数据.

哈希函数产生的 hash 值是随机的, 而且对原始数据一个很小的改动就能使得 hash 值和之前完全不一样. 为了能得到一个合法的区块, 我们可以往区块里添加一个冗余的整数 nonce, 通过不断地尝试不同的 nonce 来找到合法的区块 (例如可以从 1 开始不断地累加尝试).

target 的值每隔一段时间就会自动调整, 以保证产生区块的时间是基本固定的, 如比特币会保证每十分钟产生一个新的区块. 当 target 的值越小时, 产生区块的难度就越大. 假定 hash 值的最大值是 $ HASH_{max} $ , 则每一次尝试能找到合法区块的概率为 $ \frac{target}{HASH_{max}} $ . 从这个公式可以看出 target 越小, 每次尝试能找到合法区块的概率也越小.

在比特币中每过 2016 个块 (两周) 便会调整一下 target 的值, 通过下面的公式进行调整:

$$ target_{new} = \frac{t_{2016}}{2weeks} * target $$

其中 $t_2016$ 表示生成前面 2016 个块所花费的时间. 当花费的时间越短, 最终的 target 值也就越小. 生成块的难度值也可以通过下面的公式得出:

$$ difficulty = \frac{target_1}{current_{target}} $$

其中 $target_1$ 表示的是区块链中第一个块 (创世块) 的 target 值, 也是最大的 target 值. 它的值是 0x00000000ffff0000000000000000000000000000000000000000000000000000

优点

  • 安全, 完全的去中心化, 主流的数字币都采用了这种方案; 如 BTC,LTC

缺点

  • 效率低, 平均每秒只能处理 5 到 7 个交易;
  • 会耗费大量电力;

PoS (Proof of Stake)

在 PoW 中找到一个合法的区块需要进行大量的计算, 会花费大量的电力和时间. 为了加快生成区块的速度, PoS 中还会综合考虑节点所持有的数字币的份额. PoS 存在很多不同的实现方法, 其中一种混合模式会利用账户余额来调整挖矿难度:

$$ H(B, t) \le balance * target $$

其中 balance 表示账户余额, t 是一个时间戳, 一般对 t 会有一个时间范围的限制, 例如一个小时, 也就是一个节点最多只能尝试 7200 次.

还有另外一种 PoS 算法, 摘抄自这篇文章 :

POS:也称股权证明,类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。 简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,在股权证明POS模式下,有一个名词叫币龄,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个POS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币,这下就很有意思了,持币有利息。

优点

  • 提高了处理效率; 基于 PoS 的 Ethereum 每秒大概能处理 30 笔交易左右.

缺点

  • 没有 PoW 安全, 容易遭受各种攻击; 这篇博客 有详细介绍

DPoS (Delegated Proof of Stake)

DPoS 会通过不同的策略在不同的时间通过投票产生一小群节点, 由这些节点来负责新区块的创建、验证和相互监督. DPoS 和 PoS 的主要区别在于前者会选出若干代理人, 由代理人来完成记账.

优点

  • 提高了处理效率; 如基于 DPoS 的 EOS 能达到每秒几十万的交易数量
  • 能够对网络进行一定的干预, 减少分叉的出现

缺点

  • 牺牲了部分去中心化

References