比特币几月几号减半,比特币几分钟产生一个区块

  

  这是Blogger关于采矿的科普专辑的第二个内容。承接前面的“比特币交易流程”,通过分析比特币交易从发起到确认的全过程,继续看到比特币挖矿的全貌。   

  

  比特币交易的过程本质上是一堆UTXO的消费和生产过程。这些过程由交易发起方按照比特币协议中规定的方式构建,并由比特币网络生成的新块记录和确认。一旦交易信息被比特币区块记录并确认,交易完成,比特币网络的价值被转移。   

  

  在《比特币交易的过程》一文中,我们已经知道了比特币的交易信息是如何构造的,但是这些信息是如何进入比特币的新区块的呢?   

  

  接下来,博主将详细讲解比特币区块如何通过生成新比特币区块的过程来记录和确认交易信息。   

  

  这里先安利几个知识点:   

  

  交易池,英文名:mempool,又称内存池,用于存储待确认的交易。每个比特币挖矿节点都有自己独立的交易池,每个节点的交易池因交易池体积、最低交易手续费率(本文所说的交易手续费率是单位体积交易中包含的手续费,单位为Sat/B,即每笔B字节交易的手续费为Xcong比特币,下同)等限制不同而不同。矿工(矿石池)在建造储备区块时需要从交易池中选择要打包的交易。由于交易池被频繁调用,其数据存储在节点服务器的RAM中,这意味着交易池的体积不会太大。   

  

  挖矿节点,在比特币网络中,参与记录和验证比特币交易和区块的节点就是保存比特币数据的节点。一些节点不仅参与记录和验证,还参与新比特币区块的创建。他们构造新块,通过PoW工作量证明争夺记账权,从而获得创建新块的权利。这些节点是挖掘节点。早期有矿工,有矿池。但目前由于比特币挖矿难度太大,单个挖矿者很难拿下记账权,创造新区块。目前主要的比特币挖矿节点是各种挖矿池,如F2Pool、Poolin、BTC.com、Antpool、Slushpool等   

  

  UTXO库,通过扫描节点的所有交易信息,由比特币节点构建的UTXO集群。它包含所有未消耗的UTXO。每当生成一个新块时,UTXO库将从它自己的列表中删除新块中消耗的UTXO,并将新生成的UTXO添加到它自己的列表中。   

  

  Coinbase奖励,也称为铸币贸易。比特币协议规定,每生成一个新的比特币区块,比特币网络就会生成N个比特币,支付给创建这个区块的矿工,作为维护比特币网络的报酬。与此同时,该区块中除比特币基地奖励之外的交易中包含的所有交易费用也将合并到比特币基地奖励中,并一起支付给创建该区块的矿工。其中,比特币诞生时n值为50,之后大约每四年减半。目前是6.25。比特币网络以这种对半的方式控制着比特币的总量。比特币基地奖励是每个区块记录的第一笔交易。   

  

待确认的交易会先进入交易池中

  

  当我们要发起一个比特币交易时,交易发起方构造交易信息。此时,交易信息是待确认的交易,包括交易输入信息(未使用的UTXO和正确的私钥签名)和交易输出信息(锁定新钱包地址的待确认UTXO)。   

  

  待确认的交易通过验证后,交易发起者向比特币网络广播,比特币网络中的所有节点都可以验证并记录广播信息。其中,挖掘节点收到广播后会对待确认的交易信息进行验证,验证通过后,挖掘节点会将待确认的交易添加到自己的交易池中。   

  

  图1待确认交易进入交易池   

  

  待验证的交易信息包括:   

  

  交易是否包含有效的输入和输出钱包地址;   

  

  交易量是否小于区块最大体积(比特币区块最大体积目前为1m);   

  

  输入的UTXO是否合法(对比节点的UTXO库,输入的UTXO没有使用过);   

  

  总投入产出量是否合理(总投入总产出);   

  

  判断交易的输入中是否有来自比特币基地的奖励,奖励对应的货币至少需要100块才能确认使用;   

  

  确认事务池中没有重复的事务;   

  

  为该交易设置的交易费用高于mempool的交易费用比率(Sat/B)限制,以及其他验证(如隔离交易的验证和跟踪等。).   

  

