主页 > imtoken限制中国用户该咋办 > 比特币P2P网络协议.docx

比特币P2P网络协议.docx

比特币的P2P网络协议 比特币的P2P网络协议转载请注明出处:by joey 1. 五层网络模型 网络的五层模型可以分为:物理层、数据链路层、网络层、传输层、应用层。 物理层:网络的实际物理介质,同轴电缆、双绞线、光纤等。 数据链路层:可以理解为局域网内部的通信,基于MAC地址。 其中,以太网是局域网最常用的通信协议标准。 网络层:也叫IP层,负责不同网络之间的通信,有一个叫做“网关”的设备负责网络之间的数据转发。 传输层:在网络层的基础上,增加了端口号来区分不同的应用。 就是建立“端口”到“端口”的通信。 Unix 系统将主机+端口称为“套接字”。 典型的传输层协议包括 TCP 和 UDP。 点击查看“TCP的三次握手和四次挥手”——握手和挥手分别对应“连接建立”和“断开”。 应用层:应用层的作用可以理解为规定应用程序使用的数据格式。 例如http协议、ftp协议、p2p协议等。比特币采用的应用层网络协议是p2p协议。 2. P2P 点对点通信需要克服的障碍 通信协议属于应用层协议,实现方式有很多种。 比特币的网络协议是P2P协议,建立在TCP协议8333端口上进行通信。

由于历史原因,要实现点对点通信,必须解决NAT地址转换带来的问题。 STUN算法就是解决这个问题的算法之一。 具体原理可以参考我写的另一篇文章《P2P网络节点之间如何交互——STUN NAT穿透详解》。 解决了点对点通信的问题后,我们再来看看比特币的P2P网络协议的协议细节: 3、以下比特币的P2P网络协议内容主要翻译自《比特币维基百科——网络》 1、消息type: ● version 相关程序 版本号、块数等信息。 用于首次建立连接时节点间交换信息 ● verack 节点收到version消息后,如果节点愿意连接,可以通过回复verack消息来确认。 ● addr 列出一个或多个IP 地址及其对应的端口号。 ● inv 库存清单,取“inventory”的前3个字母。 “我有这些块/交易:...”,inv 消息通常在转发新块或交易时发送。 它只是一个列表,不包括实际交易数据。 ● getdata 通过哈希值请求单个块或交易。 节点收到邻居节点的getdata消息后,向邻居节点返回tx消息或block消息。

比特币协议数量上限是多少_以下哪种是比特币运用的p2p协议_狗狗币是下一个比特币

• getblocks 请求inv 清单中的所有块。 ● getheaders 请求获取指定范围内区块的区块头信息。 ● tx 发送交易。 它仅用于响应 getdata 请求消息。 ● block 发送块。 如上,仅用于响应getdata请求消息。 ● headers 发送区块头消息,一次最多发送2000个区块头。 非“全节点”(如SPV节点)可以使用它来下载区块头信息,而不是下载完整的区块信息。 ● getaddr 包含一些已知的活动节点。 用于请求addr消息获取活动节点的IP和端口号。 它通常在新节点刚加入网络初始化(引导)时调用。 ● submitorder、checkorder、reply 这些消息只在“IP-based transaction”比特币版本中使用,因为容易受到“man-in-the-middle attacks”,所以“IP-based transaction”功能在v0.8.0 版本的比特币核心已被删除。 ● alert 发送网络警报。 ● ping 不执行任何操作。 它仅用于检测网络连接是否仍然有效。 如果连接失败,会报TCP异常。 2. 网络初始化和启动——节点发现(Bootstrapping) 节点有一个可以连接的节点地址簿。 这个通讯录是按照节点上次获得它的时间排序的,并加入了一些随机处理。

狗狗币是下一个比特币_以下哪种是比特币运用的p2p协议_比特币协议数量上限是多少

