Hash
单向函数,给定输入取输出很简单,但很难根据输出得到输入,只能枚举
Bitcoin使用SHA256算法,256bit,32个Byte的数组,也就相当于长度为64的十六进制字符串来表示【0-F】
PoW
在hash函数中,相差很小的输入的输出也相差很大
给你一个任务(规则)需要得到一个开头是0的哈希值,那么只能通过不断改变字符串枚举,从而得到满足条件的hash值和字符串,如果算出来了就代表猜对了
如何调整难度呢?
得到前四位全为0的hash值,得到前十位呢?
使用双重hash,等等
总之POW的目的就是,我只需要演算一次就知道你确实付出了巨大的工作量,就可以放心的相信你没有作弊
挖矿
搜索到一个目标值就会获得记账权,距离上一次打包到现在未确认的交易,矿工就可以一次性将未确认的交易打包并广播了,并从 Coinbase 获得奖励。
基本步骤如下
- 生成 Coinbase 交易,并与其他所有准备打包进区块的交易组成交易列表,并生成merkel hash
- 把默克尔哈希及其他相关字段组装成区块头,将区块头(Block Header)作为工作量证明的输入,区块头中包含了前一区块的哈希,区块头一共 80 字节数据
- 不停地变更区块头中的随机数即 nonce 的数值,也就是暴力搜索,并对每次变更后的的区块头做双重 SHA256 运算,即 SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成
如果更深程度去理解的话,PoW 机制是将现实世界的物理资源转化成区块链上虚拟资源的过程,这种转化为区块链提供了可信的前提。
发展
在区块链的发展史上,PoW 经历了大致两个阶段。分为早期分散挖矿阶段和中心化矿池挖矿阶段。我们目前处于第二个阶段,并且将会长期处于这个阶段。
早期分散挖矿是中本聪的愿景,期望是 1CPU=1 票,所以如果 CPU 挖矿,那么将会是非常理想化的情况,而现实的情况是,SHA256 只需要非常简单的重复计算逻辑,它不需要复杂的逻辑控制。
那么 CPU这种重控制逻辑,轻重复计算的计算单元来搞这么低端的暴力计算非常吃力不讨好,大部分人的第一反应肯定是用 GPU 呀,非常正确。
所以这个时期,出现了 GPU 挖矿,它的效率是 CPU 的十几甚至上百倍,那么 1CPU=1 票的逻辑就被打破了,挖矿工具的改变让人们意识到挖矿技术也是极大改进的。除了 GPU 挖矿,我们还有 ASIC 芯片挖矿,这部分内容我们在讨论挖矿算法分类时会详细讲解。
同期我们也慢慢进入到了中心化挖矿阶段。中心化挖矿很好理解,算力如果越分散,也就意味着竞争越激烈,如果某个节点计算出答案了,那么也意味着其他矿工这段时间的工作量几乎都白费了,投入了物理资源结果零收益,可以说是负收益。
思路就是把分散的算力汇聚到一个池子里面,这个池子我们称作矿池,就像四面八方的小溪流最终汇总成一条大江一样。
矿工参与到某个矿池,相当于矿工把算力租给矿池了,与其他矿工联合挖矿,最后看起来矿池这个节点的算力就会很大,获得记账权的概率就越大,如果这个矿池计算出了答案,将获得 Coinbase 的奖励,矿池就会按既定的分配比例打给每一位参与的矿工。
矿池作为一个中心节点,可以被矿工连接,而在比特币全网来看,矿池节点本质上也只是一个全节点,它与其他全节点一起组成了比特币的点对点网络,特殊的地方仅仅在于它可以产生新的区块。
优势和劣势
PoW 共识的内在优势在于可以稳定币价,因为在 PoW 币种下,矿工的纯收益来自 Coinbase 奖励减去设备和运营成本,成本会驱使矿工至少将币价维持在一个稳定水平,所以攻击者很难在短时间内获得大量算力来攻击主链
PoW 共识的外在优势是目前它看起来依然是工业成熟度最高的区块共识算法,所以在用户信任度上、矿工基础上都有很好的受众。
PoW 共识最大的缺点是非常消耗计算资源,耗电耗能源,这一点也一直为人们所诟病。因为每次产生新的区块都会让相当一部分工作量证明白白浪费了,也就是将计算资源浪费了。
从理论上来看,PoW 会一直有 51% 算力攻击的问题,即攻击者只需要购买超过全网 51% 算力设备,即可发起“双花攻击”,甚至“重放攻击”等多种高收益攻击,这个问题目前没有解决方案。
除了 51% 攻击,PoW 共识还有自私挖矿的问题,自私挖矿是一种特殊的攻击类型,不会影响区块链正常运转,但是会形成矿霸,间接造成 51% 攻击,我们就曾经遇到过这样的自私挖矿攻击。
自私挖矿是指矿工先通过较大算力积累优势,挖出多的块的同时不广播,等别人广播一个新区块的时候,自己一下广播2个甚至更多区块,让别人一直处于被分分叉的状态,自己成为矿霸,可以形成100%出块率。