- 区块链教程
- 区块链 - 首页
- 区块链基础
- 区块链 - 简介
- 区块链的历史
- 区块链 - 技术
- 区块链与密码学
- 区块链超越加密货币
- 区块链 - 高级概念
- 区块链 - 去中心化
- 区块链 - DApp
- 区块链 - DeFi
- 区块链 - 未来展望
- 区块链中的智能合约
- 区块链 - 里卡迪安合约
- 区块链 - 预言机
- 区块链 - DAO
- 比特币
- 比特币 - 无形的黄金
- 比特币是如何运作的?
- 比特币 - 网络
- 比特币 - 钱包
- 比特币 - 创新
- 以太坊
- 以太坊替代加密货币
- 以太坊生态系统
- 以太坊虚拟机
- 高级以太坊
- 以太坊钱包
- 以太坊矿工节点
- 其他
- 区块链 - 双重支付
- 公钥密码学
- 区块链 - 哈希
- 比特币 - 挖矿
- 区块链 - 区块链
- 区块链 - 工作量证明
- 区块链 - 网络与挖矿
- 区块链 - 矿工激励
- 区块链 - 梅克尔树
- 区块链 - 支付验证
- 区块链 - 解决冲突
- 区块链 - 隐私
- 比特币 - 缓解攻击
- 区块链 - 结论
- 区块链资源
- 区块链 - 快速指南
- 区块链 - 资源
- 区块链 - 讨论
比特币网络
比特币网络作为一个点对点 (P2P) 系统运行,节点参与交易活动。这些节点负责验证和传播交易和区块。其中,矿工是创建新区块的专门节点。该网络包含各种类型的节点,主要分为两类:完整节点和简单支付验证 (SPV) 节点。
完整节点使用比特币核心客户端软件,处理钱包功能、挖矿、完整区块链存储和网络路由。但是,并非比特币网络中的每个节点都需要执行所有这些角色。SPV 节点或轻客户端仅专注于钱包操作和网络路由。
识别比特币网络
比特币网络以其独特的魔术值为特征,用于表示消息的源网络。下表列出了这些值:
一个完整的比特币节点执行四个功能。分别是钱包、矿工、区块链和网络路由。我们已经在前面的章节中讨论了挖矿和区块链。在这里,我们从比特币网络继续之前的内容。
比特币网络中的协议消息
目前有几种不同的协议消息类型,随着协议的发展,这种类型的数量可能会增加。以下是最常用的协议消息及其描述的列表:
- 版本 - 此初始消息由节点发送到网络,指示其版本和区块数量。远程节点以相同的信息进行响应,建立连接。
- Verack - 此消息确认版本消息并接受连接请求。
- Inv - 节点使用此消息来宣布它们知道哪些区块和交易。
- Getdata - 此消息是对 inv 的响应,请求由其哈希标识的特定区块或交易。
- Getblocks - 这将返回一个 inv 数据包,其中包含从最后一个已知哈希开始或最多 500 个区块的所有区块的列表。
- Getheaders - 此消息请求指定范围内的区块头。
- Tx - 这用于在响应 getdata 协议消息时传输交易。
- Block - 此消息在回复 getdata 协议消息时发送区块。
- Headers - 此数据包可以作为对 getheaders 请求的响应返回多达 2,000 个区块头。
- 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。
布隆过滤器主要由简单支付验证 (SPV) 客户端用于请求特定交易和相关的Merkle 块。
Merkle 块作为区块的紧凑表示,包含区块头、几个哈希、一个 1 位标志列表和交易计数。此数据可用于构建Merkle 树。过滤器经过定制,仅匹配 SPV 客户端已请求的那些交易和区块。在交换版本消息并在对等节点之间建立连接后,节点可以根据其特定需求配置过滤器。