上一篇文章对比特币白皮书的时间戳进行了只字不差地研读,点此回顾时间戳。
通过对时间戳的研读,我们知道了时间戳是一种类似于报纸发行的存在证明机制,将每一个区块的哈希值进行全网广播并且以此形成一条由大多数节点接受的区块形成的链就是打时间戳了。
这一章一起来研读工作量证明(PoW)。
To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proof-of-work system similar to Adam Back’s Hashcash, rather than newspaper or Usenet posts.
为了在点对点网络的基础上实行分布式的时间戳服务,我们需要一个像Adam的哈希现金那样的工作量证明系统,而不是想报纸发行那样的系统。
工作量是为了实现时间戳服务而引入的,中本聪的灵感来源于Adam之前发明的哈希现金,这个在参考文献里面也提到了。不过哈希现金最后并没有成功,中本聪取百家之长,其中工作量证明就来源于哈希现金。
The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits.
工作量证明的方法是去不停的用哈希算法(比如SHA-256)去运算,直到使得运算出的哈希值前面若干位都是0。
如下图所示,在第531857个区块高度,要求区块哈希值前面18位都是0。
SHA-256是由256位二进制的数字(0和1)构成,在哈希值中转换由64位16进制的数表示,比如:6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b。
4位二进制的数字(0和1)一共有2的4次方也就是16种可能,分别对应一个16进制的数(a-f&0-9)。同理还有安全性更高的SHA-512算法,由512位二进制数字构成,哈希值为128位16进制的数表示,例如:d41a211567fb060fb87623e5a599508705a6c9ae7c72ff165ec1082ce2ad4a891ae428c2ceb7fca22dae803a6d2785d4c972937d0013407636f91b32e68006de。
The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.
这个工作量随着哈希值前面0的位数的增加而呈指数型的增加,但是检验这个哈希值只需要进行一次哈希运算就可以了。
现在的要求是哈希值前面18位是0,最开始创世区块的要求是8个0。
For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block’s hash the required zero bits.
为了完成时间戳,我们在每个区块中添加一个随机数,这个随机数必须使得这个区块的哈希值满足前面N为是0的要求。
区块中的其他信息是确定的, 而这个随机数是随机的。我们需要对每一个区块(包含这个随机数)做哈希运算,使得哈希值前面N位都是0, 意味着需要不停地去试这个随机数(nonce),直到刚好算出来的哈希值满足前面N位是0为止。
Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work.
一旦某个CPU算出来了符合工作量证明的随机数(nonce),那么这个区块就不能被篡改了,除非重新再做一次工作量证明(也就是再重新算一次随机数,符合哈希值前面N位是0的条件)。
As later blocks are chained after it, the work to change the block would include redoing all the blocks after it.
由于后面的区块已经和前面的区块形成一条链,所以要更改前面的区块必须把它后面所有的区块都要一起改掉。
如下图所示,每一个区块作哈希运算的时候,有前一个区块的哈希值、随机数和区块内的交易信息。当改动某个区块的一点点信息,都需要对这个区块后面的所有区块进行改动,运算量非常大。
The proof-of-work also solves the problem of determining representation in majority decision making.
工作量证明还解决了在做一些决策时,如何确定代表的问题。
If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs.
如果根据一个IP地址一票的规定的话,那么可能被一些拥有很多IP地址的人所利用,这样就不公平。
Proof-of-work is essentially one-CPU-one-vote.
工作量证明是按照一个CPU一票来规定的。
中本聪在写这篇论文的时候觉得一个CPU一票,就不会出现一个人拥有很多CPU的情况,每个人一台电脑,能够实现去中心化的算力分布。但是他没有想到后来会出现专门针对比特币的矿机,导致普通电脑几乎不可能完成比特币的工作量证明。
The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested fastest and outpace any competing chains.
大多数节点的决定就通过最长的链来表达,因为最长的链意味着最强的算力,能够超过其他竞争者的链条。
If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains.
如果大多数的CPU都是诚实的节点控制的,那么这条城市节点形成的区块链也是生成最快的,并且能够超过其他竞争者(邪恶者)的链条。
因为我们指接受最长的链条,所以只要大多数的节点是好的,那么最长的链条也就是好的。想篡改数据的节点由于算力不够,无法超越诚实节点的链条成为最长的链条,所以还是安全的。
To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes.
攻击者想要篡改之前的一个区块,必须对这个区块以及它之后的所有区块重新做一次工作量证明,然后还要追上诚实节点形成的链条并且超越他们,使得自己的链条成为最长的链条,被全网接受。
而这个工作量在算力不超过全网一半的情况下是不可能实现的。
We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.
我们在后面的章节将会展示一个攻击者追上诚实节点链条的概率是如何随着城市链条后面区块的不断增加而呈指数级减少的过程。
To compensate for increasing hardware speed and varying interest in running nodes over time, the proof-of-work difficulty is determined by a moving average targeting an average number of blocks per hour. If they’re generated too fast, the difficulty increase.
为了抵消硬件算力不断增长和参与工作量证明的节点数量变化的影响,工作量证明的难度是根据一个小时生成若干个区块来决定的。如果生产区块的速度太快,那就增加工作量证明的难度。
中本聪考虑到了摩尔定律使得未来的算力肯定越来越强,也考虑到了矿工的数量可能也在不停变化,这些都会导致全网的算力造成波动。但是完成工作量证明的难度也会调整,保证每个小时生成的区块数量是差不多的。
现在每个小时差不多生成6个区块,而想要调整工作量证明的难度也很简单,只需要调整每个区块的哈希值前面有N位都是0的条件就可以了。N越大,哈希值前面都是0的位数就越多,概率越小,随机数就越难找,难度就越大;反之亦然。
PoW目前也被认为是最安全的共识机制,因为没能力(算力不够)的人无法作恶,而有能力的(算力足够)人却是最维护这个系统的人,最不允许被人来作恶的。世界上并不存在绝对安全,信息安全也是一样。比特币系统是通过对作恶成本的增加使得作恶的收益还不如按照规则行事。
我们俗称的“挖矿”,其实就是矿机在不停的找寻随机数(nonce),使得区块的哈希值前面N位是0。
这是一个完整的区块信息,可以看到现在是要求哈希值前面18位都是0。也可以看下比特币诞生以来挖矿难度的变化。
- 创世区块:区块哈希值前8位是0(创世区块前面虽然有10个0,但要求是8个0。在算到前面8位是0时,碰巧前面10位都是0,可以看1号区块就是8个0)
- 区块高度10万:区块哈希值前11位是0
- 区块高度20万:区块哈希值前13位是0
- 区块高度30万:区块哈希值前16位是0
- 区块高度40万:区块哈希值前17位是0
- 区块高度531857:区块哈希值前18位是0
哈希值前面0的位数一直在增加,挖矿难度(寻找符合条件的随机数)也在指数级上涨。如果你想体验一下这种难度,不放在自己的名字后面加数字(如张三1、张三2…张三199…),看生成的哈希值前面有1个0,2个0,3个0的难度。
体验网址:Hash: online hash value calculator相信你挨个试的话,很快就放弃了,如果你会编程,相信你也能体会到其中难度巨大的差别。
希望通过对PoW的学习,让你知道:
- “挖矿”是什么?——寻找随机数,让区块哈希值的前N位都是0。
- 为什么不能比特币的信息很难被篡改?因为一旦篡改就牵一发而动全身,需要对改动对象以后的所有区块重新做一次PoW,而这个工作量是非常庞大的,没有超过全网一半以上的算力不可能实现。
- 为什么PoW保证了比特币的安全性?想做恶的人没能力(算力),有能力(算力)的人根本不想作恶,是既得利益者,系统安全的守护者。
相关文章:
只字不差地阅读比特币原版白皮书(一)——摘要
只字不差地阅读比特币原版白皮书(二)——介绍篇
只字不差地阅读比特币原版白皮书(三)——交易篇(Transactions)
只字不差地阅读比特币原版白皮书(四)——时间戳(Timestamp Server)
什么是哈希(Hash)?
什么是数字签名(digital signatures)?
石油和比特币能被挖完吗?