挖矿节点从交易池中选择交易,构造预备区块

  

  当挖掘节点要构造一个初步块,准备生成新块时,会根据优先级排序,从交易池中取出待确认的交易。保留块通常会为高优先级的交易保留一定的空间,剩余空间会按照从高到低的交易手续费率(Sat/B)一直填满该块或者用完交易池中的交易。   

  

  然而,比特币区块不仅包含来自交易池的待确认交易。根据比特币协议,比特币块主要包括幻数、块大小、块头、交易计数器、交易信息五个部分。如下图:   

=比特币几月几号减半,比特币几分钟产生一个区块3.jpg">图2 比特币区块的结构

  

其中,“魔数”是一个值为0xD9B4BEF9的常数;“区块体积”是本区块所有数据的总体积;“区块头”是可以看作是整个区块的缩略信息,挖矿用到的区块信息就是区块头;“交易计数器”用来记录区块中交易的数量;“交易数据”是区块所包含的所有交易信息,包括Coinbase奖励部分,一般来说,这部分数据占了整个区块绝大部分空间。

  

在比特币区块中,区块头是最为关键的一个信息。它包含整个区块的所有特征信息:

  

区块版本号。创建区块的比特币节点的版本信息,用于追踪比特币协议的升级和更新情况;

  

前一个区块的哈希值。又叫做父区块哈希,用来定位上一个区块。每一个区块都包含它的上一个区块的哈希值,针对任何一个区块的任何一个微小的改动,都会使后续区块的哈希值产生巨大的变化,如此环环相扣,确保比特币所有区块形成一条单一的链式结构,可以有效防止恶意篡改比特币区块数据的行为。

  

MerkleRoot哈希。在区块的交易数据列表中,取所有交易数据的哈希值,构建Merkle树,这个Merkle树的根哈希值,即为MerkleRoot哈希。如下图:

  

图3 交易数据的Merkle树结构

  

由于哈希算法的敏感性,整个交易的Merkle树中任何一个交易数据有微小的改动,都会产生联动效果,导致Merkle树的根哈希值出现巨大变化。因此交易数据的Merkle树根哈希值(MerkleRoot Hash)可以看作是整个交易的指纹,用来指代区块中的交易数据。

  

时间戳。创建预备区块的时间。

  

当前目标哈希值。比特币协议规定,矿工创建的预备区块的哈希值小于目标哈希值时,这个区块才算有效。目标哈希值由挖矿难度确定,当挖矿难度变大时,目标哈希值变小,矿工要找到符合比特币网络要求的哈希值就越困难。按照当前的挖矿难度,要找到低于目标哈希值的哈希值,理论上需要一台S17矿机连续工作42年时间。因此,现在基本不存在个人自建节点挖比特币的情况。

  

随机数。又叫Nonce。我们可以发现,区块头信息中,区块版本号,前一个区块的哈希值,MerkleRoot哈希值,时间戳,以及当前目标哈希,都是已知信息,相对固定,不便随意更改。因此,如果要调整预备区块的哈希值,就需要引入一个可变的数据――随机数。修改随机数,就可以调整预备区块的哈希值。

  

挖矿节点构建好预备区块后,就会将区块头信息下发给矿工,矿工通过不断调整区块头中的随机数来变更预备区块的哈希值,当预备区块的哈希值低于比特币网络当前目标哈希值时,这个区块就是一个合法新区块。

  

挖矿节点会及时地向比特币网络广播新区块,比特币网络中其他比特币节点在接到广播信息后,对新区块进行验证,验证通过后,将新区块加入本地,并延长节点的区块链。此时,新区块创建并确认完毕,对应交易也完成了。

  

参考资料:

  

比特币源码分析

  

比特币区块头结构分析:

  

比特币目标哈希值

  

比特币区块结构

  

精通比特币

相关文章