1、PoW到底是什么
谈到Pow,就不能不说比特币。
比特币本质上就是一个去中心化的账本, 即区块链, 每个区块记录交易记录信息。然而, 账本内容的唯一性决定了记账行为是中心化行为,但是中心化有单点故障的问题, 去中心化可以解决这个问题, 但同时带来了记账行为的一致性问题。其实, 区块链解决的主要问题并不是单点问题, 而是第三方信任问题。
每一个加入系统的节点都要保存一份完整的账本, 比特币采用竞争记账的方式解决去中心化记账系统的一致性问题, 也就是共识问题。比特币系统以每个节点的计算能力即“算力”来竞争记账权。比特币系统中, 大约没10分钟进行一轮算力竞赛, 胜利者获得一次记账权, 并想其他节点同步新增账本信息。
解决了记账权的问题, 那么, 怎么判定竞争的结果呢?比特币系统通过一个称为“工作量证明(Proof of Work, PoW)”的机制完成。PoW就是用来确认工作端做过一定量工作的证明。PoW的主要特征就是 工作端需要做一定难度的工作得出一个结果, 即消耗大量的算力, 而验证方确很容易通过结果来检查工作端是否做了相应的工作。比特币的工作量证明俗称“挖矿”。
2、PoW的三个关键要素
比特币网络的任何节点, 如果想生成一个新的区块并写入区块链, 必须解决PoW问题。PoW的三个关键要素是: 工作量证明函数, 区块, 难度值。工作量证明函数是计算方法,区块决定了输入数据, 难度决定了计算量。
工作量证明函数
比特币使用的工作量证明函数是 SHA256. 其输出是256位。
区块
比特币的区块由区块头及该区块所报刊的交易列表组成。 区块头大小80字节。区块包含的交易列表附加在区块后面, 其中第一笔为coinbase交易, 这是一笔为了让矿工获得奖励及手续费的特殊交易。比特币工作来量证明的输入字符串。
拥有80字节的固定长度区块头, 就是用于比特币工作来量证明的输入字符串。
难度值
难度值决定了大约需要经过多少次哈希计算才能产生一个合法的区块。比特币大约没10分钟生成一个, 在不同的全网算力下保持这个速率, 难度值必须根据全网算力的变化进行调整,来保证一个基本稳定的速率。
难度的调整实在每个完整节点中独立自动发生的。没2016个区块, 所有节点都会按照统一的公式自动调整难度, 这个公式是由最新2016个区块的花费时长和期望时长比较得出的。根据时长的比值, 变难或者变易。
新难度值 = 旧难度值 X (过去最新2016个区块花费时长/20160分钟)
工作量证明需要一个目标值, 目标值 = 最大目标值 / 难度值
最大目标值是一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。
3、PoW的过程
生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表, 用过Merkle树生成Merkle根哈希;
把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入;
不停的变更区块头中的随机数, 即nonce数值, 并对每次变更后的区块头做双重SHA256运算(SHA256(SHA256(Block_Header))), 将结果值与当前网络的目标值多对比,小于目标值,工作两证明完成。
4、基于PoW的共识记账
客户端产生新的交易, 想全网广播要求对交易进行记账;
每个记账节点一旦受到请求, 将受到的交易信息纳入一个区块中;
每个节点都通过PoW过程, 尝试在自己的区块中找个一个具有足够难度的工作两证明;
当某个节点找到了一个工作量证明, 就向全网广播;
当切仅当包含在该区块中的所有交易都是有效的并且之前未存在的, 其他节点才认同该区块的有效性;
其他节点表示接受该区块, 而表示接受的方式是在跟随该区块的末尾, 制造新的区块以延长该链条, 而将被接受区块的随机哈希值视为先于新区块的随机哈希值。
5、PoW的问题
PoW的前提是节点和算力均匀分布, 但是随着ASIC等挖矿, 节点数和算力值失衡;
浪费计算资源。