比特币网络
比特币网络是一个点对点 (P2P) 系统,其中节点参与交易活动。这些节点负责验证和传播交易和区块。其中,矿工是创建新区块的专用节点。网络由各种类型的节点组成,主要分为两个类别:完整节点和简单支付验证 (SPV) 节点。
完整节点使用 比特币核心客户端软件,处理钱包功能、挖矿、完整的区块链存储和网络路由。但是,并非比特币网络中的每个节点都需要执行所有这些角色。SPV 节点或轻量级客户端仅专注于钱包操作和网络路由。
识别比特币网络
比特币网络以其独特的魔法值而著称,该魔法值用于表示消息的来源网络。下表列出了这些值的汇编 −
一个完整的比特币节点执行四个功能。它们是钱包、矿工、区块链和网络路由。我们已经在前面的章节中讨论了挖矿和区块链。在这里,我们继续讨论比特币网络。
比特币网络中的协议消息
目前有一些不同类型的协议消息,随着协议的发展,这个数字可能会增长。以下是最常用的协议消息及其描述的列表 −
- 版本 − 此初始消息由节点发送到网络,指示其版本和块数。远程节点以相同的详细信息进行响应,从而建立连接。
- Verack − 此消息确认版本消息并接受连接请求。
- Inv − 节点使用此消息宣布它们知道区块和交易。
- Getdata − 此消息是对 inv 的响应,请求由其哈希值标识的特定区块或交易。
- Getblocks − 这将返回一个 inv 数据包,其中包含从最后一个已知哈希值开始的所有区块的列表,最多 500 个区块。
- Getheaders − 此消息请求指定范围内的区块头。
- Tx −这用于传输响应 getdata 协议消息的交易。
- Block − 此消息发送一个块以回复 getdata 协议消息。
- Headers − 此数据包可以返回最多 2,000 个块头作为对 getheaders 请求的响应。
- Getaddr − 此消息用于请求有关已知对等方的信息。
- Addr − 这提供有关网络上节点的详细信息,包括地址数量和格式化为 IP 地址和端口号的地址列表。
- Ping − 此消息用于验证 TCP/IP 网络连接的活动。
- Pong −此消息作为对 ping 的响应,确认网络连接正常运行。
比特币网络中发生了什么?
比特币网络中通过协议传输消息的过程。这按时间顺序发生,如下所示 −
- 在比特币网络中,当客户端传输称为版本消息的协议消息时,该过程开始,该消息包括多个字段,例如版本、服务、时间戳、网络地址、随机数和其他信息。
- 作为响应,远程节点发送其自己的版本消息,然后在两个节点之间交换verack消息,确认连接已成功建立。
- 随后,将交换 getaddr 和 addr 消息以识别客户端尚未知晓的对等节点。
- 在此过程中,任一节点均可发送 ping 消息以验证连接的持续状态。getaddr 和 addr 消息类型在比特币协议中指定。
此网络协议序列图说明了初始连接阶段两个比特币节点之间的通信。
在给定的示例中,节点 A 位于左侧,而节点 B 位于右侧。节点 A 通过向远程对等节点节点 B 发送包含版本号和当前时间戳的版本消息来启动连接。然后,节点 B 使用其自己的版本消息进行回复,该消息也包含版本号和当前时间。
随后,节点 A 和节点 B 交换 verack 消息,表示连接已成功建立。确认连接后,对等节点可以交换 getaddr 和 addr 消息以发现网络中的其他对等节点。
此时,可以开始下载区块的过程。如果节点已经同步了所有区块,它将使用 inv 协议消息监听新区块。如果没有,它首先检查对 inv 消息的响应以及它是否拥有库存。如果有库存,它将使用 getdata 协议消息请求块;如果没有,它将通过 getblocks 消息请求库存。
完整客户端和 SPV 客户端
比特币网络节点可以以两种主要模式运行:作为完整客户端或轻量级SPV 客户端。完整客户端(也称为厚客户端或完整节点)下载整个区块链,为验证交易提供最高级别的安全性。
相比之下,SPV 客户端允许用户验证付款而无需下载完整的区块链。这些 SPV 节点仅维护最长有效区块链的块头。通过检查 Merkle 分支来实现验证,该分支将交易连接到记录它们的原始块中。这种方法可能有点不切实际,需要一种更有效的解决方案,该解决方案是通过 BIP37 引入的。
布隆过滤器
布隆过滤器 是一种专门的数据结构,具体来说是一种具有索引位置的位向量,旨在概率地评估元素的成员资格。它允许进行可能产生误报但保证没有漏报的概率查找。这意味着虽然过滤器可能会错误地指示元素是测试集的一部分,但它永远不会错误地声称现有元素不存在。本质上,可能会出现误报,但不可能发生漏报。
为了将元素合并到布隆过滤器中,它们会被多次散列,并根据结果索引将位向量中的相应位设置为 1。为了验证元素的存在,应用相同的哈希函数,并检查位向量中的位是否全部设置为 1。
Bloom 过滤器主要由简单支付验证 (SPV) 客户端用来请求特定交易和相关的 Merkle 块。
Merkle 块用作块的紧凑表示,包含块头、多个哈希、1 位标志列表和交易计数。此数据可用于构建 Merkle 树。过滤器经过量身定制,仅匹配 SPV 客户端请求的交易和块。在交换版本消息并在对等点之间建立连接后,节点可以根据其特定需求配置过滤器。