第八章 挖矿与共识
8.1 比特币是通货紧缩的货币
比特币的发行量是固定的,到2140年左右,2100万的比特币会被全生产出来。
有格问题需要说明一下:区块链的区块扩容会不会导致比特币数量增加?
答案是:不会。
区块的扩容,从1M变成2M或者更多,只是会让一个区块能够记录更多的交易信息,仅此而已,不会影响2100万的比特币总量。至于,到底为什么比特币的总量不会改变,了解完挖矿的只是知识就豁然开朗了。每开采210000个区块大约耗费4年,货币发行的速度会降低50%
第一个四年,大概是2008年开始,每个区块产生50个比特币。
第二年四年,从2012年11月开始,每个区块产生25个比特币。
第三个四年,从2016年7月开始,每个区块产生12.5个比特币。
第四个四年,从2020年某个时刻开始,每个区块产生6.25个比特币。
。。。。。。
直到2140年2100万的比特币会全部产生。
从上面的规则来看,你最需要区分的是区块的产生和比特币的产生是完全不同的两回事。
区块的产生是矿工用矿机挖出来(或打包)的,而比特币是每个区块产生出来的,而且区块产生的比特币会越来越少。简单的说:区块链的区块数量无限的,但比特币总量是有限的。
比特币总量固定,使得比特币是通货紧缩的货币,不会像人民币一样具有通货膨胀的风险。
8.2 挖矿的目的和动力
挖矿是增加比特币供应的一个过程。同时,挖矿也是在保护比特币系统安全性最重要的一个步骤。整个区块链网络里面的矿工之所以积极的去挖矿,主要是矿工可以获得奖励。
奖励分为两个部分:区块里面相应的比特币奖励、这个区块上所有交易记录的交易费用。
你可能已经注意到了,在2100万个比特币被完全挖出来之后,矿工就不挖了吗?
不是的,2100万个比特币挖完,矿工的所有收入将会基本来自于交易费用。只要有交易增加,区块就会不断增加的,就不断有交易费用。将来的一个区块会越来越大,里面的交易会越来越多。
8.3 去中心化共识
去中心化共识,是整个区块链网络信任的基础。
去中心化的共识是由所有网络节点的相互作用产生的。主要是4种:
1.每个全节点依据综合标准对每个交易进行独立验证(章节8.3)
2.挖矿节点完成工作量证明的验算,将交易独立打包进新区快。(章节8.5/8.6/8.7/8.8)
3.每个节点独立对新节点进行校验并组装进区块链(章节8.9)
4.每个节点对区块链进行选择,择选工作量最大的区块(章节8.11)
8.3.1 交易的独立验证
在网络发现的章节,详细解释了新节点加入区块链网络的过程。这个交易的独立验证,其实就是发生在新节点寻找新的邻居节点的过程之中的。这里的新节点一般是钱包节点,因为这些节点需要传递的是:交易信息。
新节点把交易信息传递给邻居节点的时候,邻居节点会主动验证这些交易信息是否有效交易,在确认无误之后,才会继续进行传递给自己的邻居节点。这些校验的项目,是一个常常的列表,每个节点会逐个去验证每个需要验证的条目。
每个节点都是一个质量检查员。他们对于交易信息的质量会严格把关。在拿到大量的交易信息的时候,他们会拿着一个长长的检验清单,一条一条的检验。这个过程就是交易的独立验证。
8.3.2 挖矿节点完成验算,打包交易记录
在整个区块链网络里面,挖矿节点都是在同时做3件事情:1、监听网络上的交易。2、监听其他节点发现的区块。3、挖掘新的区块。
在获得区块之后,挖矿节点需要做的就是把交易记录打包进这个候选区块。之所以说是候选区块,是因为此时网络里的矿工依然是竞争状态,整个网络还没有确定到底是哪个矿工挖出的区块可以加入到区块链中。
在上一步的交易验证之后,比特币节点会把监听到的交易记录暂时存放到自己的内存池(也叫做交易池)。也可以想象成一个临时的储物间,这里面存储的是已经经过验证但是还没打包进区块的交易记录。(这些记录目前还没有得到交易确认,这是后面要谈的工作量证明)。
挖矿节点,一旦接收并验证进了一个区块A,那么,这个节点就回去自己的临时储物间,检查储物间里面的所有交易记录。从临时储物间里面把已经出现在区块A里面的交易记录移除。剩下的记录会被打包进下次出现的新的区块B。
也可以这么说明:A区块把10分钟以内的交易记录打包进自己的区块,10分钟以外的交易记录会留给下一个区块B。因为枚10分钟只能有一个区块产生。
#打包过程
可以简单的把矿工想象成给快递打包的工人,而矿工打包的东西不是快递,而是交易记录。做任何事情都有一个轻重缓急,矿工打包交易记录也是一样。在区块链里面,交易记录都有自己的优先级,矿工会优先打包那些优先级别最高的交易记录,也就是手续费高的记录。
#构造区块头
每个区块都有一个区块头,里面有三类元数据:父区块的哈希值、挖矿竞争相关数据、merkle树根(所有交易信息的数据结构)
父区块的哈希值和已merkle树根,上章节以说过,这里说下挖矿竞争相关的数据:难度目标和Nonce。
这连个字段本质上都是一个数字。
难度目标:指的是当前区块的工作量证明算法的难度目标。可以这么理解,目标就是一个具体的数字,有点类似于:王健林的小目标,赚一个亿。仅仅是一个数字而已,不要被那些绕来绕去的名词吓到。难度目标是可以动态调整的,动态调整的木的是为了:保证区块产生的速度是一直保持在每10分钟一个区块。
Nonce,主要是一个用于工作量证明算法的计算机。
#成功构建新区块
区块头里面三类元数据,都是在构建新区块之前就预先确定好的。下面是6个字段
有了上面的6个字段之后,矿工需要做的就是对这个候选区块,进行挖掘,也就是对工作量证明算法求解。求出解之后,这个区块才能真正加入到区块链里面。
矿工挖矿的本质,其实就是在对一个复杂的方程,进行大量的的计算,最后得出这个方程正确解的过程。这个过程是一个随机试验的过程。
区块头里面的难度目标是动态变化的,是整个区块链动态调整的。
#难度目标和难度调整
难度目标界定了难度,进而影响求解工作量证明算法所需要的时间。难度目标值是可以调整的。比特币的区块平均欸10分钟生成一个。这个速度,不仅仅说的是短期,而是在未来的几十年内都是保持这个相同的速度的。
为了保证这个平均速度,我们的难度目标必须是动态调整的。
根据摩尔定律,计算机的计算性能在未来一定会飞速提升,而且,参与挖矿的矿工人数也会是不断标化的,那么不同的时期全网的算力就是变动的。
为了保持区块的生成速度不变,挖矿的难度必须依据变化做出调整。这个难度目标的调整时周期性的,大概规则时这样的:1、挖出一个区块需要花费整个网络10分钟。2、没发现2016个区块,整个区块链会根据2016个区块完成的时间,来动态调整后面2016个区块的难度目标。
8.3.3 校验新区块
这一步,就是交易记录的验证。时区块形成必不可少的步骤。当一个节点接收到一个新的区块, 它将对照一个常常的标准清单对该区块进行验证,若没有通过验证,这个区块将被拒绝。
8.3.4 区块链选择
在验证新区快的各项指标之后,区块还需要去寻找最大工作量证明的链条。
区块链的选择里面涉及到一个重要概念:区块链分叉。
关于区块链分叉,书中举出的地图还是比较形象的。区块链分叉发生在两名矿工在较短的时间内,各自都算的了工作量证明解的时候。例如,矿工A和矿工B同时挖出了一个区块,这连个一样的区块,里面打包的交易记录都是一样,父区块也是一样的,唯一的区别只是挖出区块的矿工不同而已。
此时,整个区块链就出现了分叉,有了两条一样的链条,这就是所谓的区块链分叉。
这个时候,分叉问题无法解决,我们暂时把这两个一样的区块分别称作红色区块,和绿色区块。
那么,我们可以认为区块链全网的算力分成立两个阵营,一个红色阵营,一个绿色阵营。但是即便全网的算力在这两个阵营中平均分配,也总有一个阵营抢在俩一个阵营前发现工作量证明解,提前发现一个新的区块(黄色区块n+2)。
我们假设绿色阵营比红色阵营提前挖出了黄色区块。这样一来,绿色阵营的链条就比红色阵营的链条更长了,这也就意味着,绿色阵营的链条上,是目前全网上工作量证明最大的链条。
此时,即使红色阵营里的矿工挖出了新的区块(黄色n+3),他也不会把新区快放到红色区块后面。因为,所有的矿工总是:选择并尝试延长代表累计了最大工作量证明的区块链,也就是最长的或最大累计难度的链。
这样一来,区块链分叉问题解决了,也就是说主区块链已经确定就是绿色区块链了。
8.4 共识攻击
比特币的共识攻击依赖于这样一个前提:绝大多数矿工,处于自己的利益最大化考虑,都会通过诚实的挖矿来维持整个比特币系统。
理论上,一个区块链分叉可以变得很长,但实际上,要想实现一个非常长的区块链分叉。需要的算力非常大,随着整个比特币区块链的不断增加,过去的区块基本可以认为是无法被分叉篡改的。
一群矿工控制了整个比特币网络51%的算力,如果他们联合起来,是可以攻击整个比特币系统的。
但是随着比特币网络的算计呈几何极快速增长,上述这些理论上可以攻击的场景,实际操作起来已经越来越困难。理论上来说,比特币是目前最安全的共识机制系统。
以上内容来自-金马带你定投区块链