主页 > imtoken用什么id下载 > 深入比特币原理(七)——比特币节点通信
深入比特币原理(七)——比特币节点通信
本节主要介绍比特币节点接入比特币网络的过程以及节点之间的通信过程。
一、比特币节点连接建立
比特币节点接入比特币网络的步骤如下。以新节点的接入为例,老节点维护和建立连接的方法与以下步骤相同:
1.在比特币网络中寻找有效节点成为比特币的一个节点,这一步通常有两种方法:
(1)使用“DNS种子”。DNS种子提供了比特币节点的IP地址列表。Bitcoin Core客户端提供了五种不同的DNS种子,通常默认使用。
p>
(2)通过-seednode命令手动指定一个比特币节点的IP地址作为比特币种子节点。
2.与发现的有效比特币节点进行初始“握手”以建立连接
节点发送包含基本认证内容的版本消息,开始“握手”通信过程。该消息包括以下内容:
nVersion:客户端比特币P2P协议使用的版本(eg:70002)
nLocalServices:该节点支持的本地服务列表,目前仅支持NODE_NETWORK
nTime: 当前时间
addrYou:当前节点可见的远程节点的IP地址(上例中NodeB IP)
addrMe:当前节点的IP地址(上例中NodeA的IP)
subver:表示节点上当前运行的软件类型的subversion号(例如:“/Satoshi:0.9.2.1/”)
BestHeight:当前节点区块链的区块高度(初始为0,即仅包含创世区块)
3.新节点建立更多的连接,使节点可以被网络中更多的节点接收,保证连接更稳定
(1)向连接的节点发送一个包含自己IP地址的addr,这些节点收到后会转发给各自连接的节点,这样网络中更多的节点可以接收到新的节点
(2)发送 getaddr 消息,要求连接的节点返回其已知节点 IP 地址列表,这样节点可以找到更多要连接的节点。
(3)已经建立连接的节点会周期性的发送信息来维持连接。如果一个节点90分钟没有通信,就会被认为断开连接,网络会开始寻找新的节点.
p>
每个节点连接的对等节点不超过 1000 个,超过数量的 IP 地址将被忽略。连接太多节点会浪费网络资源,没有必要。
用户可以指定 -connect 选项来指定一个或多个 IP 地址。如果设置了这个选项,节点只会连接到选项中的地址,不会自动发现和维护节点之间的连接。
启动完成后成为比特币的一个节点,节点会记住最近连接成功的节点,重启后可以快速与上一个节点重新连接。如果之前的节点无法连接,则从第1步重新开始。
4.交换“阻塞列表”(注意:此步骤只会在全节点上执行,从与节点建立连接的那一刻开始)
全节点连接其他节点后,需要构建完整的区块链。如果是新节点,则只包含静态植入客户端的block 0(创世块)。
(1)可以通过version消息中的BestHeight字段知道两个节点的区块高度,然后节点之间交换一个getblocks消息,里面包含了本地区块链top block的hash ,这样节点就可以判断谁的链长了。
(2)链长的节点识别出其他节点需要“补充”的区块,开始批量发送区块(500个区块为一批),第一个区块通过inv 消息,向对端节点发送一批块列表(inv 消息包含 500 个块的哈希列表),限制每次同步块的数量是为了减少同步块时新节点对网络的影响。
(3)有缺失块的节点发送getdata消息向所有连接的节点请求完整的块数据。“传输”块的数量不能超过客户端的MAX_BLOCKS_IN_TRANSIT_PER_PEER参数设置的值。
目前运行全节点,需要150G以上的磁盘空间,同步时间一般需要3-5天左右。
二、简化支付验证 (SPV) 节点
从上面可以看出,运行全节点会消耗大量的存储空间,并不是所有的设备都有资格成为全节点。简单支付验证 (SPV) 就是在不存储完整区块链的情况下工作。
SPV节点只需要下载区块头,大小仅为全节点的1/1000左右。
全节点交易验证方式
全节点沿着区块链逆时回溯到创世区块,建立完整的UTXO数据库,通过查询UTXO是否还没有支付来验证交易的有效性。
SPV节点交易验证方式
SPV 节点向其他节点请求交易的 Merkle 路径(Merkle 树将在后面的章节中详细解释)。如果路径正确,并且交易已经被 6 个或更多区块确认,则证明该交易不是双花。
SPV 节点通信
SPV 节点使用 getheaders 消息而不是 getblocks 消息。收到请求的节点会使用headers消息向请求节点发送2000个block headers,不断循环直到block headers同步。
注意:SPV 通信会产生隐私风险。由于 SPV 节点总是通过广播选择性地验证交易,因此用户的比特币地址和钱包很容易关联,因此在使用 SPV 节点时需要进行布隆过滤。设备。布隆过滤器的作用是要求发送验证信息的节点发送一批交易信息而不是某个交易,然后SPV节点自己会过滤需要的信息,从而保证验证的具体交易无法被追踪.
关于Bloom过滤器的详细解释,请参考以下网址:
三、交易池
交易池:比特币网络节点用于存储网络已知但尚未记录在区块链中的交易,存储在本地内存中。
孤儿池:如果一笔交易的输入与当前节点未知的交易相关联(即没有找到父交易),将暂时存放在孤儿交易池中。当节点收到交易的相关交易(父交易)时,该交易将被移入交易池。孤立的事务池存储在本地内存中。
UXTO池(UTXO pool):区块链中所有未支付交易输出的集合,可以存储在本地内存中,也可以作为数据库表存储在存储设备中
交易池和孤儿交易池包含未确认的交易,而 UTXO 池包含已确认的交易。
引用:
[1]Andreas M. Antonopoulos,掌握比特币(第二版)
加入知识星球,与 HWer 一起成长
更多好文章,请关注并查看历史新闻