Pow挖矿流程
POW即工作量的证明,主要特征是客户端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查出客户端是不是做了相应的工作。
Pow挖矿即不断接入新的Block延续Block Chain的过程。
-
当某个节点提供出一个合理的Block Hash值,验证方能简单证明该节点确实经过了大量的尝试计算。一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。Block Hash值的计算是使用“blockchain”,在字符串后面加上nonce的整数值串。nonce是随机数,不停地更换尝试,才能计算得到N个0开头的hash值。在“blockchain”+nonce进行SHA256哈希运算,如果得到哈希结果(以十六进制表示)是以若干个0开头,则验证通过。0 的个数越多,计算难度越大,比如要寻找4个前导0的哈希值,预期就要大概进行2^16尝试。
-
任何一个节点的POW 证明通过,生成一个新的区块并写入区块链,都必须解出比特币网络的PoW的题目。解出比特比网络PoW题目关键3个要素是:工作证明函数、区块和难度值。工作证明函数、区块和难度值。
- 工作量证明函数是计算方法。在比特币系统使用SHA256作为工作量证明函数。
- 难度值决定大约需要经过多少次哈希运算产生一个合法区块。在全网算力不断变化,需要维持平均10分钟出一个区块,难度值必须根据全网算力的变化进行调整。难度调整是每个完整节点中独立自动发生。每2016个区块,所有节点都会按统一公式自动调整难度,调整公式:新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
-
POW 证明通过产生Block Chain首先将数个字段包含nonce随机数和时间戳每秒变化一次合并成一块数据,然后对这块数据进行双SHA256运算。
-
Block Chain是节点计算符合要求的前N个零的hash结果,Block的Nonce 是不停是尝试计算,找到合理的hash,才能打包Block,装入block meta信息,然后产生交易数据,对外广播新的block,其他节点验证通过,链接至Block Chain,主链高度加一,然后切换至新block后面挖矿。由于hashPrevBlock字段的存在,使得大家总是在最新的block后面开挖,
-
从block hash算法推断合理的block并不是唯一的,同一高度存在多个block的可能性。那么,当同一个高度出现多个时,主链即出现分叉(Fork)。遇到分叉时,网络会根据下列原则选举出Best Chain:
- 不同高度的分支,总是接受最高(即最长)的那条分支
- 相同高度的,接受难度最大的
- 高度相同且难度一致的,接受时间最早的
- 若所有均相同,则按照从网络接受的顺序
- 等待Block Chain高度增一,则重新选择Best Chain
-
分支博弈
- 挖矿也会为了不惜任何手段获取利益
- 如果所有节点均独自挖矿不理会其他节点,并将所得收益放入自己口袋,就会出现一个节点挖一个分支的结果。由于机器的配置总是有差别的,那么算力最强的节点挖得的分支必然是最长的,如果一个节点的分支不是最长的,意味其收益存在不被认可的风险(即零收益)。为了降低、逃避此风险,一些节点肯定会联合起来一起挖某个分支,试图成为最长的分支或保持最长分支优势。
- 一旦出现有少量的节点联合,那么其他节点必然会效仿,否则他们收益为零的风险会更大。于是,分支迅速合并汇集,所有节点都会选择算力更强的分支,只有这样才能保持收益风险最小。最终,只会存在一个这样的分支,就是主干分支(Best/Main Chain)。
- 对于不诚实节点来说,结局是无奈的:能且只能加入主干挖矿。不加入即意味被抛弃,零收益;加入就是老实干活,按占比分成。