logo头像
Snippet 博客主题

区块链常见共识算法总结

这两年,区块链的技术可以说是非常的火爆,不了解点什么都不好说自己是在互联网混的,有人将区块链称之为互联网2.0,可以说区块链将对现有的互联网技术进行改造升级。那么,就让我们一起来了解下什么是区块链吧。

简单来讲,所谓区块链技术,也被称之为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。在区块链技术中有三个概念需要注意:

  • 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
  • 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;
  • 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。

区块链核心算法

拜占庭将军问题

拜占庭的故事大概是这么说的:拜占庭帝国拥有巨大的财富,周围10个邻邦垂诞已久,但拜占庭高墙耸立,固若金汤,没有一个单独的邻邦能够成功入侵。任何单个邻邦入侵的都会失败,同时也有可能自身被其他9个邻邦入侵。拜占庭帝国防御能力如此之强,至少要有十个邻邦中的一半以上同时进攻,才有可能攻破。然而,如果其中的一个或者几个邻邦本身答应好一起进攻,但实际过程出现背叛,那么入侵者可能都会被歼灭。于是每一方都小心行事,不敢轻易相信邻国。这就是拜占庭将军问题。

拜占庭系统

将上面的问题衍生到计算机网络,指在一个拥有n台节点的系统,整个系统,对每个请求满足如下条件:

  • 所有非拜占庭节点使用相同的输入信息,产生同样的结果;
  • 如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。

与此同时,在拜占庭系统的实际运行过程中一般假设系统中拜占庭节点不超过m台,并且对每个请求满足2个指标:

  • 安全性——任何已经完成的请求都不会被更改,它可以在以后请求看到;
  • 活性——可以接受并且执行非拜占庭客户端的请求,不会被任何因素影响而导致非拜占庭客户端的请求不能执行。

拜占庭系统的核心协议

1,一致性协议

一致性协议的目标是使来自客户端的请求在每个服务器上都按照一个确定的顺序执行。在协议中,一般有一个服务器被称作主节点,负责将客户端的请求排序;其余的服务器称作从节点,按照主节点提供的顺序执行请求。所有的服务器都在相同的配置信息下工作,这个配置信息称作view,每更换一次主节点,view就会随之变化。

一致性协议至少包含3个阶段:发送请求、序号分配和返回结果。根据协议设计的不同,可能包含相互交互、序号确认等阶段。

一致性协议解决一致性的方法主要有:

  • 服务器之间两两交互,服务器通过将自己获得的信息传递给其他的服务器;
  • 由客户端收集服务器的信息,将收集的信息制作成证明文件再发送给服务器。对于一个包含3m+1台服务器的拜占庭系统,需要收集到2m+1台服务器发送的一致信息,才能保证达成一致的非拜占庭服务器数量大于拜占庭服务器数量。

2,检查点协议

拜占庭系统每执行一个请求,服务器需要记录日志。如果日志得不到及时的清理,就会导致系统资源被大量的日志所占用,影响系统性能及可用性。另一方面,由于拜占庭服务器的存在,一致性协议并不能保证每一台服务器都执行了相同的请求,所以,不同服务器状态可能不一致。例如,某些服务器可能由于网络延时导致从某个序号开始,之后的请求都没有执行。因此,拜占庭系统中设置周期性的检查点协议,将系统中的服务器同步到某一个相同的状态。因此,周期性的检查点协议可以定期地处理日志,节约资源,同时及时纠正服务器状态。

处理日志主要解决的问题就是区分那些日志可以清理,那些日志仍然需要保留。如果一个请求已经被m+1台非拜占庭服务器执行,并且某一服务器i能够向其他的服务器证明这一点,那么i就可以将关于这个请求的日志删除。目前,协议普遍采用的方式是服务器每执行一定数量的请求,就将自己的状态发送给所有服务器并且执行一个该协议,如果某台服务器接收到2m+1台服务器的状态,那么其中一致的部分就是至少有m+1非拜占庭服务器经历过的状态,因此,这部分的日志就可以删除,同时将自己状态更新只较新状态。

3,视图更换

在一致性协议里,已经知道主节点在整个系统中拥有序号分配,请求转发等核心能力,支配着这个系统的运行行为。然而一旦主节点自身发生错误,就可能导致从节点接收到具有相同序号的不同请求,或者同一个请求被分配多个序号等问题,这将直接导致请求不能被正确执行。视图更换协议的作用就是在主节点不能继续履行职责时,将其用一个从节点替换掉,并且保证已经被非拜占庭服务器执行的请求不会被篡改。

视图更换协议一般有两种触发方式:
1)只由服务器触发,这一类触发方式中,判断服务器一致性是否达成的工作是由服务器自身负责,客户端不能从请求的整个执行过程中获得服务器运行状况的信息;
2)客户端触发,这一类触发方式中,客户端一般负责判断服务器是否达成一致,如果不达成一致,那么就能判断服务器运行出现问题,如果是主节点的问题就会要求服务器更换主节点。

视图更换协议需要解决的问题是如何保证已经被非拜占庭服务器执行的请求不被更改。由于系统达成一致性之后至少有m+1台非拜占庭服务器执行了请求,所以目前采用的方法是:由新的主节点收集至少2m+1台服务器的状态信息,这些状态信息中一定包含所有执行过的请求;然后,新主节点将这些状态信息发送给所有的服务器,服务器按照相同的原则将在上一个主节点完成的请求同步一遍.同步之后,所有的节点都处于相同的状态,这时就可以开始执行新的请求。

由此,在一个分布式的系统中,尽管有坏人,坏人可以做任意事情(不受protocol限制),比如不响应、发送错误信息、对不同节点发送不同决定、不同错误节点联合起来干坏事等等。但是,只要大多数人是好人,就完全有可能去中心化地实现共识。

PoW

PoW是英文Proof of Work的缩写,PoW 对节点提交的区块 B 的格式有如下的要求:
H(B)≤target

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

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

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

在比特币中每过 2016 个块 (两周) 便会调整一下 target 的值, 通过下面的公式进行调整:
这里写图片描述
其中 t2016表示生成前面 2016 个块所花费的时间. 当花费的时间越短, 最终的 target 值也就越小. 生成块的难度值也可以通过下面的公式得出:
这里写图片描述

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

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

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

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

POS的优点是提高了处理效率; 基于 PoS 的 Ethereum 每秒大概能处理 30 笔交易左右。缺点是没有 PoW 安全, 容易遭受各种攻击。

DPoS

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

附:https://draveness.me/consensus

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

上一篇