Hyperledger Fabric是由Linux Foundation托管的业务区块链项目。它是一个“分布式总账解决方案平台,以模块化架构为基础,提供高度机密性,弹性好,灵活性和可扩展性。它旨在支持不同组件的可插拔实现,并适应整个经济生态系统中存在的复杂性和复杂性。“
我开始研究这项技术,作为探索区块链解决方案的PoC的一部分。Hyperledger Fabric有很好的文档,并有详细的入门教程。但是,它错过了分布式系统实现(在多个主机上部署)的最重要指南,这是分布式系统的本质。
是的,没有教程或指南可以帮助你跨多个主机部署网络。许多人在同一问题上围绕不同的论坛挣扎。我决定首先研究现有的样本,以了解超级分类网络的不同组件如何能够在单个主机上进行通信。
先决条件
本教程要求你首先从Hyperledger教程中关注Build You First Network。这是了解它如何连接并在单一主机模式下工作的重要步骤。此外,它还安装了对本教程非常重要的所有必要的先决条件和依赖项。
如果你想跳过上述教程并想要尝试这一点,则必须安装以下所述的所有先决条件:
在我们开始之前,如果你还没有这样做,你可能希望检查你是否已在将要开发区块链应用程序和/或运行Hyperledger Fabric的平台上安装了所有先决条件。
你还需要下载并安装Hyperledger Fabric Samples。你会注意到fabric-samples存储库中包含了许多样本。我们将使用第一个网络样本。我们现在打开那个子目录。
在安装了上述先决条件之后,在继续之前,让我们了解网络如何在单个主机上运行…
它如何在单个主机上运行…
Hyperledger Fabric依赖于基于docker的架构,超级分类网络的所有组件都在单独的容器中运行,而不能看到相邻的容器。为了使它们彼此通信,它们创建了一个网络,每个容器都附加到它上面。你可以在fabric-samples repo中“First Network”下的docker-compose-cli.yml中找到它。你会发现在docker-compse-cli.yml文件的开头,创建了网络byfn
,然后所有容器都将自己附加到刚刚创建的网络上。
默认情况下,Compose为你的应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以在与容器名称相同的主机名上发现。
它将如何适用于多主机…
但是当我们跨多个主机工作时,容器无法相互通信。简而言之,我们需要找到一种方法来跨多个主机(PC)共享此网络(所有容器连接到的网络)。我猜测它可以通过使用docker swarm来实现。我找到了:
覆盖网络驱动程序在多个Docker守护程序主机之间创建分布式网络。该网络位于(覆盖)顶部,特定于主机的网络允许连接到它的容器(包括群服务容器)安全地通信。Docker透明地处理每个数据包与正确的Docker守护程序主机和正确的目标容器的路由。然后我的着眼点落在这里。
我开始合并这些碎片并经过一些反复试验,我能够把它拉下来。要做到这一点,你需要
- 首先初始化docker swarm模式(假设在PC 1上)。
- 并使所有其他主机加入该群体作为
manager
(让我们说PC 2,PC3 …)。 - 创建一个超级网络,以便它可以在所有其他主机上共享。(其他主机可以看到网络的原因是它们是群组的一部分)
由于这是一个分布式系统,因此你需要多个主机(在我们的示例中为两台计算机)来验证该技术的分布式特性。假设你有两台PC,即PC1和PC2。
本教程仅适用于Linux,为什么?
目前,你无法单独使用Docker for Mac或Docker for Windows来测试多节点群。
网络拓扑结构
因此,我们要构建的网络将具有以下组件。对于这个例子,我们使用两台PC(PC1和PC2):
-
- 证书颁发机构(CA)—— PC1
-
- Orderer —— PC1
-
- 1 PEER(peer0)on —— PC1
-
- 1 PEER(peer1)on —— PC2
-
- CLI on —— PC2
在拓扑图里:
在你开始之前
- 初始化一个群:( docker swarm文档获取更多信息)
$ docker swarm init
- 加入swarm与其他主机作为经理(PC1将创建swarm,PC2将加入它)
PC1:
$ docker swarm join-token manager
它会输出这样的内容:
docker swarm join — token SWMTKN-1–3as8cvf3yxk8e7zj98954jhjza3w75mngmxh543llgpo0c8k7z-61zyibtaqjjimkqj8p6t9lwgu 172.16.0.153:2377
我们将复制它(终端上的那个,而不是上面的那个)并在PC2终端上执行它以使其加入PC1
在PC2上使用上一个命令的输出命令
- 创建一个网络(在我的情况下为
my-net
)——PC1
$ docker network create --attachable --driver overlay my-net
- 在两台PC上克隆这个repo,即PC1和PC2。
$ git clone https://github.com/wahabjawed/Build-Multi-Host-Network-Hyperledger.git
- 生成网络工件(加密资源)——PC1
$ cd Build-Multi-Host-Network-Hyperledger/
$ ./bmhn.sh
这将在crypto-config
和channel-artifacts
文件夹中为你生成网络工件。你必须在PC2上复制这些文件夹,以便两个项目都具有相同的加密资源。重要的是,