区块链设计模式系列之一:对等网络
Posted CITAHub 开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链设计模式系列之一:对等网络相关的知识,希望对你有一定的参考价值。
继上一篇《》后,志伟再度为云原生区块链框架 CITA-Cloud 磨好剑。在探究技术的过程中,志伟对区块链设计模式深有感触。为了让大家更好的理解云原生区块链 CITA-Cloud 的设计理念,志伟写下了该系列的第一篇文章「对等网络」。在本文中,志伟详细解读了区块链设计中的常见模式,把非对等形态的软件变为对等形态。
https://talk.citahub.com/t/topic/1803
CITA-Cloud 的设计理念是尽量复用现有软件或者库来搭建区块链系统。但是区块链系统和传统的软件最大的区别:区块系统是一个对等网络,而传统软件一般都是 C/S 或者 Master/Slave 形态。
所以在区块链设计中常见模式,是将非对等形态的软件变为对等形态。比较简单的做法是所有节点作为 Server,同时又作为其他节点的 Client。比如,CITA-Cloud 网络微服务的实现:
GitHub - cita-cloud/network_direct [1]
以及现有 CITA 的早期直连网络实现。我们可以认为把系统自带的网络库所提供的 Server/Client 形态的功能转换为对等网络。
该方案在实现上较简单,问题是生成配置文件,以及后续增加删除节点时修改配置文件。生成配置文件可以参见 CITA-Cloud 中生成网络的配置文件:
runner_k8s/create_k8s_config.py at master · cita-cloud/runner_k8s · GitHub [2]
以及前提是需要提供已知所有节点的 ip 和 port 信息。我们可以通过遍历所有 peers,为每个 peer 生成一个 net_config。port 是本节点的监听端口,用于启动 Server,而 peers 则是除自己之外其他节点的信息,用于本节点作为 Client 去连接其他节点。
因为,需要所有节点信息才能生成对应的配置文件,所以需要集中统一生成,但是对于联盟链来说问题不大,这些信息可以认为是对内公开的。同样,增加删除节点式,涉及到所有配置文件的修改,需要集中修改,才能生成新的配置文件,然后下发到所有节点。
此外,还有一个例子是 GitHub - cita-cloud/controller_poc [3]。其中,同步模块使用了 Syncthing。Syncthing 是一个文件同步工具,默认情况下是 Master/Slave 形态。我们也可以通过类似的方式,实现了一个对等模式的同步网络,任何一个节点增加的文件都会同步到其他节点去。
生成配置文件的代码参见:
runner_k8s/create_k8s_config.py at master · cita-cloud/runner_k8s · GitHub [4]
如果要解决这种集中生成/修改配置文件的情况,网络部分就需要 P2P 网络库。其本质上是与上述解决方案类似,只是节点间会相互转发配置信息。这样新增或者删除节点,只要发送相应的配置命令到任意一个节点上,该节点就会将相应的变动转发给其他节点。一开始搭建网络时,在有多个初始节点的情况下,我们也可以转换为初始只有一个节点,其他节点都视为是动态新增的方案。
这个对于公链来说,这样的无权限区块链系统来说非常有必要。但是对于联盟链这样有权限的区块链系统来说,必要性则没有那么强。即便可以方便的动态增加删除节点,依然需要一个中心化的地方来修改相应的鉴权信息。比如用证书来实现节点网络的准入,那么增加/删除节点肯定需要在对应的 CA 处先颁发或者吊销相应节点的证书。
在另一种情况下,还有一种解决方案是选出一个 leader,依然采用 Master/Slave 的形态。Slave 节点也接收请求并转发给 leader,就像 Raft 和 Paxos 的区别,Raft 是 leader base 的一致性算法,而 Paxos 是无 leader 的。Paxos 的每个节点都可以处理客户端请求,Raft 只有 leader 节点可以处理客户端请求。但是 Raft 的 Slave 节点也可以接收客户端请求,然后内部转发给 leader 节点去处理,让表面看起来像是个对等网络。
P2P网络分为两大类:非结构化和结构化。参见:
P2P综述 - lotushy - 博客园 (cnblogs.com) [5]
非结构化一般采用gossip的方式传播信息,前面所述的全链接可以算是gossip的一个特例。结构化一般采用 分布式散列表(DHT)方式,后面讲的 Master/Slave 加转发,可以认为是结构化方案的一个特例。
https://talk.citahub.com/t/topic/1803
银河系漫游指南
参考链接:
[1]https://github.com/cita-cloud/network_direct
[2]https://github.com/cita-cloud/runner_k8s/blob/master/create_k8s_config.py#L96
[3]https://github.com/cita-cloud/controller_poc
[4]https://github.com/cita-cloud/runner_k8s/blob/master/create_k8s_config.py#L650
[5]https://www.cnblogs.com/lotushy/p/9085642.html
以上是关于区块链设计模式系列之一:对等网络的主要内容,如果未能解决你的问题,请参考以下文章