区块链-将交易打包到新区快

目录:http://www.javashuo.com/article/p-nitsjfvy-ey.html算法

如何达到共识:http://www.javashuo.com/article/p-wcdglpfz-gx.html 网络

  • 每一个全节点依据综合标准对每一个交易进行独立验证区块链

  • 经过完成工做量证实算法的验算,挖矿节点将交易记录独立打包进新区块网站

  • 每一个节点独立的对新区块进行校验并组装进区块链.net

  • 每一个节点对区块链进行独立选择,在工做量证实机制下选择累计工做量最大的区块链。设计

以上是达到共识的几个步骤,最近节点对交易验证事后进行广播,而后完成第二步,打包到新区快。blog

挖矿节点

在比特币网络中,一些节点被称为专业节点“矿工”。矿工经过矿机挖矿得到比特币,矿机是专门设计用于挖比特币的计算机硬件系统。索引

每一个节点时刻监听着传播到比特币网络的新区块。而这些新加入的区块对挖矿节点有着特殊的意义。矿工间的竞争以新区块的传播而结束,如同宣布谁是最后的赢家。对于矿工们来讲,收到一个新区块进行验证意味着别人已经赢了,而本身则输了这场竞争。然而,一轮竞争的结束也表明着下一轮竞争的开始。新区块并不单单是象征着竞赛结束的方格旗;它也是下一个区块竞赛的发令枪。ip

打包交易至区块

验证交易后,比特币节点会将这些交易添加到本身的内存池中。 内存池也称做交易池,用来暂存还没有被加入到区块的交 易记录。节点会收集、验证并传递新的交易。内存

挖矿节点维护了一个区块链的本地副本。并继续监听着网络上的交易,在尝试挖掘新区块的同时,也监听着由其余节点发现的区块。当他收到一个他正在挖的区块时,这个区块的到来标志着终结了产出该区块竞赛,与此同时也是产出下一个区块竞赛的开始。

在上一个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