# 有关区块链和网络安全的事实

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-19

---

随着因特网的发展，其用户规模、应用数量以及带宽都在快速增长。在过去的几年中，智能设备这种新的用户载体已进入因特网世界。它形式多样、由简入繁，可以简单至冰箱、空调或微波炉，也可以像无人机或自动驾驶车辆一样精密。这些智能设备统称为物联网（IoT）设备，用于掌控实用程序的功能和联网运作。有足够多的案例证明，攻击者正在利用物联网设备发起一些称为分布式拒绝服务（DDoS）攻击的大规模网络攻击。在本章中，你将了解DDoS攻击，学习区块链帮助企业组织抵御如此大规模的网络攻击的部署操作。

DDoS攻击具有恶意企图，通过来自地理位置分散的系统发送大量请求来扰乱服务器的合法流量，阻碍正常用户访问。现在，让我们首先了解拒绝服务（DoS）攻击的工作原理。在DoS攻击期间，攻击者通过大量请求轰炸目标计算机，导致服务器资源耗尽，从而导致合法用户的请求失败。在DoS攻击中，攻击者使用单台机器进行攻击来耗尽目标服务器资源。相比之下，DDoS攻击威力更加强劲，因为可以使用多至数百万台计算机来使目标服务器应接不暇。

越来越多的企业组织正在将自己的应用服务迁移到具有大量基础设施的云端，以满足其海量客户的实时需求。企业可以构建自己庞大的云服务器基础设施，也可以迁移到云服务提供商提供的服务器上。今天，攻击者更喜欢用DDoS攻击方法来破坏目标服务，因为他们可以生成GB甚至TB级的随机数据来轰炸目标受害者，并且目标安全团队也难以识别和拦截每个攻击源，因为它们在数量上可能是数百万计的。

此外，攻击者永远不会合法地控制他们的攻击源机器，而是通过一些精心设计的恶意软件感染全球数百万台计算机，获得完全访问权限然后控制其发动大规模DDoS攻击。这些受感染的计算机的集合称为僵尸网络（botnet），而单个受感染计算机被称为僵尸节点（bot）。

虽然难以明确追溯到世界上的首次DDoS攻击事件，但第一次引人注目的DDoS攻击发生在1999年，针对的是明尼苏达大学。它影响了220多个系统，并使整个网络设施宕机了好几天。

2016年10月21日星期五，整个世界目睹了针对Dyn（托管DNS提供商）的最复杂的DDoS攻击的发生。Dyn确认Mirai僵尸网络是恶意攻击流量的主要来源。这次攻击开启了对因特网安全和威胁态势的新关注。

要发起DDoS攻击，黑客可以自行构建整个僵尸网络，也可以从暗网租用僵尸网络资源。一旦攻击者准备好武器，他们只需要去发现易受攻击的站点、主机或者整个网络。

洛克希德–马丁公司（Lockheed-Martin）的一位计算机科学家提出了一个名为网络杀伤链的术语，它阐述了从侦察到最终攻击目标开始的整个网络攻击阶段。这些阶段包括：

·侦察：攻击者识别目标设备并开始搜索其中的漏洞。

·武器化：攻击者使用远程工具包和恶意软件（病毒或蠕虫）来针对漏洞发起行动。

·恶意代码传播：攻击者通过发送网络钓鱼邮件、秘密下载、USB设备、内部人员协助等多种方法将攻击代码注入受害者网络。

·漏洞利用：恶意代码用于触发攻击，对目标网络采取措施以利用漏洞。

·安装：恶意软件自动安装在受害者计算机中。

·命令与控制：恶意软件给予远程攻击者访问受害者机器的控制权限。

为了从DDoS角度理解每个阶段，了解僵尸网络基础设施及其构建方式对我们来说非常重要。

1.构建僵尸网络

DDoS攻击的分布式特性需要利用全球数百万台受感染的计算机。今天，攻击者可以利用暗网租用或购买那些随时可用的僵尸网络资源。有一些工具，如Jumper、Dirt和Pandore，实际上是降低甚至消除了攻击者构建这些僵尸网络的技术障碍。