在加入比特币网络之前,将根据地址簿中的地址顺序选择节点建立连接。 比特币有3种网络节点发现方式: (1) 从IRC v0.6.x开始,比特币客户端默认不再支持IRC节点发现,从v0.8.2开始,IRC节点发现机制被彻底删除。 以下信息仅适用于旧版本的比特币客户端:比特币加入 IRC 网络上的随机频道(#bitcoin00 和#bitcoin99 之间的频道号)。 节点的昵称是根据 IP 地址编码的。 通过解码这些通道中的昵称,节点可以获得当前连接到比特币网络的节点地址列表。 由于IRC的标准端口是6777,如果节点主机没有该端口的出口通信,则ifnet服务器同时也在监听7777端口。 (2) addr 本文中提到的addr消息广播,其实现的网络节点发现效果类似于IRC方式。 当一个新节点加入比特币网络时,其他节点可以相当快地发现它,尽管当一个节点离开时,其他节点可能暂时不知道。 比特币有许多被称为“种子节点”的地址。 如果无法通过IRC连接,并且之前从未连接过比特币网络,则客户端通过连接到种子节点列表中的节点来更新网络节点地址簿。

比特币协议数量上限是多少_狗狗币是下一个比特币_以下哪种是比特币运用的p2p协议

可以通过 addnode 命令行参数手动添加节点。 addnode 命令行参数强制比特币网络连接到指定节点。 (3) DNS Bitcoin解析查询服务器域名得到的IP地址以下哪种是比特币运用的p2p协议,加入到潜在地址列表中。 这是默认的种子节点发现机制,适用于 v0.6.x 及之后的比特币版本。 3、连接到比特币节点建立连接过程比特币节点建立连接过程如上图所示。 节点B在比特币网络中,节点A通过节点B建立连接,完成加入比特币网络的第一步。 通信过程如下:节点A通过发送版本消息与比特币网络中的节点B建立连接。 该版本消息包括“版本号”、“区块号”和“当前时间”。 如果远程节点B收到并同意根据节点A的版本信息建立连接,节点B将返回一个verack确认消息和另一个自己版本的消息给节点A。如果节点A同意建立连接基于远程节点B发送的version消息,节点A还需要回复一个verack确认消息给远程节点,节点B收到确认消息。 此时,节点A已经与节点B建立了连接。

比特币协议数量上限是多少_狗狗币是下一个比特币_以下哪种是比特币运用的p2p协议

所有连接到节点A的远程节点的时间数据都会被收集起来,所有使用时间参数的网络任务都使用上述接收到的时间的中位数作为自己的时间参数(除非是不同版本的消息)。 获取网络节点的地址 获取网络节点的地址 接下来,您通过交换 getaddr 和 addr 消息来存储所有您不知道的地址信息。 addr报文一般只包含一个地址,但有时会包含多达1000个地址,这通常发生在信息交互的初始阶段。 4.消息转发交易发送流程如果比特币网络中的一个节点要发送交易,它会先向它的所有邻居节点发送一个包含该交易的inv消息。 这些邻居节点将通过发送 getdata 消息来请求 inv 中所有交易的完整信息。 当这些邻居节点收到交易的完整信息并验证这是一笔有效交易后,邻居节点将各自发送inv消息给自己的邻居节点,依此类推。 节点收到交易信息后,只有确认自己之前没有收到过这些交易,节点才会转发收到的交易。 节点永远不会转发之前已经收到的交易,尽管这些交易可能会在一段时间后被“遗忘”,因为它们没有被记录在区块中。 但是,交易的发送节点和接收节点将重新广播这些被遗忘的交易。

以下哪种是比特币运用的p2p协议_狗狗币是下一个比特币_比特币协议数量上限是多少

任何接收到有效交易的节点都会尝试将它们包含在“块”(我的)中。 当一个节点找到一个区块(控制矿场)时,它们将向其邻居节点发送包含区块信息的 inv 消息。 通信过程与上述“交易”的转发过程相同。 addr message broadcast message broadcast 所有节点每24小时广播一次包含自己IP地址的addr消息。 收到消息的节点将这些addr消息转发给它的邻居节点,如果addr中的地址是一个新地址,则该节点会将地址信息存储在addr消息中。 通过这样一个系统,所有的节点都会有一个相当清晰的视图:比特币网络中当前连接了哪些IP地址。 当一个新节点连接到比特币网络时,它几乎会立即通过发送地址消息广播添加到所有其他节点的地址簿中。 比特币中的网络警报是通过发送警报消息来完成的。 不同于inv brief信息首先发送的交易和区块信息,告警消息将包含所有需要告警的内容。 警告消息由网络中的节点在使用其私钥签名后发送。 如果其他节点收到此警告消息并通过验证,则将其转发给所有其他节点。 只要警告保持有效,每当有新节点加入比特币网络时,警告消息就会立即广播。 5.初始块下载 从邻居节点获取块 从邻居节点获取块 当你通过一个节点建立连接并加入比特币网络时,你需要将你知道的最新块的哈希值放入getblocks消息体中并发送到你的邻居节点。

如果邻居节点会收到getblocks消息,识别出你给的hash对应的块不是最新的块,邻居节点就会给你发送inv消息,里面包含你发送的hash对应的块。 前一个区块信息(最多 500 个区块)。 然后当你收到env消息时,你向邻居节点发送一个getdata消息,根据env中列出的区块信息获取每个对应的区块。 邻居节点收到getdata消息后以下哪种是比特币运用的p2p协议,会发送一个区块消息给你返回区块的完整信息。 当你下载并处理完所有这些块后,你可以再次发送 getblocks 消息,依此类推,直到你拥有所有网络中的所有块。 6. 瘦(轻)SPV 客户端 SPV 轻(瘦)客户端获取中本聪论文中提到的SPV(Simple Payment Verification)区块头,比特币初始版本中没有加入。 特征。 BIP 0037 介绍了通过 SPV 实现的比特币瘦(轻)客户端。 当需要验证区块链中的交易是否真实存在并被确认时,SPV客户端不需要下载完整的区块内容,而是依赖区块头组成的区块链(通过发送getheaders消息并返回headers Message获取)和bloom filter从其他节点获取相应的校验数据,完成上述校验。

这种SPV轻客户端可以与安全级别较低的全节点进行通信,但是是以牺牲一些隐私为代价的,因为其他节点可以推断出SPV节点正在寻找的信息对应的地址。 PS:布隆过滤器允许 SPV 节点指定交易的搜索模式,可以根据准确性或隐私方面的考虑进行调整。 一个非常具体的布隆过滤器会产生更准确的结果,但也会显示用户钱包中使用过的地址; 反之,如果过滤器只包含简单的关键字,则会搜索到更多对应的交易,在包含几笔无关交易的同时具有更高的隐私性。 MultiBit和Bitcoin Wallet是两个基于bitcoinj实现的比特币钱包,实现了上述SPV客户端的特性。 7. Heartbeat 当一个节点超过30分钟没有发送新消息时,它会发送一条消息来维持与它的邻居节点的连接。 当一个节点超过或等于90分钟没有发送新消息时,邻居节点会认为它已经关闭了连接。参考资料互联网协议简介(一)比特币维基百科-网络深入理解区块链第5部分: 比特币网络