以太坊共识机制
1.以太坊为什么需要共识机制?
分布式系统中,多个主机通过异步通信方式组成网络集群。在这样的一个异步系统中,需要主机之间进行状态复制,以保证每个主机达成一致的状态共识。在运行过程中,可能出现主机故障,导致无法通信,也有可能主机性能下降,网络拥塞,这些都可能导致错误信息在系统内传播。因此需要在不可靠的异步网络中定义容错协议,以确保各主机达成安全可靠的状态共识。
以太坊,一个基于去中心化的分布式账本,也需要解决在不可靠的网络中如何保障账本数据一致性和正确性的问题,这就是共识机制。
2. 以太坊的共识机制主要有哪些?
以太坊有四个版本,前沿、家园、大都会和宁静。从以太坊的规划来看,前三个版本使用共识机制POW,到宁静时,再转为POS。
(1)PoW(工作量证明)
比特币采用的共识机制也是PoW,矿工通过把网络尚未记录的现有交易打包到一个区块,然后不断遍历尝试来寻找一个随机数,使得新区块和随机数的哈希值满足一定的难度条件,例如前面10位是零。
找到满足条件的随机数,就相当于确定了区块链最新的一个区块,也相当于获得了区块链的本轮记账权。
矿工把满足挖矿难度条件的区块在网络中广播出去,全网其他节点在验证该区块满足挖矿难度条件,同时区块里的交易数据符合协议规范后,将各自把该区块链接到自己本地的区块链上,从而在全网形成对当前网络状态的共识。
工作量证明算法的意义在于,要找到这样一个随机数,没有比列举可能性更好的策略,而解决方案的验证又非常简单。由于输出有均匀分布(是散表功能应用的结果),我们可以保证,平均而言,需要找到这样一个随机数的时间取决于难度阈值。这使得只通过操纵难度来控制找到新区块的时间成为可能。
这种共识算法挖矿造成大量的资源浪费;挖矿的激励机制也造成矿池算力的高度集中,背离了当初去中心化设计的初衷。更大的问题是PoW机制的共识达成的周期较长,每秒最多只能做7笔交易,不适合商业应用。
(2)PoS权益证明
以太坊目前处于第二阶段,也就是家园阶段,100%采用PoW挖矿。从家园到宁静,从PoW到PoS,这个过程中,以太坊通过难度炸弹的调节来避免以太坊被分成两条链,引导大家平稳过渡到PoS。关于难度炸弹的详细解释,下节课会介绍。
PoS要求节点提供一定数量的代币证明来竞争区块链记账权。但是如果单纯依靠代币余额来决定记账者必然使得富有者胜出,导致记账权的中心化,降低共识的公正性,因此不同的PoS机制在权益证明的基础上,采用不同方式来增加记账权的随机性来避免中心化。
例如根据你持有货币的量和时间来竞争记账权,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(可理解为年利率5%)。比如你有365个币,如果年利率是1%,那每天你得到的利息就是0.001个币。
以太坊计划采用基于保证金的经济激励共识协议,我们称它为Casper。协议中的节点,作为“锁定保证金的验证人(bonded validators)”,必须先缴纳保证金才可以参与出块和共识。Casper共识协议通过对这些保证金的直接控制来约束验证人的行为。具体来说就是,如果一个验证人作出了任何Casper认为“无效”的事情,他的保证金将被罚没,出块和参与共识的权利也会被取消。保证金的引入解决了'nothing at stake',也就是经典POS协议中做坏事代价很低的问题。现在有了代价,而且被客观证明做错事的验证人将会付出这个代价。
以太坊PoS的共识机制还在商讨中,所以到宁静阶段,PoS的具体细节可能才能完全敲定。
3.以太坊的挖矿原理
以太坊当前的共识机制是 PoW(Proof of Work 工作量证明机制),使用的算法是Ethash,它是Dagger-Hashimoto算法的改良版本。挖矿的流程大概如下:
(1)对于每一个块,首先计算一个种子,该种子只和当前块的信息有关,然后根据种子生成一个32M的随机数据集(Cache)。
(2)根据随机数据集Cache生成一个1GB大小的数据集合DAG(有向非循环图),它是一个完整的搜索空间,挖矿的过程就是从DAG中随机选择元素(类似于比特币挖矿中查找合适Nonce)再进行哈希运算,可以从Cache快速计算DAG指定位置的元素,进而哈希验证。
在这要求对Cache和DAG进行周期性更新,每1000个块更新一次,并且规定DAG的大小随着时间推移线性增长,从1G开始,每年大约增长7G左右。
资料来源:
众享区块链