下图描述了僵尸网络的整个生命周期：

2.侦察

遭受侦查的目标系统可以大到一整个数据中心，或小到一台计算机。在这两种情况下，僵尸网络的构建需要识别一些具有恶意软件可以攻击利用的漏洞的主机。攻击者查找与其目标直接或间接相关的信息，以非法访问那些受到保护的资产。攻击者会尝试所有可能的方法绕过现有的安全系统，包括防火墙、入侵防御系统（IPS）、Web应用防火墙和终端保护系统。

3.武器化

通过使用众多的开源软件资源，攻击者能够有效避免在构建恶意代码过程中遇到的技术障碍。如果程序员具有恶意企图并开发代码，就可能会开发出新的恶意软件，而安全系统最初很难检测到这些新的恶意软件。

以下是一些用于进行DDoS攻击的常用工具列表：

·低轨道离子炮（LOIC）：这是黑客组织anonymous最喜欢使用的工具之一。它是一个简单的泛洪工具，可以生成大量的TCP、UDP或HTTP流量来拥塞目标服务器。它最初是为测试服务器性能的吞吐量而开发的。然而，anonymous组织使用这个开源工具来发起复杂的DDoS攻击。该工具后来又增强了IRC功能，允许用户通过IRC控制连接系统。

·高轨道离子炮（HOIC）：在有效使用LOIC几年后，

2.侦察

遭受侦查的目标系统可以大到一整个数据中心，或小到一台计算机。在这两种情况下，僵尸网络的构建需要识别一些具有恶意软件可以攻击利用的漏洞的主机。攻击者查找与其目标直接或间接相关的信息，以非法访问那些受到保护的资产。攻击者会尝试所有可能的方法绕过现有的安全系统，包括防火墙、入侵防御系统（IPS）、Web应用防火墙和终端保护系统。

3.武器化

通过使用众多的开源软件资源，攻击者能够有效避免在构建恶意代码过程中遇到的技术障碍。如果程序员具有恶意企图并开发代码，就可能会开发出新的恶意软件，而安全系统最初很难检测到这些新的恶意软件。

以下是一些用于进行DDoS攻击的常用工具列表：

·低轨道离子炮（LOIC）：这是黑客组织anonymous最喜欢使用的工具之一。它是一个简单的泛洪工具，可以生成大量的TCP、UDP或HTTP流量来拥塞目标服务器。它最初是为测试服务器性能的吞吐量而开发的。然而，anonymous组织使用这个开源工具来发起复杂的DDoS攻击。该工具后来又增强了IRC功能，允许用户通过IRC控制连接系统。

下载到被新攻破的受害者系统中。下载完成后，脚本会自动在这个新的僵尸节点上启动新的攻击过程。整个攻击机制使用HTTP、FTP和远程过程调用（RPC）协议。在这种方法中，攻击者操作受害者机器，被攻破的系统会连接到攻击者的中央存储库，进而通过总中央库中下载恶意代码。如下图所示：

·反向链接传播：在此方法中，攻击者将工具包移植到新受感染的主机上。这个工具包被精心打造以接受来自受感染系统的文件传输请求。同时，反向通道文件复制的过程可以由一个端口侦听程序使用普通文件传输协议（TFTP）完成。与中央源传播方法不同，攻击者将漏洞利用和攻击代码一起传输到被攻陷的主机。如下图所示。

·自动传播：在这种机制中，当攻击者入侵系统时，他们的工具包将被拷贝到受感染的主机。这种机制在传输方法层面有所不同，因为攻击工具包首先仅由攻击者植入受感染的主机。在这种方法中，攻击者首先传输漏洞利用的攻击，然后传输来自他自己的代码，而非来自任何中央存储库。如下图所示：

5.漏洞利用

一旦恶意程序进入网络中，它就会发起对各种漏洞（包括未修补的软件漏洞、有缺陷的软件编程实践或用户疏忽）的利用。通常，网络中存在大量的漏洞，而它们的可利用性，使得漏洞本身更加致命。

