bnet_plugin 提供了一个 P2P 协议,使用一个非常简单的算法持久地同步两个区块链:
- 找到远程对等端知道的本地链上的最后一个块 ID
- 如果我们有下一个块发送给他们
- 如果我们没有下一个块,则向他们发送最旧的未到期事务
有几个输入事件:
- 当地链接受的新区块
- 被当地链认为是不可逆转的
- 本地链接受的新块头
- 本地链接受的交易
- 从远端收到的块
- 从远端收到的事务
- 套接字准备下次写
每个会话都负责维护以下内容
- 我们当前最好的链条上的最新块,我们确切地知道远端有。
- 这可能是节点最后不可逆转的区块
- 对端通知我们的 LIB(last irreversible block)之后的块 ID
- 我们发送给远端的区块
- 对端发给我们的一个区块
- 我们从远端收到的块 ID,以便我们可以断开对端,如果其中一个块被认为是无效的
- 一旦区块变为可逆,我们就可以清除这些 ID
- 我们从远端收到的交易,以便我们不向他们发送他们已经知道的东西。
- 这包括作为区块的一部分发送的事务
- 我们在应用了包含事务的块之后清除了这个缓存,因为我们知道控制器不应该再次通知我们(它们会被欺骗)
假设
- 我们发送给对端的所有块都是有效的,并且将保存在节点分叉数据库中,直到它们变得不可逆转或被不可逆转的替代方案替换。
- 我们不关心对端处于哪个分叉,只要我们知道他们有早于我们想发送的区块。对端将使用其分叉数据库对其进行排序,并得出和我们一样的结论。
- 对端将以相同的基础向我们发送区块。