比特币的节点分为好多种,但是功能都是钱包、矿工、完整区块链以及网络路由节点组成。

之前和同学在开节点的时候,好多地方思路没有理清楚,现在结合看书学习,记录一下。

功能

比特币的全节点这四种功能通常是全部都拥有的。也就是可以进行 1. 钱包:可以实现用户的交易操作 2. 矿工:将交易打包入区块 3. 完整区块链:记录区块链网络中的所有区块信息,可以进行完全的溯源 4. 网络路由:将其他客户端的信息进行转发,为其他节点提供接入网络所需的节点信息

启动

全节点,或者其他类型节点启动的时候都是需要连接到整个区块链网络的,但是如何接入呢? 目前的区块链节点大部分提供了两种方式。 1. 通过种子节点接入网络 2. 用户手动指定一个区块链节点地址

其中第一个的种子节点是在区块链网络中长期稳定运行的一些节点,客户端维护着这个信息列表。如果区块链节点连接到某个种子节点的话,可以很容易的发现其他的节点,并接入到区块链网络。 但是,也是存在一定的弊端,如果种子节点涉嫌作恶,或者离线,用户也可以指定一个具体节点的地址,连接到该节点接入到区块链网络。

接入

接入到网络之后,节点需要被其他的节点所发现,通常会有以下几点。 首先,节点发送一条关于自己的addr信息,发送给自己连接的节点N,节点N会将addr信息转发给它的相邻节点,这样新节点的信息可以被多个节点所接收,连接可以更稳定。 其次,节点还可以向N请求N的相邻节点。N将他自身的相邻节点信息转发给新节点。即使N离线或者出错,新节点依然可以找到需要的对等节点,保证稳定的连接。

功能

从以上内容我们可以发现节点需要实现的主要功能 1. 断开连接后发现新的节点 2. 为新节点提供帮助 3. 心跳

但是,为了降低网络的负担,一个节点A只需要保持和其他一个节点B的连接即可。这样这一个节点B可以将A的信息转发给其他的节点,可以保证A一定会被较多的节点发现。 除此之外,如果A不幸离线,再次上线是直接和B相连即可,如果无法连接,再通过记录的相邻节点信息接入到网络。 为了保证节点之间的连接,节点之间会有心跳机制,定期发送消息保持连接。如果一个节点长期(90分钟)没有通信,可以理解节点已经离线,节点需要建立新的连接。

全节点

全节点指具有上面4种功能的节点,这些节点具有完整的、最新的包含全部交易的区块数据。因此,这些节点可以进行独立的教研区块,计算交易内容。只不过,缺点是目前主网数据已经达到20多G,由于需要校验,因此同步数据会比较慢。

同步过程

一个新的节点$new$会首先发送一个version消息,因为这个里面包含节点的区块高度信息,可以判断本节点的区块的新旧。 如果本节点发现信息比别的区块新,会将新的可供分享的500个区块哈希打包成(inventory)信息发送给其他节点。其他节点会发送请求,获得区块,与inv中的哈希进行对比,写入本地区块链。 为了防止网络拥堵,缺少区块的节点可以将请求分散到不同的节点上获取区块,一方面减少了网络拥堵,另一方面也能加快自身的区块获取速度。

结束

以上是节点的部分功能,还有些轻节点的功能并未提及。以后会继续深入学习。