6.安装

在安装阶段，恶意软件会锚定在目标系统中，从而允许远程攻击者访问它。在安装过程中，恶意软件可以植入系统的用户空间或内核空间中。安装在用户空间的恶意软件很容易被检测到。但是，内核空间中的恶意软件很少被安全系统（包括终端保护、终端检测和响应平台等系统）检测到。

7.命令与控制（C2）

在成功安装了入侵工具后，目标主机就完全由攻击者的远程中央系统控制。这些被入侵操控的设备的网络称为僵尸网络，被攻击者随意摆布。但是，僵尸网络节点在被攻击者激活之前一直保持休眠状态。在公共的对等网络上，甚至存在一些加密过的僵尸主机之间的通信。

8.对目标采取行动

一旦建立了C2通道，攻击者就可以对目标发起DDoS攻击。在此阶段，攻击者运行脚本以激活整个僵尸网络中的所有僵尸主机。攻击者还要配置僵尸网络，从而得知需要生成什么类型的攻击流量。

区块链是一个去中心化的网络，允许独立的各方在没有任何第三方参与的情况下进行通信。为了保护网络免受DDoS攻击，企业服务可以分布在多个服务器节点中，提供高弹性并消除单点故障。使用区块链的两个主要优点如下：

·区块链技术可用于部署分布式账本来存储列入黑名单的IP。

·区块链技术消除了单点故障的风险。

