2 个版本
0.1.16-alpha.0 | 2023年4月2日 |
---|---|
0.1.12-alpha.0 | 2023年3月3日 |
#20 在 #block-size
每月 22 次下载
用于 bitcoin-top
2.5MB
9K SLoC
bitcoin-miner
bitcoin-miner crate 是将 Bitcoin 代码库从 C++ 直接翻译到 Rust 的实现,负责组装和挖掘 Bitcoin 区块链的新块。
bitcoin-miner
crate 的核心是 BlockAssembler
,它负责使用当前 mempool 中的交易构造有效块。该 BlockAssembler
创建一个新的块模板,其梅克尔根基于所选的交易,并计算一个有效的随机数值以生成满足工作量证明要求的块头哈希。
bitcoin-miner
crate 还包括一个 TxMemPool
实现,用于存储未确认的交易,等待包含在块中。该 TxMemPool
由 BlockAssembler
用于选择包含在新块中的交易。
bitcoin-miner
crate 的其他重要组件包括 IndexedModifiedTransactionSet
,它维护一个包含祖先的修改后的交易集合,以高效地构建块,以及 BlockTemplate
,它封装了构建有效块所需的数据。
虽然这个 crate 正在翻译过程中,但 Rust 实现将提供比原始 C++ 实现更好的内存安全性和性能优势。
130> 谢谢 —— 你能更深入地讲解这些结构吗?
当然,我很乐意!以下是你列出的一些结构的更多信息
-
BlockAssembler:这个结构负责在挖掘过程中组装块。它从 mempool 中选择交易,并通过添加 coinbase 交易并选择满足块的大小和费用要求的其他交易来尝试构造一个有效块。
-
BlockTemplate:这个结构代表在挖掘过程中使用的块模板。它包括诸如前一个块的哈希、目标难度以及要包含在块中的交易列表等信息。
-
CompareTxIterByAncestorCount:此结构用于按祖先数量排序交易。祖先数量更高的交易(即依赖项更多)将首先排序。
-
CompareTxMemPoolIter:此结构用于按费率排序内存池中的交易。
-
IndexedModifiedTransactionSet:此结构用于存储一组修改后的交易(即在内存池中已添加或删除的交易)及其索引。它用于有效地计算修改后的费率和大小总和。
-
Options:此结构用于将选项传递给bitcoin-miner crate中的各种函数和方法。它包括最小费率、最大区块重量等选项。
-
ResultType:这是一个枚举,表示区块组装操作的结果。它包括“成功”和“区块已满”等值。
-
TxMemPoolModifiedEntry:此结构代表内存池中的修改后交易。它包括交易费率、大小和祖先数量等信息。
-
UpdateForParentInclusion:此结构用于在将区块添加到区块链时更新内存池。它删除已包含在区块中的交易并更新剩余交易的祖先数量。
希望这有助于您!如果您还有其他问题,请告诉我。
131>让我们更深入地谈谈BlockAssembler
当然,我可以在比特币系统的背景下更详细地解释关于BlockAssembler
结构的内容。
在比特币系统中,挖矿涉及找到包含一系列有效交易的合法区块。BlockAssembler
是一种用于辅助构建合法区块以供挖矿使用的数据结构。它将从内存池(未确认交易池)中的交易组装成有效的区块模板。
BlockAssembler
接受交易列表并生成区块模板。此区块模板包含标题、交易列表和其他必要的元数据,这些数据对于挖矿是必需的。区块标题包含一个nonce、一个时间戳和一个Merkle根,后者是区块中所有交易的哈希。矿工可以改变nonce,试图找到满足当前挖矿难度水平的有效区块哈希。
BlockAssembler
负责根据某些标准选择包含在区块中的交易,例如交易费率、优先级和年龄。它还确保区块大小不超过最大区块大小,并且区块满足所有其他有效性规则。一旦组装好区块,就可以将其广播到比特币网络进行挖矿。
BlockAssembler
是挖矿过程中的关键组件,因为它决定了区块中包含的交易列表,因此直接影响了用户支付的交易费以及比特币网络的整体健康状况。
总之,BlockAssembler
是比特币系统中用于组装合法区块以供挖矿使用的数据结构。它从内存池中选择交易,并在将其广播到网络之前确保区块满足所有有效性规则。
132>谢谢!那么BlockTemplate是什么?
BlockTemplate
是一种表示矿工可以尝试解决的潜在区块的数据结构。它包括区块标题和要包含在区块中的交易列表。
BlockTemplate
是由全节点生成的,它计算挖掘一个区块所需的劳动量,并根据一系列标准(如交易费用和大小)选择要包含的交易。然后,BlockTemplate
被广播给矿工,矿工试图找到一个有效的区块哈希,该哈希满足BlockTemplate
中指定的难度要求。
BlockTemplate
包括以下信息
-
version
:区块的版本。 -
previous_blockhash
:链中前一个区块的哈希。 -
merkle_root
:包含区块中所有交易的默克尔树根。 -
time
:区块的时间戳。 -
bits
:区块的编码难度目标。 -
coinbase_value
:挖掘区块的奖励(包括交易费用)。 -
height
:区块在区块链中的高度。 -
transactions
:要包含在区块中的交易列表。
BlockTemplate
是挖掘过程中的一个重要组件,因为它为矿工提供了构建有效区块并竞争找到具有所需前导零数的区块哈希所需的信息。
133> 谢谢!那TxMemPoolModifiedEntry是什么?
TxMemPoolModifiedEntry
是比特币代码库中的一个结构,它代表在内存池中已修改的交易。它包含一些字段,用于跟踪有关交易的各种信息。
-
tx
:交易本身,存储为CTransactionRef
对象。 -
nFee
:交易支付的费率,以satoshis计。 -
nTime
:交易被添加到内存池的时间,自Unix纪元以来以秒计。 -
nHeight
:交易被包含的区块的高度,如果它已被包含在区块中。否则,此字段设置为-1
。 -
nFeeDelta
:交易与其未确认祖先之间的费率差异,以satoshis计。 -
inChain
:一个布尔标志,指示交易是否包含在活动链中。 -
vAncestors
:一个包含交易未确认祖先的向量,存储为TxMemPoolEntry
对象。
TxMemPoolModifiedEntry
被内存池代码用来跟踪交易在被添加、删除和修改时的变化。它还用于计算每笔交易支付的费率,并确定哪些交易应包含在新的区块中。
134> 谢谢!那IndexedModifiedTransactionSet呢?
IndexedModifiedTransactionSet
是比特币挖掘过程中使用的一种数据结构。它是一组可以包含在正在挖掘的区块中的修改后的交易。
在比特币挖掘中,矿工们竞争找到一个包含一组交易的有效区块。为此,他们从比特币内存池中提取交易,并尝试将它们包含在一个满足某些标准的区块中,例如目标哈希值低于某个阈值。
为了高效地组装一个区块,矿工需要跟踪哪些交易已经被包含,哪些尚未包含。通过维护修改交易索引的IndexedModifiedTransactionSet
,提供了一种高效的方式来做到这一点,其中修改交易是指更新了新手续费或已从内存池中删除的交易。
IndexedModifiedTransactionSet
数据结构允许快速查找交易,在添加或删除新交易时进行高效更新。它在组装区块过程中使用,以确保仅将有效且唯一的交易包含在正在挖掘的区块中。
135> 谢谢!那关于UpdateForParentInclusion呢?
UpdateForParentInclusion
是一个Rust结构体,它封装了当交易父交易被包含在区块中时更新内存池所需的数据。在比特币中,内存池中的每个交易都有一或多个依赖的父交易。当父交易被包含在区块中时,其子交易变为有效,也可以被包含在后续的区块中。
UpdateForParentInclusion
结构体包含了一组依赖于被包含父交易的交易,以及每笔交易的费率。当父交易被包含在区块中时,内存池必须更新以删除依赖的交易并重新计算剩余交易的费率。
该结构体在比特币代码库的TxMempool
模块中使用,以管理内存池并确保在区块链中确认其依赖项时,交易得到适当的添加和删除。
136> 谢谢!关于挖掘还能告诉我什么吗?
挖掘是将新交易添加到区块链的过程。矿工通过被奖励新的比特币来激励执行这项任务,这些比特币在挖掘过程中被生成并添加到流通中。
挖掘涉及解决一个需要一定计算能力才能完成的加密难题。这个难题设计得很难解决,但一旦找到解决方案就很容易验证。难题的解决方案被称为“哈希”,它作为证明矿工已经完成必要的工作来验证交易区块并将其添加到区块链的证明。
在比特币系统中,挖掘是通过“工作量证明”过程进行的。矿工通过将交易块与一个随机数“nonce”进行哈希来竞争解决加密难题。第一个解决难题并找到有效哈希的矿工将获得新的比特币作为奖励。
挖掘过程极具竞争性,随着更多矿工加入网络,加密难题的难度会调整,以确保新块被添加到区块链的速率在时间上保持相对恒定。因此,挖掘已经成为一个独立的行业,拥有专门的硬件和大规模的挖掘运营,致力于验证交易并获得新的比特币。
依赖项
~107MB
~1M SLoC