本章介绍比特币系统的挖矿和去中心化的共识机制,对于以后区块链项目的共识机制设计有很好的借鉴参考意义,我尽量让没有技术基础的朋友也能看明白。
建议阅读时长:20分钟
第1节 概述
挖矿主要有2大作用:挖矿是一种将交易结算去中心化的过程,同时挖矿添加的新区块伴随着货币发行,也是增加货币供应的一个过程。
挖矿采用工作量证明算法,平均每10分钟解答出一个随机的数学难题,获胜者完成对这段时间交易的确认同时获得比特币奖励和手续费。
矿工造假的成本远远大于其遵守规则的成本,从而从其自身利益上保障了缺乏造假的动机(除非某个机构超过全网算力的51%,跑赢其他挖矿节点产生新区块的速度,才能做到更改交易信息)。
所以说,挖矿是比特币去中心化自发共识的根基:为了鼓励矿工完成交易的结算打包,每次新区块打包完成并被认可为主链后,会有比特币奖励;矿工若不按照规则构建新区块,因为工作量算法需要大量的计算,耗费时间和电量,其造假的成本远大于其遵守规则后的成本,所以形成了自发共识。
什么是算力?
算力是指每秒钟计算的次数,在比特币系统中,指挖矿时每秒钟可以尝试多少个随机数去计算区块头哈希值。
第2节 比特币货币创造
比特币总量为2100万个,每次生成新区块时,会发行新的比特币。比特币系统前210000个区块,每个区块奖励给矿工50个比特币,每210000个区块之后,区块奖励减半。
即高度为210000——419999的区块,每个区块奖励25个比特币;高度为420000——629999的区块,每个区块奖励12.5个比特币,依次类推。由于每个区块产生的平均时间大约10分钟,所以产生210000个区块的时间等于210000*10/(60*24*365)大约需要4年时间,即比特币的发币速率,平均每4年降低50%。
在经过693万个区块之后,所有的20999999.9769个比特币将会全部发行完毕,到了2140年左右,矿工挖矿的收入将全部来自于交易中的手续费。
关于比特币的总量为什么是2100万,网上有很多说法,其中“中本聪的天才:比特币以意想不到的方式躲开了一些密码学炸弹”这篇文章中的介绍,我比较认可,感兴趣的朋友可以搜索了解下。
第3节 挖矿以及新区块产生过程
通过完成工作量证明的校验,挖矿节点将交易打包进新区块,这一过程的详细步骤如下:
提示:如果只需要了解大致流程,不关心实现原理的朋友,可直接翻到最后的总结部分了。
第4节 交易的校验
从“第五章 交易”中,我们知道,钱包客户端通过收集UTXO、提供正确的解锁脚本、构造支付给接收者的输出这一系列的方式来创建交易。
新创建的交易随即会广播到相邻的节点,临近的节点会对这笔交易进行校验,当校验通过后,才会继续广播到其他节点,否则该笔交易不会被继续广播。
每一个节点在校验每一笔交易时,都会按照如下清单检查:
交易的语法和数据结构必须正确;
输入和输出列表都不能为空;
交易的字节大小是小于区块大小限制的;
每一个输出值以及总量,都必须在(0——2100万)之间;
没有哈希等于0,N等于-1的输入;
nlocktime—交易锁定时间:即交易有效的最早时间,需小于等于int_Max最大值;
交易的字节大小是大于或等于100个字节的;
交易中的签名数量应小于等于签名操作数量上限;
解锁脚本只能够将数字压入栈中,并且锁定脚本必须要符合标准格式;
池中或位于主分支区块中的一个匹配交易必须是存在的;
对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将会被拒绝;
对于每一个输入,在主分支和交易池中寻找引用的输出交易,如果输入交易缺少任何一个输入,该交易将会成为一个孤立的交易;
对于每一个输入,如果引用的输出交易是一个coinbase交易,该输入必须至少获得100个确认;
对于每一个输入,引用的输出是必须存在的,并且没有被花费;
使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在(0—2100万之间);
输入值的总和不能小于输出值的总和
若交易费太低导致无法进入一个空的区块,交易将会被中止;
每一个输入的解锁脚本都必须依据相应输出的锁定脚本来进行验证。
以上校验全部通过后,节点会将该交易加入到本地的交易池中,同时继续向其他节点广播该笔交易。
第5节 构造候选区块的交易
每个挖矿节点都会监听新区块,一旦监听到新区块后,会停下手中的挖矿,优先校验新区块,当新区块校验通过后,节点会把本地交易池中包含于新区块中的交易记录删除,同时立即构建一个空白区块,作为候选区块,开始竞争下一个区块。
候选区块中的交易包含从交易池中获取的交易和coinbase(创币)交易。
从交易池中获取交易
节点会为交易池中的每一笔交易分配一个优先级,并选择优先级高的交易记录来构建候选区块。
交易的优先级是由交易输入所花费的UTXO的“块龄”所决定的,交易输入值高、“块龄”大的拥有较高优先级。
每笔交易的优先级计算公式为:
Priority=Sum(交易输入值 * 块龄)/交易总长度的字节数
其中交易输入值是指交易中每个UTXO的输出值,用单位“聪”表示;“块龄”是指交易中每个UTXO所在的区块与当前最新区块之间的距离,即区块的深度;交易长度的字节数,指该笔交易所占的总空间大小。因为每笔交易可以有多个输入,Sum求和是对每个输入的交易输入值与块龄乘积之后再加和。
区块中的前50个字节是保留给较高优先级交易的,不管它们是否包含了矿工费,较高优先级的交易会优先填充至这50个字节中;
然后,节点会按照“每千字矿工费”进行排序,优先选择矿工费高的填充剩下的区块空间(当前每个区块空间的大小限制在1M内)。
如果区块中仍有剩余空间,节点可以选择将没有矿工费的交易填充,也可以选择忽略余下的交易,不添加到区块中。
当区块被填满后,交易池中剩余的交易会成为下一个区块的候选交易,这些交易虽然当前没有打包进块,但随着区块的延长,这些交易所引用的UTXO所在块的深度会增加,所以优先级也会随之增加,最后一个零矿工费的交易也有可能满足高优先级的条件被打包到后续的区块中。
比特币交易没有过期、超时的概念。一笔交易存在于本地交易池中,一直未被确认的话,除非本地节点重新启动,将本地交易池中的数据全部清空,否则交易会一直存在于交易池中,等待被新区块打包确认。
创币交易
创币交易是每个区块中的第1笔交易,用来将挖矿奖励和区块中所含交易的手续费之和支付给挖矿节点指定的比特币地址。
节点先根据候选区块所选交易中的所有输入总和减去输出总和的差,得到交易手续费;再计算挖矿奖励,挖矿奖励金额取决于所构建区块的高度,详见本章“第2节 比特币货币创造”中的介绍。
由于创币交易无需引用UTXO,所以其交易输入与普通交易的交易输入字段不一样,创币交易的交易输入字段说明:
交易哈希:不引用任何一笔交易,值全部为0;
交易输出索引:不引用任何一笔交易中的输出,值全部为1
Coinbase数据长度:具体的字节数
Coinbase数据:在V2版本的区块中,除了需要以区块高度开始外,其他字节可以任意填充
通过上述的字段说明,可以发现,创币交易的交易输入没有解锁脚本,而是用Coinbase数据代替,用来标识创币交易,同时coinbase数据中随意填充的字节可以作为额外随机数的来源,在工作量证明计算中可作为随机数Nonce的来源。
第6节 构造区块头
为了构造区块头,挖矿节点需要填充如下6个字段:
版本:记录版本号;
前区块哈希值:当前候选区块连接的前一个区块的区块哈希值;
Merkle根:当挖矿节点将创币交易和从交易池中获取的交易填充完成后,区块头根据本候选区块包含的所有交易,计算交易哈希值后,逐层成对的组合,最后得到Merkle二叉树的根节点——Merkle根,存储在区块头中;
时间戳:记录候选区块的创建时间;
难度目标值:为使区块有效,需满足的工作量证明难度。难度目标值由程序预先定义的公式计算出来的,每2016个区块后(即每两周),难度目标值会自动调整一次,原因是随着全网算力的变化,采用不同随机数计算区块头哈希值的速度也会发生变化,这样会导致每个区块产生的时间发生变化。为了使大约每10分钟产生一个新区块,每两周时,会根据期间的2016个区块的平均产生时间来改变难度目标值,若其平均值大于10分钟,则在随后的2016个区块中均降低难度,否则会增加难度。
随机数Nonce:初始值是0,挖矿的目标是找到一个使区块头哈希值小于难度目标值的随机数。
第7节 挖矿
挖矿的目标是找到一个随机数,使得对整个区块头进行哈希256函数计算后,得到的区块头哈希值小于难度目标值。这也是比特币系统为达成共识所采用的工作量证明算法的核心。
工作量证明算法介绍
从“第6节 构造区块头”可知,区块头中包含了6个字段,对于同一个候选区块,当交易填充完成后,Merkle根值不会变化,且版本、前区块哈希值、时间戳、难度目标值也是固定的,不会发生变化,所以对整个区块头进行哈希函数映射时,为了使区块头哈希值不断变化,只能通过不断改变随机数。
哈希256函数的输入数据长度是任意的,将产生一个长度固定且绝不雷同的256字节的值。对于特定输入,哈希的结果每次都一样,任何实现相同哈希函数的人都可以计算和验证。
加密哈希函数的主要特征是不同的输入几乎不可能出现相同的结果。因此相对于随机的选择输入,若有意的选择输入去得到特定想要的哈希值几乎不可能。所以,随机数只能挨个去试。
例如,若难度目标是0000000000000002343534545,即至少前15位必须是0开头,将区块头固定的前5个字段拼接随机数后,通过哈希256函数计算得到的区块头哈希值为0000001111111111111111111,只有前6位是0,其大于难度目标,需要重新选择新的随机数(一般是当前随机数加1),直至使得区块头哈希值小于难度目标值,挖矿节点可成功构建新区块。
我们可以发现,难度目标值越小,找到随机数的难度就越大。通过调整难度目标值的大小,可以调整新区块的生成时间。
第8节 校验新区块
当一个节点挖矿成功后,会将新区块广播到相邻的节点,每个相邻的节点都会独立的去校验新区块,只有校验通过后,才会继续广播该区块。需要对新区块进行如下校验:
区块的数据结构语法上有效;
区块头的哈希值小于目标难度(确认包含足够的工作量证明);
区块时间戳早于验证时刻未来两个小时;
区块大小在限制范围之内;
第1个交易(且只能有1个)是coinbase交易;
使用检查清单验证区块内的交易并验证它们的有效性(详见本章第4节“交易的校验”);
每一个节点需独立校验新区块,确保了矿工无法欺诈。为什么矿工不为他们自己记录一笔交易去获得成千上万的比特币?
这是因为每个节点都会根据相同的规则对区块进行校验,一个无效的交易将使整个区块无效,这将导致区块被其他节点拒绝,该笔伪造的交易自然不会成为总账的一部分。
所以,矿工必须构建完美的区块,基于所有节点共享的规则,并且根据正确工作量证明的解决方案进行挖矿,这期间要花费大量的电力。如果他们作弊,所有的电力和努力都会白费,这就是为什么独立校验是去中心化共识的重要组成部分。
第9节 区块链的选择与组装
每个节点都会维护3种区块:第1种是连接到主链上的;第2种是从主链上产生分支的备用链;第3种是没有找到父区块的孤立区块。
主链
任何时候,主链都是累积了最多难度的区块链,一般也是包含最多区块的那个链,除非有两个等长的链,其中一个有更多的工作量证明。
备用链
主链也会有一些分支,这些分支中的区块并不是主链的一部分,保留这些区块的目的是在未来的某个时刻某个备用链可能延长了并在难度上超过了主链,那么这条备用链将会选为新的主链,同时后面的区块也会在此基础上继续挖矿构建新区块。
如果在同一个区块的竞争中,同时有多个矿工都得到了正确的解并构建了新区块时,其他节点可能会先后收到这些新区块,于是会在主链的基础上产生分支。
孤立区块
当收到的一个新区块没有找到其父区块时,节点会将它放在孤块池中,直至接收到父区块后,节点会将其从父区块中取出来,并且将其连接起来,作为区块链的一部分。
当两个区块在很短的时间内被挖出来,节点有可能会以完全相反的顺序接收到它们,这个时候就会出现孤立块。
综上所述,挖矿节点在接收到新区块并校验通过后,会根据新区块中记录的前一个区块,将新区块组装到前一个区块所在的链中。
若前一个区块所在的链为主链,挖矿节点会继续在此区块的基础上继续开始挖下一个区块;若前一个区块所在的链为备用链,挖矿节点将新区块组装到备用链后,比较此时的主链和备用链哪个累积的难度最多,从而确定新的主链;若没有找到前一个区块所在的链,节点会将其放在孤立池中直至接收到其父区块。
第10节 共识攻击
比特币共识机制依赖于这样一个前提,那就是绝大多数的矿工,出于自己利益最大化的考虑,都会通过诚实的挖矿来维持整个比特币系统。
然而,当一个矿工拥有了全网大量算力之后,他们就有可能通过攻击共识机制来破坏比特币网络的安全性和可靠性。
当一个挖矿节点的算力占到全网的51%以上时,其发起的攻击尝试几乎很有可能成功。共识攻击主要包含2种:“双重支付”和拒绝为某个特定比特币地址的交易提供服务。
双重支付
双重支付,指同一笔款项支付了2次。比如,攻击者A需要支付给B一定数额的比特币,在这笔交易还未被6个区块确认时,A再次手动在钱包客户端利用这笔款项的UTXO发起支付,支付给了A自己,若攻击者A拥有全网算力的51%,其有极大可能将第2笔交易加入到新区块中,同时延长基于该区块的链,使得B实际并未收到款项。
所以,双重支付只能在攻击者自己的钱包上进行,只有钱包的拥有者才能对同一UTXO进行签名来完成支付。
在实际的大额交易场景中,最好是等到至少6个区块确认后,再认可交易。
拒绝为特定比特币地址提供服务
区块中的交易是由挖矿节点在构建候选区块中填充的,拥有全网算力超过51%的节点,构造交易时,故意不将某个比特币地址的交易打包,同时快速的产生新区块并延长基于此区块的链,那么这个比特币地址的交易就会一直被忽略,无法完成交易。
随着全网算力的不断增大,以及挖矿节点的不断增多,拥有51%算力的节点可能性很小。但如果算力掌握在几个大的矿池手中,将会有共识攻击的风险。
第11节 总结
本章主要介绍了比特币系统去中心化达成共识的核心机制,即通过设立一个难题、各挖矿节点参与竞争解答、解答成功者获得创建新区块的资格、再由网络中的其他节点独立校验并选择新区块,其中解答难题需要花费的成本使得矿工不会去恶意篡改交易、解答成功且被各节点接收后会对矿工发放奖励。
通过这一系列的工作量证明和比特币奖励,确保了比特币系统至今运行9年也无需任何中心化机构参与。
截止到本章,《精通比特币》这本书的基础知识已学习完成,后面还有2章主要介绍竞争链以及比特币系统的安全,涉及到实际应用,以后再用专题研究。
读者福利领取:
关注公号“Tina说”,在后台回复“韭菜的自我修养”,可领取《韭菜的自我修养》电子版图书;
回复“精通比特币”,可获取《精通比特币》电子版图书
网友评论