6

区块链常见共识算法

 2 years ago
source link: https://hiberabyss.github.io/2018/03/01/blockchain-consensus/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

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

PoW (Proof of Work)

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

H(B)≤targetH(B)≤target

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

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

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

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

targetnew=t20162weeks∗targettargetnew=t20162weeks∗target

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

difficulty=target1currenttargetdifficulty=target1currenttarget

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

  • 安全, 完全的去中心化, 主流的数字币都采用了这种方案; 如 BTC,LTC
  • 效率低, 平均每秒只能处理 5 到 7 个交易;
  • 会耗费大量电力;

PoS (Proof of Stake)

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

H(B,t)≤balance∗targetH(B,t)≤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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK