比特币是第一个区块链成功应用,区块链是去中心化账本,每个区块相当于账本的每页,每页都记录着交易信息。
从去中心化账本的角度来看,每个加入到比特币网络节点都要保存一份完整的账本。如果每个节点不能同时记账,处于不同网络,接收不同节点信息,难以保证获得最新账本信息。如果每个节点同时记账的话,必然会导致账本的不一致,造成账本混乱。
比特币区块链通过竞争记账方式解决去中心化的账本一致性问题。竞争记账是过程,而不证明竞争结果。采用工作量证明(Proof of Work,PoW)的机制来实现竞争结果判定。
PoW是确认做了多少工作量的证明。使用例子说明PoW整个证明流程。例子如下:
使用“blockchain”,在字符串后面加上nonce的整数值串。工作量要求是:在“blockchain”+nonce进行SHA256哈希运算,如果得到哈希结果(以十六进制表示)是以若干个0开头,则验证通过。
需要经过2688次计算才能找到3位均为0的哈希值,而要找到前6位均为0的哈希值,则需要进行620969计算。见下图:
图1哈希结果要满足前n位均为0要求,需要多次进行哈希值的计算。一般来说,n值越大,需要完成的哈希计算量也越大。要寻找4个前导0的哈希值,预期大概要进行2^16尝试。
比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络的PoW的题目。
解出比特比网络PoW题目关键3个要素是:工作证明函数、区块和难度值。
1.工作证明函数
工作量证明函数是计算方法。在比特币系统使用SHA256作为工作量证明函数。
2.区块
区块决定输入数据,因为使用区块头作为工作量证明输入数据。区块头共有80个字节,请看下图。
图2在构造区块过程中,需要将该区块要含有的交易信息列表,通过Merkle树诉算法生成哈希值,把它作为区块头Merkle根的值。
Merkle树是完全二叉树,通过哈希值的计算,将这棵二叉树转化为Merkle树。
图3
在上图可以看出有四个交易:Txa~Txd,分别计算各自哈希值进行运算,得出Merkle树根。
现在区块头能有确定值的字段分别是:版本、父区块哈希值、Merkle根、时间戳。Nonce是用于工作量证明计数器,需要不断运算。难度目标在3.难度值讲解。
3.难度值
难度值决定大约需要经过多少次哈希运算产生一个合法区块。
在全网算力不断变化,需要维持平均10分钟出一个区块,难度值必须根据全网算力的变化进行调整。
难度调整是每个完整节点中独立自动发生。每2016个区块,所有节点都会按统一公式自动调整难度,调整公式:
新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
工作量计算有一个目标值:
目标值=最大目标值/难度值。
最大目标值是恒定:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比,比特币工作量证明要求矿工计算出来哈希值必须小于目标值。把目标值作为区块头难度目标值。
�根据上述讲述,梳理工作量证明步骤如下:
1. 构建区块,把将要写入区块交易信息组成交易列表,通过Merkle树算法把交易列表信息生成Merkle根哈希。
2. 把Merkle根哈希、难度值等相关字段组装成区块头,把区块头80字节数据作为工作量证明的数据输入。
3.不停地变更区块头的随机数,即nonce的数值,变更后不断采用SHA256运算。与目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
在工作量证明完成后,产生新的区块。当新区块在网络中传播时,每个节点广播到其他节点。
参考书籍如下:
《精通比特币》
《区块链技术指南》邹均
网友评论