分布式协议与算法,你了解多少?( 四 )


PoW算法工作量证明 (Proof Of Work,简称 PoW),就是一份证明,用 来确认你做过一定量的工作 。具体来说就是,客户端需要做一定难度的工作才能得出一个结果,验 证方却很容易通过结果来检查出客户端是不是做了相应的工作 。
具体的工作量证明过程,就像下图中的样子:

分布式协议与算法,你了解多少?

文章插图
 
所以工作量证明通常用于区块链中,区块链通过工作量证明(Proof of Work)增加了坏人作恶的成本,以此防止坏 人作恶 。
工作量证明哈希函数(Hash Function),也叫散列函数 。就是说,你输入一个任意长度的字符串,哈 希函数会计算出一个长度相同的哈希值 。
在了解了什么是哈希函数之后,那么如何通过哈希函数进行哈希运算,从而证明工作量呢?
例如,我们可以给出一个工作量的要求:基于一个基本的字符串,你可以在这个字 符串后面添加一个整数值,然后对变更后(添加整数值) 的字符串进行 SHA256 哈希运 算,如果运算后得到的哈希值(16 进制形式)是以"0000"开头的,就验证通过 。
为了达到 这个工作量证明的目标,我们需要不停地递增整数值,一个一个试,对得到的新字符串进行 SHA256 哈希运算 。
通过这个示例你可以看到,工作量证明是通过执行哈希运算,经过一段时间的计算后,得到 符合条件的哈希值 。也就是说,可以通过这个哈希值,来证明我们的工作量 。
区块链如何实现 PoW 算法的?首先看看什么是区块链:
区块链的区块,是由区块头、区块体 2 部分组成的:
  • 区块头(Block Head):区块头主要由上一个区块的哈希值、区块体的哈希值、4 字节 的随机数(nonce)等组成的 。
  • 区块体(Block Body):区块包含的交易数据,其中的第一笔交易是 Coinbase 交易,这是一笔激励矿工的特殊交易 。
在区块链中,拥有 80 字节固定长度的区块头,就是用于区块链工作量证明的哈希运算中输 入字符串,而且通过双重 SHA256 哈希运算(也就是对 SHA256 哈希运算的结果,再执行 一次哈希运算),计算出的哈希值,只有小于目标值(target),才是有效的,否则哈希值 是无效的,必须重算 。
所以,在区块链中是通过对区块头执行 SHA256 哈希运算,得到小于目标 值的哈希值,来证明自己的工作量的 。
计算出符合条件的哈希值后,矿工就会把这个信息广播给集群中所有其他节点,其他节点验 证通过后,会将这个区块加入到自己的区块链中,最终形成一串区块链,就像下图的样子:
分布式协议与算法,你了解多少?

文章插图
 
所以,就是攻击者掌握了较多的算力,能挖掘一条比原链更长的攻击链,并将攻击链 向全网广播,这时呢,按照约定,节点将接受更长的链,也就是攻击链,丢弃原链 。就像下 图的样子:
分布式协议与算法,你了解多少?

文章插图
 
ZAB协议Zab协议 的全称是 Zookeeper Atomic Broadcast (Zookeeper原子广播) 。Zookeeper 是通过 Zab 协议来保证分布式事务的最终一致性 。ZAB 协议的最核心设计目标就是如何实现操作的顺序性 。
由于ZAB不基于状态机,而是基于主备模式的 原子广播协议(Atomic Broadcast),最终实现了操作的顺序性 。
主要有以下几点原因导致了ZAB实现了操作的顺序性:
首先,ZAB 实现了主备模式,也就是所有的数据都以主节点为准:
分布式协议与算法,你了解多少?

文章插图
 
其次,ZAB 实现了 FIFO 队列,保证消息处理的顺序性 。
最后,ZAB 还实现了当主节点崩溃后,只有日志最完备的节点才能当选主节点,因为日志 最完备的节点包含了所有已经提交的日志,所以这样就能保证提交的日志不会再改变 。
作者丨luozhiyun
来源:https://www.luozhiyun.com/archives/304




推荐阅读