acess
2020-06-09 13:28:58 +08:00
这种问题很不招人待见……很容易受到“先去读白皮书”这种嘲讽……
答案很简单,没有什么方程组,也没有什么特解。
每个区块不都可以算出自己的哈希值么?挖矿有个“难度要求”,必须不断地暴力试错,试到这个哈希值小于规定值,这样才算你挖到了(这就是所谓的“难题”)。这个时候,你就有权拿到新发行的比特币(也叫 block subsidy )和手续费两部分奖励。这个奖励是通过 coinbase 交易记录的,矿工(矿池)先打包好别人的交易,然后据此写好 coinbase 交易,再去暴力试错(也就是挖矿),挖到了就全网广播出去,别的矿工看到了,验证通过,就会跟着你挖出来的区块继续延续下去。
这里的难度要求也是动态调整的,比特币用的办法就是每 2016 个区块重新调整一次难度,根据之前的出块速度来评判,如果出块速度太快,表示难度偏低,就相应地调高难度,反之亦然。(这里理论上也存在一个问题,就是 time warp attack,因为出块时间只能靠矿工自己写进去,所以理论上矿工可以在时间戳上撒谎——但是这种攻击仍然需要超过 50%的算力)
注意这个动态调整是一种游戏规则,是每一个节点自发地去遵守的,而不是靠某个权威服务器去强制执行的——其实不仅是难度调整,比特币的所有规则都是这样,包括 2100 万总量上限、给出有效数字签名才能转走币等等,都是这样的,如果有人不遵守规则,那网络中的每一个诚实的节点都会排斥他,把他踢出网络。
因为每个区块都包含上一个区块的哈希值,所以每挖到一个新区块,就自然而然地相当于重新出了一道新的难题,之前暴力试错得到的答案不能套用到新的难题身上。
比特币用的双 SHA256 哈希,哈希值有 256bit 呢,2^256 这个数字相当之大,(只要 SHA256 仍然安全)不用担心会碰巧出现跟以前一样的难题,可以认为这是不可能的。
另外,即使是在计算同一道题的过程中,也是不存在“进度”这个概念的,无论你暴力试错挖了多久,都不表示你距离成功挖到矿更近一步。这和扔骰子是一个道理,(考虑骰子均匀的情况下)即使因为你走了狗屎运,一连扔出 6 次都没有一个 6,也不代表你第 7 次就有更高的概率能扔出 6 。