区块链的DDoS防御平台，首先需要使用以太坊区块链的Node.js和Truffle来准备测试环境。我们将使用一个现有的区块链项目来保护网络免受DDoS攻击。该项目可以在链接[https://github.com/gladiusio/gladius-contracts下找到。](https://github.com/gladiusio/gladius-contracts%E4%B8%8B%E6%89%BE%E5%88%B0%E3%80%82)

我们需要按照以下步骤为Gladius项目准备基础设施：

1）首先，我们将在系统环境中安装Node.js，链接地址为[https://nodejs.org/uk/download/package-manager/#arch-linux。](https://nodejs.org/uk/download/package-manager/#arch-linux%E3%80%82)

2）我们需要在测试环境中安装truffle：

3）在命令行中执行如下命令：

4）现在在命令行中执行如下命令来启动测试网络：

以下屏幕截图显示了运行上述命令的输出内容：

5）在此终端窗口中，我们可以看到测试区块链网络中的所有交易。现在，我们必须打开一个新的终端窗口，并需要跳转到工作目录。

要进行项目配置，请按照以下说明操作：

1）在[https://github.com/gladiusio/gladius-contracts网页中找到.zip文件并下载，然后将文件解压到你指定的路径。](https://github.com/gladiusio/gladius-contracts%E7%BD%91%E9%A1%B5%E4%B8%AD%E6%89%BE%E5%88%B0.zip%E6%96%87%E4%BB%B6%E5%B9%B6%E4%B8%8B%E8%BD%BD%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E6%96%87%E4%BB%B6%E8%A7%A3%E5%8E%8B%E5%88%B0%E4%BD%A0%E6%8C%87%E5%AE%9A%E7%9A%84%E8%B7%AF%E5%BE%84%E3%80%82)

2）用下面的代码替换truffle.js里的代码：

3）我们将进入名称为gladius-contracts-master的文件夹并使用以下命令编译合约：

以下屏幕截图显示了运行上述命令的输出内容：

4）现在，我们可以执行下面的命令将合约发布到ganache-cli的本地区块链上：

以下屏幕截图显示了运行上述命令的输出内容：

5）现在，我们必须使用truffle test命令启动单元测试，以确保智能合约正常运行：

6）在[https://github.com/gladiusio/gladius-control-daemon网页中下载.zip文件，然后将其解压缩到与gladius-contracts相同的文件夹中。](https://github.com/gladiusio/gladius-control-daemon%E7%BD%91%E9%A1%B5%E4%B8%AD%E4%B8%8B%E8%BD%BD.zip%E6%96%87%E4%BB%B6%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E5%85%B6%E8%A7%A3%E5%8E%8B%E7%BC%A9%E5%88%B0%E4%B8%8Egladius-contracts%E7%9B%B8%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E3%80%82)

7）接下来，我们在终端中找到gladius-control-daemon-master文件夹并链接合约应用程序二进制接口（ABI）。ABI是两个程序模块之间的接口，其中一个程序模块位于机器代码级别：

以下屏幕截图显示了运行上述命令的输出内容：

8）下一步，我们可以执行npm install命令安装所需依赖：

9）然后，我们可以执行node index.js命令启动脚本：

10）打开一个新终端窗口，执行gladius-networkd命令：

11）下一步，我们需要再打开一个新的终端，执行gladius-controld命令：

12）为了启动你的节点，你需要在新终端中执行下面的命令：

以下屏幕截图显示了运行上述命令的输出内容：

13）我们可以将数据提交到特定的池，允许它接受或拒绝成为池的一部分：

14）完成节点创建后，我们可以使用管理应用程序检查它的状态。这显示了区块链中的节点信息：

现在只需将Gladius客户端下载到你的计算机并访问系统即可。

激活Gladius后，所有节点都会处理连续的请求流，以校验网站连接并阻止恶意活动。Gladius积极致力于解决系统中的若干问题并实现稳定的系统。

区块链可以在以下场景中使用：

·冲突情况：区块链网络不仅连接可信方，还连接不可信方。因此，关注冲突情况并无缝地解决问题至关重要。区块链使用共识机制来确认交易和构建区块。不同的区块链使用不同的共识模型，例如工作量证明（PoW），权益证明（PoS）等，但目的是相同的，即避免冲突并使交易成功。

·共享公共数据库：如果企业组织在其员工（管理员或非IT人员）、承包商或第三方之间共享公共数据库，则许可链可以真正符合要求。当集中式数据库在不同方之间共享时，会增加使用特权升级的访问控制的风险。当使用许可链时，它确保只有提交的对等方有权对数据库进行更改，而交易背书可以由任何预先选择的参与者完成。

·交易业务规则需求：如果业务模型要求你有一个简单或复杂的逻辑策略来执行任何交易，那么区块链可以通过其逻辑策略提供很好的保证，例如以太坊的智能合约或超级账本的链码。业务策略将始终在节点软件中定义，该软件将强制节点按照定义的规则工作。

·系统透明性需求：如果组织的业务模型要求其对整个供应链的客户或供应商必须保持透明性，那么分布式账本技术可以更好地提供供应链运营管理系统的端到端可视性。在一个没有权限控制的区块链网络中，允许每个节点读写区块链账本，因此也变得透明。然而，在有权限的环境中，企业则更倾向于只有预选的节点参与区块链计算过程和账本管理。

·数据不变性的需求：如果企业组织需要开发高度安全的仅用于数据追加的数据库，则加密哈希和数字签名可以帮助构建这种高度安全的账本。

追加的数据库，则加密哈希和数字签名可以帮助构建这种高度安全的账本。在构建每个块时使用前一个块的哈希值，因此一旦创建了数据库，就不可能修改或重新排列它们。

区块链是业界所见过的最强大技术之一，但它并不总是适用于所有工作。这使得评估阶段在各个方面都非常关键。在理解了它最适合的业务之后，让我们看一些区块链不适合的情况：

·存储相当大的数据：由于其分布式和分散性，整个数据库与区块链网络中的每个节点一起存储（在基于权限的账本情况下，只允许预先选择的参与者读取和存储数据，因此，复制数据库将花费很长时间并且速度缓慢）。有一些解决方案是为了完成这个目的而建立的，我们可以快速了解一下。

·交易规则经常更改：如果设置并启动了智能合约策略，则不会更改执行路径。频繁更改业务流程和操作的组织不建议使用基于区块链的应用程序。区块链网络内的每个子系统和子进程必须是确定的。

·区块链必须从外部数据源获取数据：构建区块链智能合约不是为了从外部数据源获取信息。即使将其配置为在区块链和可信数据库之间进行通信，它也将作为常规数据库操作进行操作。而且，在这种情况下，区块链智能合约不会从外部数据库中提取条目。相反，可信数据库必须将数据推送到区块链上。

区块链正在为我们带来一些伟大的技术和商业机会，它正在促进不同组织之间的协作。领导者目前正在体验和寻找区块链技术用于其业务运营的用武之地，以便能够跟上不断变化的市场需求。让我们聚焦到落实区块链计划中的一些重要问题：

·谁是我的行业中最值得信赖的区块链技术领导者？

·我的竞争对手对区块链有什么看法？

·哪些业务部门最容易受到干扰？

·我们的区块链部署对谁的影响最大？他们可能会有什么反应？

·区块链可能的商业案例是什么？我们如何才能实现更好、更可持续的商业模式？

·部署中涉及的总成本因素是什么？

·目前的规章制度对区块链应用的影响是什么？

·我们如何协同监管机构向市场推出区块链应用来实现双赢？

·我们如何将安全控制应用于区块链应用程序？

在将区块链应用程序投入市场之前，预计会进行一系列头脑风暴，但建议明确项目的范围并与合适的利益相关者结盟。

懒惰和好奇，是创新与进步的源泉。

比特币、以太坊等公有区块链平台的实验，充分论证了区块链技术在支持去中心化交易方面的巨大优势。

越来越多的企业也开始关注区块链技术，尝试将其引入商业场景中，以提高进行复杂商业交易的效率，降低多方合作的成本。超级账本Fabric项目应运而生。Fabric作为超级账本社区的早期项目之一，集合了来自科技界和金融界的最新成果，首次提供了面向联盟链场景的分布式账本平台实现。

本章将带领读者学习如何从源码开始本地编译和安装Fabric环境，以及在多服务器环境下如何部署一个典型的Fabric网络。同时，还将介绍如何使用容器方式在单机环境下快速启动完整的Fabric网络环境。接下来，讲解链码和应用通道的相关操作和SDK支持。最后，本章对在生产环境中部署Fabric网络的有关注意事项进行探讨。

Fabric从1.0版本开始，在架构上进行了重新设计，解耦了节点的角色，同时在安全性、性能、可扩展性和可插拔性方面都有了不少改进。在将交易发送到网络中之前，需要先向背书节点收集足够多的背书支持，同时采用专门的排序节点来负责整个网络中十分核心的排序环节。

目前，网络中存在以下4种不同种类的服务节点，彼此协作完成整个区块链系统的功能。对网络中节点角色进行解耦是Fabric设计中的一大创新，这也是联盟链场景下的特殊需求和环境所决定的：

·背书节点（Endorser）：负责对交易的提案（proposal）进行检查和背书，计算交易执行结果；

·确认节点（Committer）：负责在接受交易结果前再次检查合法性，接受合法交易对账本的修改，并写入区块链结构；

·排序节点（Orderer）：对所有发往网络中的交易进行排序，将排序后的交易按照配置中的约定整理为区块，之后提交给确认节点进行处理；

·证书节点（CA）：负责对网络中所有的证书进行管理，提供标准的PKI服务。

另外，网络中支持多通道的特性。使用一条独立的系统通道（system channel）负责管理网络中的各种配置信息，并完成对其他应用通道（application channel，供用户发送交易使用）的创建。

目前，要启动一个Fabric网络，需要遵循如下的主要步骤

1）预备网络内各项配置，包括网络中成员的组织结构和对应的身份证书（使用cryptogen工具完成）；生成系统通道的初始配置区块文件，新建应用通道的配置更新交易文件以及可能需要的锚节点配置更新交易文件（使用configtxgen工具完成）。

2）使用系统通道的初始配置区块文件启动排序节点，排序节点启动后自动按照指定配置创建系统通道。

3）不同的组织按照预置角色分别启动Peer节点。这个时候网络中不存在应用通道，Peer节点也并没有加入网络中。

4）使用新建应用通道的配置更新交易文件，向系统通道发送交易，创建新的应用通道。

5）让对应的Peer节点加入所创建的应用通道中，此时Peer节点加入网络，可以准备接收交易了。

6）用户通过客户端向网络中安装注册链码（相关定义参见后面9.5节），链码容器启动成功后用户即可对链码进行调用，将交易发送到网络中。

后续章节将详细介绍各个步骤的操作顺序及方法

动手能力较强的读者，建议通过本地编译安装来部署超级账本Fabric网络，以便对相关组件有更深入的理解。

超级账本Fabric基于Go语言实现，本地编译推荐配置Golang 1.7或更高版本的环境。下面将讲解如何编译生成fabric-peer、fabric-orderer和fabric-ca等组件的二进制文件，以及如何安装一些配置和开发相关的工具。

常见的Linux发行版（包括Ubuntu、Redhat、CentOS等）和MacOS等都可以原生支持Fabric编译和运行。

操作系统推荐Linux内核3.10+版本，支持64位环境。另外，作为Fabric节点，物理内存建议至少为2GB，如果有较多的链码则需要更多容器；预留足够硬盘空间（一般建议20GB或更多）以存储区块文件。在生产环境中对性能和稳定性要求高的场景下，甚至要预留更多的物理资源。

下面将默认以Ubuntu 16.04操作系统为例进行操作。

提示　运行Fabric节点需要的资源并不苛刻，作为实验，Fabric节点甚至可以在树莓派（Raspberry Pi）上正常运行

.安装Go语言环境

Go语言环境可以自行访问golang.org网站下载二进制压缩包安装。注意不推荐通过包管理器安装，版本往往比较旧。

如下载Go 1.8版本，可以采用如下命令

    $ curl -O https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
    

下载完成后，解压目录，并移动到合适的位置（推荐为/usr/local下）：

    $ tar -xvf go1.8.linux-amd64.tar.gz
    $ sudo mv go /usr/local
    

安装完成后记得配置GOPATH环境变量：

    export GOPATH=YOUR_LOCAL_GO_PATH/Go
    export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
    

此时，可以通过go version命令验证安装是否成功：

    $ go version
    
    go version go1.8 linux/amd64
    

2.安装依赖包

编译Fabric相关代码，需要一些依赖包，可以通过如下命令安装：

通过如下命令可以获取fabric-peer和fabric-orderer组件编译所需要的代码，两者目前在同一仓库中

    $ git clone http://gerrit.hyperledger.org/r/fabric
    

启动Fabric网络是一个比较复杂的过程，主要步骤包括计划拓扑、准备相关配置文件、启动Orderer节点、启动Peer节点和操作网络等。这里以Fabric代码中自带的示例为基础讲解相关的操作步骤。

启动的Fabric网络中包括一个Orderer节点和四个Peer节点，以及一个管理节点生成相关启动文件，在网络启动后作为操作客户端执行命令。

四个Peer节点分属于同一个管理域（example.com）下的两个组织Org1和Org2，这两个组织都加入同一个应用通道（business-channel）中。每个组织中的第一个节点（peer0节点）作为锚节点与其他组织进行通信，所有节点通过域名都可以相互访问，整体网络拓

Fabric网络在启动之前，需要提前生成一些用于启动的配置文件，主要包括MSP相关文件（msp/\*）、TLS相关文件（tls/\*）、系统通道初始区块（orderer.genesis.block）、新建应用通道交易文件（businesschannel.tx）、锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx）等。各个文件的功能

注意，本小节主要描述如何生成这些启动配置文件，关于这些配置更详细的讲解可以参考后续相关章节。

1.生成组织关系和身份证书

Fabric网络提供的是联盟链服务，联盟由多个组织构成，组织中的成员提供了节点服务来维护网络，并且通过身份来进行权限管理。

因此，首先需要对各个组织和成员的关系进行规划，分别生成对应的身份证书文件，并部署到其对应的节点上。

用户可以通过PKI服务（如使用fabric-ca）或者OpenSSL工具来手动生成各个实体的证书和私钥。但当组织结构比较复杂时，这种手动生成的方式容易出错，并且效率不高。

Fabric项目提供了cryptogen工具（基于crypto标准库）实现自动化生成。这一过程首先依赖crypto-config.yaml配置文件。

crypto-config.yaml配置文件的结构十分简单，支持定义两种类型（OrdererOrgs和PeerOrgs）的若干组织。每个组织中又可以定义多个节点（Spec）和用户（User）。

一个示例的crypto-config.yaml配置文件内容如下，其中定义了一个OrdererOrgs类型的组织Orderer（包括一个节点orderer.example.com），以及两个PeerOrgs类型的组织Org1和Org2（分别包括2个节点和1个普通用户）

    OrdererOrgs:
        - Name: Orderer
            Domain: example.com
            Specs:
                - Hostname: orderer
     CommonName: orderer.example.com
    PeerOrgs:
        - Name: Org1
            Domain: org1.example.com
            Template:
                Count: 2
            Users:
                Count: 1
        - Name: Org2
            Domain: org2.example.com
            Template:
                Count: 2
            Users:
                Count: 1
    

使用该配置文件，通过如下命令可以为Fabric网络生成指定拓扑结构的组织和身份文件，存放到crypto-config目录下：

    $ cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
    

查看crypto-config目录结构，按照示例crypto-config.yaml中的定义进行生成：

    $ tree -L 4 crypto-config
    crypto-config
    |-- ordererOrganizations
    |   `-- example.com
    |       |-- ca
    |       |   |-- 293def0fc6d07aab625308a3499cd97f8ffccbf9e9769bf4107d6781f5e8072b_sk
    |       |   `-- ca.example.com-cert.pem
    |       |-- msp
    |       |   |-- admincerts
    |       |   |-- cacerts
    |       |   `-- tlscacerts
    |       |-- orderers
    |       |   `-- orderer.example.com
    |       |-- tlsca |   |-- 2be5353baec06ca695f7c3b04ca0932912601a4411939bfcfd44af18274d5a65_sk
    |       |   `-- tlsca.example.com-cert.pem
    |       `-- users
    |           `-- Admin@example.com
    `-- peerOrganizations
        |-- org1.example.com
        |   |-- ca
        |   |   |-- 501c5f828f58dfa3f7ee844ea4cdd26318256c9b66369727afe8437c08370aee_sk
        |   |   `-- ca.org1.example.com-cert.pem
        |   |-- msp
        |   |   |-- admincerts
        |   |   |-- cacerts
        |   |   `-- tlscacerts
        |   |-- peers
        |   |   |-- peer0.org1.example.com
        |   |   `-- peer1.org1.example.com
        |   |-- tlsca
        |   |   |-- 592a08f84c99d6f083b3c5b9898b2ca4eb5fbb9d1e255f67df1fa14c123e4368_sk
        |   |   `-- tlsca.org1.example.com-cert.pem
        |   `-- users
        |       |-- Admin@org1.example.com
        |       `-- User1@org1.example.com
        `-- org2.example.com
            |-- ca
            |   |-- 86d97f9eb601868611eab5dc7df88b1f6e91e129160651e683162b958a728162_sk
            |   `-- ca.org2.example.com-cert.pem
            |-- msp
            |   |-- admincerts
            |   |-- cacerts
            |   `-- tlscacerts
            |-- peers
            |   |-- peer0.org2.example.com
            |   `-- peer1.org2.example.com
            |-- tlsca
            |   |-- 4b87c416978970948dffadd0639a64a2b03bc89f910cb6d087583f210fb2929d_sk
            |   `-- tlsca.org2.example.com-cert.pem
            `-- users
                |-- Admin@org2.example.com
                `-- User1@org2.example.com
    

按照crypto-config.yaml中的定义，所生成的crypto-config目录下包括多级目录结构。其中ordererOrganizations下包括构成Orderer组织（1个Orderer节点）的身份信息；peerOrganizations下为所有的Peer节点组织（2个组织，4个节点）的相关身份信息。其中最关键的是msp目录，代表了实体的身份信息。

对于Orderer节点来说，需要将crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com目录下的内容（包括msp和tls两个子目录）复制到Orderer节点的/etc/hyperledger/fabric路径（与Orderer自身配置一致）下。

对于Peer节点来说，则需要复制peerOrganizations下对应的身份证书文件。以org1的peer0为例，将crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com目录下的内容（包括msp和tls）复制到Peer0节点的/etc/hyperledger/fabric（与Peer自身配置一致）路径下。

对于客户端节点来说，为了方便操作，可将完整的crypto-config目录复制到/etc/hyperledger/fabric（与configtx.yaml中配置一致）路径下。

注意　目前，组织结构一旦生成，如果要进行修改，只能手动对证书进行调整，因此需要提前做好联盟的规划。未来会支持对组织结构和节点身份进行动态在线调整。

2.生成Ordering服务启动初始区块

Orderer节点在启动时，可以指定使用提前生成的初始区块文件作为系统通道的初始配置。初始区块中包括了Ordering服务的相关配置信息以及联盟信息。初始区块可以使用configtxgen工具进行生成。生成过程需要依赖赖/etc/hyperledger/fabric/configtx.yaml文件。configtx.yaml配置文件定义了整个网络中的相关配置和拓扑结构信息。

编写configtx.yaml配置文件可以参考Fabric代码中（如examples/e2e\_cli路径下或sampleconfig路径下）的示例。这里采用如下内容进行生成：

    Profiles:
        TwoOrgsOrdererGenesis:
            Orderer:
                <<: *OrdererDefaults
                Organizations:
                    - *OrdererOrg
            Consortiums:
                SampleConsortium:
                    Organizations:
                        - *Org1
                        - *Org2
        TwoOrgsChannel:
            Consortium: SampleConsortium
            Application:
                <<: *ApplicationDefaults
                Organizations:
                    - *Org1
                    - *Org2
    Organizations:
        - &OrdererOrg
            Name: OrdererOrg
            ID: OrdererMSP
            MSPDir: crypto-config/ordererOrganizations/example.com/msp
            BCCSP:
                Default: SW
                SW:
                    Hash: SHA2
                    Security: 256
                    FileKeyStore:
                        KeyStore:
        - &Org1
            Name: Org1MSP
            ID: Org1MSP
     MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
            BCCSP:
                Default: SW
                SW:
                    Hash: SHA2
                    Security: 256
                    FileKeyStore:
                        KeyStore:
            AnchorPeers:
                - Host: peer0.org1.example.com
                  Port: 7051
        - &Org2
            Name: Org2MSP
            ID: Org2MSP
            MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
            BCCSP:
                Default: SW
                SW:
                    Hash: SHA2
                    Security: 256
                    FileKeyStore:
                        KeyStore:
            AnchorPeers:
                - Host: peer0.org2.example.com
                  Port: 7051
    Orderer: &OrdererDefaults
        OrdererType: solo
        Addresses:
            - orderer.example.com:7050
        BatchTimeout: 2s
        BatchSize:
            MaxMessageCount: 10
            AbsoluteMaxBytes: 99 MB
            PreferredMaxBytes: 512 KB
        Kafka:
            Brokers:
                - 127.0.0.1:9092
        Organizations:
    Application: &ApplicationDefaults
        Organizations:
    

该配置文件定义了两个模板：TwoOrgsOrdererGenesis和TwoOrgsChannel，其中前者可以用来生成Ordering服务的初始区块文件。

通过如下命令指定使用configtx.yaml文件中定义的TwoOrgsOrdererGenesis模板，来生成Ordering服务系统通道的初始区块文件。注意这里排序服务类型采用了简单的solo模式，生产环境中可以采用kafka集群服务：

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/45Bcafl3vNTWybTcEqPN)*
