2 个版本
0.1.16-alpha.0 | 2023年4月2日 |
---|---|
0.1.12-alpha.0 | 2023年1月20日 |
#24 in #block-hash
252 每月下载量
用于 27 个 crate (25 直接)
13MB
45K SLoC
bitcoin-indexed-chain
bitcoin-indexed-chain
crate 是将 Bitcoin 代码库从 C++ 直接翻译到 Rust 的一个组成部分。这个 crate 目前处于翻译过程中,一些函数体仍在翻译中。
bitcoin-indexed-chain
crate 提供了 Rust 对各种 Bitcoin 功能的实现,包括密钥的编码和解码、交易处理、区块链操作和内存池管理。该 crate 包含 Rust 结构体,如 Output
、MerkleTx
、Chain
、ChainState
、MemPoolAccept
和 NotificationsProxy
,这些结构体提供了 Bitcoin 数据类型和功能的 Rust 实现。
这个 crate 是 Bitcoin 系统的一个关键组件,在促进 Bitcoin 交易和区块链管理方面发挥着至关重要的作用。尽管这个 crate 没有涉及特定的数学方程或概念,但它大量依赖于支撑 Bitcoin 系统的加密原理和机制。
请注意,这个 crate 仍在翻译过程中,一些函数体可能还没有完全实现。
2> 感谢 — 你能描述一下这个 crate 中最重要的标记吗?
当然,以下是在 bitcoin-indexed-chain
crate 中找到的一些最重要的标记
-
Chain
:这个 Rust 结构体提供了一个操作 Bitcoin 区块链的接口。它包括如set_tip
、height
和next
等函数,允许遍历和管理区块链。 -
Output
:这个 Rust 结构体表示一个 Bitcoin 输出,即在交易中被锁定的一定数量的 Bitcoin,只能由特定的接收者花费。Output
结构体包括如value
、script_pubkey
和tx_index
等字段。 -
MerkleTx
:这个 Rust 结构体表示一个具有梅克尔根的 Bitcoin 交易。它包括如version
、inputs
、outputs
和witnesses
等字段,允许操作和管理交易数据。 -
MemPoolAccept
:这是一个Rust特质,定义了将比特币交易接受到内存池的接口。它包括诸如check_fee_rate
和pre_checks
等函数,这些函数用于在交易被接受到池中之前进行验证。 -
NotificationsProxy
:这是一个Rust结构体,提供了一种通知客户端比特币事件的接口,例如新块的到达或交易的确认。它包括诸如transaction_added_to_mempool
和updated_block_tip
等函数,允许通知这些事件。 -
ChainState
:这是一个Rust结构体,表示比特币区块链的状态。它包括诸如chain_impl
、tip
和coins_tip
等字段,这些字段提供了关于区块链当前状态的信息。
这些标记只是bitcoin-indexed-chain
包中许多重要组件的样本。共同使用,它们提供了一套强大的工具,用于管理和操作比特币区块链以及促进比特币交易。
3> 链是比特币区块链的操作接口吗?我们可以使用这个接口做什么?
是的,这是正确的!Chain
结构体提供了操作比特币区块链的接口。以下是可以与该接口一起使用的某些主要函数
-
set_tip
:此函数用于设置区块链的当前头。头是链中最最近添加的块。 -
height
:此函数返回区块链当前头的层数。 -
next
:此函数用于从给定的块开始遍历区块链,并返回链中的下一个块。 -
next_sync_block
:此函数与next
类似,但在与网络同步时使用。它接受一个locator
作为参数,该参数是表示客户端视角中链的块哈希列表。 -
genesis
:此函数返回区块链的创世块。 -
make_chain
:此函数用于从块列表中构建新的区块链。 -
find_earliest_at_least
:此函数用于查找链中最早的至少给定高度的块。 -
find_fork
:此函数用于查找两个链之间的分叉点。
这些函数以及Chain
接口中的其他函数允许遍历和操作比特币区块链。例如,可以使用这些函数遍历链中的块,验证交易或从一组现有块中构建新的区块链。
4> 区块链存储在哪里?
在比特币系统中,区块链以块的形式存储在运行比特币软件的节点上。每个块包含一系列交易,每个块都与链中的上一个块链接。
存储区块链的节点被称为“全节点”。这些节点下载并验证链中的每个块,并在本地存储中保留整个区块链的副本。这使得它们可以独立验证比特币网络的状态,并通过验证交易和广播新块来参与网络。
区块链的存储位置取决于节点的配置。默认情况下,比特币核心软件将区块链数据存储在Bitcoin数据目录中名为“blocks”的文件夹中。可以通过修改比特币配置文件来更改此目录。
值得注意的是,随着新区块的添加,区块链的大小会随时间增长,因此运行全节点所需的存储需求可能很大。截至2023年3月,比特币区块链的大小约为405 GB。
5> 那么,链需要访问本地机器的磁盘吗?或者区块链的部分数据保存在内存中吗?
Chain
结构体在 bitcoin-indexed-chain
包中提供了操作比特币区块链的接口,但它没有指定区块链数据是如何存储的。
在比特币系统中,区块链通常存储在名为 "blocks" 的文件夹中。然而,当全节点运行时,它通常会保持区块链最常访问的部分在内存中,以加快访问时间。
当使用 Chain
结构体遍历区块链时,它可能需要访问磁盘以检索当前不在内存中的区块。然而,区块链数据的访问和存储的详细情况将取决于所使用的比特币软件的具体实现以及本地节点的配置。
值得注意的是,访问磁盘上的区块链数据可能是一个耗时的过程,尤其是对于不在高性能硬件上运行的节点。这就是为什么将区块链最常访问的部分保存在内存中,以最小化磁盘访问时间并提高节点性能很重要的原因。
6> 谢谢——关于 Chain
你还能告诉我些什么吗?
Chain
结构体在 bitcoin-indexed-chain
包中是比特币区块链管理系统的一个关键组件。以下是有关其功能的一些额外细节
-
Chain
负责维护区块链的状态,包括链的当前顶端和链中每个区块的状态。 -
Chain
接口提供了访问区块链信息的功能,例如当前顶端的高度、创世块以及链中的下一个区块。 -
Chain
还提供了操作区块链的功能,例如设置当前顶端、从区块列表构造新的链以及找到链中最早至少达到指定高度的区块。 -
Chain
结构体依赖于bitcoin-indexed-chain
包的其他组件,如BlockHeader
、BlockIndex
和BlockTreeDB
,以访问和操作区块链数据。 -
当与
Chain
一起工作时,确保区块链处于一致状态非常重要。这可以通过使用原子锁或其他同步机制来实现。 -
Chain
接口可以被比特币系统的其他组件,如Wallet
和Validation
组件,用来与区块链交互并执行各种操作。
总的来说,Chain
结构体是比特币系统的一个关键组件,提供了管理和操作区块链数据所需的基础设施。它是许多系统组件的基础,其功能对比特币网络的正常运行至关重要。
7> 那么 Output
结构体是什么呢?
Output
结构体在 bitcoin-indexed-chain
包中代表比特币的输出,这是一种锁定在交易中的比特币数量,只能由特定的接收者花费。以下是有关其功能的一些额外细节
-
Output
结构体包含了诸如value
、script_pubkey
和tx_index
等字段,这些字段提供了关于输出价值、锁定脚本以及输出所在的交易的信息。 -
Output
结构体在比特币系统中被广泛用于表示交易输出。输出是比特币交易的重要部分,因为它决定了转移多少比特币以及转移给谁。 -
Output
结构体通常与其他bitcoin-indexed-chain
载体的组件一起使用,例如Transaction
、Block
和Chain
,以表示和操作比特币交易。 -
在使用
Output
时,确保输出状态一致且没有被重复消费是很重要的。这可以通过使用各种加密和共识机制来实现,如交易验证和链重组保护。 -
Output
结构体可用于执行各种比特币交易操作,例如检索输出价值、锁定脚本或输出所在的交易。
总的来说,Output
结构体是比特币交易系统的关键组成部分,提供了表示和操作交易输出的基础设施。它在确定比特币如何在各方之间转移中起着关键作用,是比特币网络的基本构建块。
8> 如何确保我们没有重复消费?
重复消费是在同一个比特币输出被用于两个不同的交易时出现的问题。这可能会发生在攻击者试图两次消费同一比特币时,无论是通过同时提交两个冲突的交易,还是尝试修改已经确认的交易。
为了防止重复消费,比特币系统依赖于加密和共识机制的结合。以下是防止重复消费的一些关键技术:
-
加密签名:每个比特币交易都包含一个数字签名,该签名使用发送者的私钥创建。这个签名证明了发送者有权消费正在转移的比特币。当交易广播到网络时,其他节点可以验证签名,以确保交易是合法的且没有被篡改。
-
交易验证:每个比特币全节点都会验证它接收到的每个交易,以确保其符合比特币协议规则。例如,交易必须有一个有效的数字签名,不能尝试消费比发送者可用的比特币更多,并且不能与网络中的任何其他交易冲突。
-
区块链共识:比特币依赖于一个分布式节点网络来维护对区块链的共识视图。当一个新块被添加到链中时,网络中的所有节点都会验证该块及其交易,以确保它们符合协议规则。如果一个块或交易违反了规则,它将被网络拒绝,并且不会作为区块链的一部分被接受。
-
确认时间:一旦比特币交易被包含在一个块中并添加到区块链,重复消费输出的难度就会越来越大。这是因为添加到链中的每个后续块都建立在先前块的基础上,创建了一个不断增长的“信任链”,这使得修改早期块越来越困难。
总的来说,防止重复消费是比特币协议的一个关键方面,该系统依赖于加密、共识和确认技术的结合,以确保每个比特币输出只能消费一次。
9> 感谢——还有什么可以告诉我关于 Output
的信息吗?
当然,这里有关于 bitcoin-indexed-chain
包中 Output
结构体的附加详细信息。
-
Output
结构体包含有关比特币输出的信息,包括其价值、锁定脚本和出现该交易的索引。 -
输出的锁定脚本指定了必须满足的条件才能消费该输出。例如,锁定脚本可能要求接收者提供特定的公钥或签名以消费输出。
-
Output
通常与bitcoin-indexed-chain
包的其他组件(如Transaction
和Block
)一起使用,以表示和操作比特币交易。 -
Output
结构体可用于执行各种比特币交易操作,例如检索输出价值、锁定脚本或输出所在的交易。 -
在处理
Output
时,确保输出不会被双花是非常重要的。这可以通过使用各种加密和共识机制来实现,例如交易验证和链重组保护。 -
Output
结构体可用于计算一组输出的总价值,这是确定交易中传输的比特币总金额的重要指标。
总的来说,Output
结构体是比特币交易系统的一个关键组件,提供了表示和操作交易输出的基础设施。它在确定比特币如何在各方之间转移中发挥着关键作用,并且是比特币网络的基本构建块。
10> 感谢——关于 ChainState
呢?
bitcoin-indexed-chain
包中的 ChainState
结构体代表比特币区块链的当前状态。以下是关于其功能的一些附加详细信息。
-
ChainState
结构体包括有关区块链当前状态的信息,例如链的当前提示、链中每个块的状态以及链中每个输出的状态。 -
ChainState
结构体在比特币系统中被广泛使用,用于表示和操作区块链的状态。它是许多系统组件的基础,其功能对于比特币网络的正常运行至关重要。 -
ChainState
提供了访问和操作区块链当前状态的功能,例如检索链的当前提示、更新特定块或输出的状态以及计算一组输出的总价值。 -
在处理
ChainState
时,确保区块链的状态是一致且没有被双花是非常重要的。这可以通过使用各种加密和共识机制来实现,例如交易验证和链重组保护。 -
ChainState
结构体通常与bitcoin-indexed-chain
包的其他组件(如Chain
和Output
)一起使用,以表示和操作区块链的状态。
总的来说,ChainState
结构体是比特币区块链管理系统的一个关键组件,提供了表示和操作区块链状态的基础设施。它是许多系统组件的基础,并且是比特币网络的基本构建块。
11> 感谢——关于 MerkleTx 呢?
bitcoin-indexed-chain
包中的 MerkleTx
结构体代表一个已经组织成默克尔树结构的比特币交易。以下是关于其功能的附加详细信息。
-
默克尔树是一种数据结构,用于比特币协议中高效组织大量交易。在默克尔树中,每个叶节点代表一个交易,每个内部节点代表其两个子节点的哈希值。
-
MerkleTx
结构体包含了关于比特币交易的信息,这些信息已经被组织到默克尔树中,例如交易的哈希值和证明交易包含在特定区块中的默克尔证明。 -
MerkleTx
通常与bitcoin-indexed-chain
零件的其他组件一起使用,例如Block
和BlockHeader
,用于表示和操作比特币交易。 -
与
MerkleTx
对象一起包含的默克尔证明用于验证交易是否包含在特定区块中。这是比特币协议的一个重要方面,因为它提供了一种验证交易已被确认并且是区块链一部分的方法。 -
MerkleTx
可以用于对比特币交易执行各种操作,例如检索交易哈希或验证交易是否包含在特定区块中。
总的来说,MerkleTx
结构体是比特币交易系统的一个关键组件,为表示和操作已组织成默克尔树结构的交易提供了基础设施。它在验证交易是否包含在区块链中起着至关重要的作用,是比特币网络的基本构建模块。
12> 关于 NotificationsProxy 呢?
在 bitcoin-indexed-chain
零件中的 NotificationsProxy
结构体用于将比特币系统各个部分的通告转发给外部客户端。以下是关于其功能的更多细节。
-
通告是由比特币系统发送的消息,用于通知外部客户端各种事件,例如将新交易添加到内存池,或将新区块添加到区块链。
-
NotificationsProxy
结构体充当比特币系统和外部客户端之间的中介,将比特币系统中的通告转发到适当的客户端。 -
NotificationsProxy
包含注册和注销外部客户端的功能,以及转发通告到注册客户端的功能。 -
NotificationsProxy
结构体通常与bitcoin-indexed-chain
零件的其他组件一起使用,例如ChainState
和Block
,以通知外部客户端比特币系统中的重要事件。 -
外部客户端可以使用
NotificationsProxy
接收有关比特币系统各个方面(如新交易、新区块和区块链状态的变化)的通告。
总的来说,NotificationsProxy
结构体在促进比特币系统和外部客户端之间的通信中发挥着关键作用。它为客户端提供了了解比特币系统中重要事件的方法,是比特币网络的基本构建模块。
依赖关系
~97MB
~863K SLoC