目录:https://blog.csdn.net/qq_40452317/article/details/89646633
如何达到共识:https://blog.csdn.net/qq_40452317/article/details/90510041
-
每个全节点依据综合标准对每个交易进行独立验证
-
通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块
-
每个节点独立的对新区块进行校验并组装进区块链
-
每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。
以上是达到共识的几个步骤,最近节点对交易验证过后进行广播,然后完成第二步,打包到新区快。
挖矿节点
在比特币网络中,一些节点被称为专业节点“矿工”。矿工通过矿机挖矿获得比特币,矿机是专门设计用于挖比特币的计算机硬件系统。
每个节点时刻监听着传播到比特币网络的新区块。而这些新加入的区块对挖矿节点有着特殊的意义。矿工间的竞争以新区块的传播而结束,如同宣布谁是最后的赢家。对于矿工们来说,收到一个新区块进行验证意味着别人已经赢了,而自己则输了这场竞争。然而,一轮竞争的结束也代表着下一轮竞争的开始。新区块并不仅仅是象征着竞赛结束的方格旗;它也是下一个区块竞赛的发令枪。
打包交易至区块
验证交易后,比特币节点会将这些交易添加到自己的内存池中。 内存池也称作交易池,用来暂存尚未被加入到区块的交 易记录。节点会收集、验证并传递新的交易。
挖矿节点维护了一个区块链的本地副本。并继续监听着网络上的交易,在尝试挖掘新区块的同时,也监听着由其他节点发现的区块。当他收到一个他正在挖的区块时,这个区块的到来标志着终结了产出该区块竞赛,与此同时也是产出下一个区块竞赛的开始。
在上一个10分钟内,节点正在寻找上一个区块的解的同时,它也在收集交易记录为下一个区块做准备。目前它已经收到了几百笔交易记录,并将它们放进了内存池。直到接收并验证区块该后,节点会检查内存池中的全部交易,并移除已经在上一个区块中出现过的交易记录,确保任何留在内存池中的交易都是未确认的,等待被记录到新区块中。
节点立刻构建一个新的空区块,做为下一个区块的候选区块。称作候选区块是因为它还没有包含有效的工作量证明,不是一个有效的区块,而只有在矿工成功找到一个工作量证明解之后,这个区块才生效。
创币交易
区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase 交易。这个交易是由节点构造并用来奖励矿工们所做的贡献的。
节点会创建“向矿工的地址支付12.5个比特币”(假此时的矿工费是这么多)这样一个交易,把生成交易的奖励发送到自己的钱包。挖出区块获得的奖励金额是 coinbase 奖励(12.5个全新的比特币)和区块中全部交易矿工费的总和。
2016 年七月份的奖励为12.5 比特币,2020 年达到 210000 区块时,将再次减半
与常规交易不同,创币交易没有输入,不消耗UTXO。它只包含一个被称作coinbase的输入,仅仅用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。创币交易的输出将这12.5个比特币发送到矿工的比特币地址。
Coinbase奖励与矿工费
为了构造创币交易,J节点需要计算矿工费的总额,将这几百个交易个已添加到区块交易的输入和输出分别进行求和,然 后用输入总额减去输出总额得到矿工费总额,公式如下:
Total Fees = Sum(Inputs) - Sum(Outputs)
紧接着,节点计算出这个新区块正确的奖励额。奖励额的计算是基于区块高度的,以每个区块50个比特币为开始,每产生 210,000 个区块减半一次。所以当前正确的奖励额是12个比特币。
最后,将coinbase奖励额与矿工费总额求和,并返回这个值。
如果挖矿节点把coinbase交易写入区块,那么如何防止挖矿节点奖励自己100甚至1000比特币? 答案是,不正确的奖励将被其他人视为无效,浪费了用于工作证明的投入。 只有这个区块被大家认可,才能得到报酬。
创币交易的结构
创币交易的结构比较特殊,与一般交易输入需要指定一个先前的UTXO不同,它包含一个“coinbase“输入。前面已经给出了交易输入的结构。现在让来比较一下常规交易输入与创币交易输入。
常规交易输入结构
coinbase 交易输入结构
在 Coinbase交易中,“交易哈希”字段32个字节全部填充 0,“交易输出索引”字段全部填充 0xFF(十进制的 255),这两个字段的值表示不引用UTXO。“解锁脚本”由coinbase数据代替,数据可以由矿工自定义。
Coinbase 数据
创币交易不包含“解锁脚本“(又称作 scriptSig)字段,这个字段被 coinbase 数据替代,长度最小2字节,最大 100 字节。除 了开始的几个字节外,矿工可以任意使用coinbase的其他部分,随意填充任何数据。
以创世块为例,中本聪填入了这样的数据“TheTimes 03/Jan/2009Chancelloronbrinkofsecondbailoutforbanks“(泰晤士报 2009年1月3日财政大臣将再次对银行施以援手),表示对日期的证明,同时也表达了对银行系统的不信任。现在,矿工使用 coinbase数据实现extranonce功能,并嵌入字符串来标识挖出它的矿池。
coinbase 前几个字节也曾是可以任意填写的,不过在后来的第34号比特币改进提 议(BIP34)中规定了版本2的区块(版本字段为2的区块),这个区块的高度必须跟在脚本操作“push“之后,填充在coinbase字段的起始处。
我们可以去相关网站查看一些coinbase数据。https://www.blockchain.com/btc/tx/ca08e0aeb8c50f2ca5ad7c86d3e3197da871aa294dc4637f8914a05126b2e41f