# 超级账本开发实例1——建立一个Fabric网络

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

---

●了解超级账本的架构设计。

●学会搭建超级账本开发环境。

●掌握Chaincode的开发过程。

●通过实例掌握Fabric框架开发

超级账本（Hyperledger），是一个由Linux基金会在2015年12月主导发起的开源项目，目的是通过提供一个可靠稳定、性能良好的区块链框架，供企业创建自定义的分布式账本解决方案，以促进区块链技术在商业中的应用。

超级账本的架构包括4个大的模块：成员（MEMBERSHIP）、区块链（BLOCKCHAIN）、交易（TRANSACTIONS）和智能合约（CHAINCODE），其中成员模块主要提供成员服务（Membership Services），包括用户注册（Registration）、标识管理（Identity Management），以及提供可审计性Auditability）等；区块链模块和交易模块用于提供区块链相关的服务（Blockchain Services），负责提供共识管理（Consensus Manager）、分布式账本（Distributed Ledger）、P2P协议（P2P Protocol）和账本存储（Ledger Storage）等功能；智能合约服务负责提供智能合约的功能，智能合约被放置在安全的仓库（Secure Registry）中，执行时在一个安全的容器（Secure Container）中运行。

超级账本在实际的发展过程中，基本是参照上述的架构进行开发的，并且孵化出了很多区块链项目，主要包括Sawtooth（官网首页如图6-2所示）、Iroha（官网首页如图6-3所示）、Fabric（官网首页如图6-4所示）、Burrow（官网首页如图6-5所示）等。

其中，Sawtooth是用于构建、部署和运行分布式账本的模块化平台；Iroha是一个商业区块链框架，其设计简单且易于并入需要分布式账本技术的基础设施项目中；Fabric是一个开源的区块链开发框架，它提供了一个模块化的架构，其架构中包含结点、智能合约以及可配置的共识和成员服务等功能；Burrow可以看作一个支持以太坊智能合约的框架，它是根据以太坊虚拟机（EVM）规范构建的。这些基于超级账本的项目中，Fabric是最有名的，使用Fabric可以快速地搭建完成企业级的区块链系统。一般超级账本基本上指的都是超级账本Fabric，本章讲解的超级账本也是指超级账本Fabric，即在本章中提到的超级账本基本上就是指Fabric。

下面了解下超级账本Fabric的架构

Fabric的架构经历了两个版本的演进。最初发布的0.6版本只是被用来做商业验证，无法被应用于真实场景中。因为0.6版本的结构简单，基本所有的功能都集中在peer结点，在扩展性、安全性和隔离性方面有着不足。在后来推出的1.0正式版中，将peer结点的功能进行分拆，把共识服务从peer结点剥离，独立为orderer结点，提供可插拔共识服务。更为重要的是加入了多通道（multi-channel）功能，实现了多业务隔离，如图6-6所示。

在Fabric 1.0中需要了解的几个核心概念说明如下。

●SDK：应用工具开发包。

![超级账本Fabric架构的变化](https://storage.googleapis.com/papyrus_images/67a14dec38e9ee242647d47d8b8c0685eae216b66b9ff98b5e25d5b94e7d531c.png)

超级账本Fabric架构的变化

●Membership：负责身份权限管理，又叫MemberService或Identity Service。

●Chaincode（链码）：区块链上的应用代码，扩展自“智能合约”的概念，支持Go、Java等编程语言，运行在隔离的容器环境中。

●Orderer（排序结点）：Fabric 1.0架构中的共识服务角色，可以对交易进行排序、批量打包、生成区块，发给peer结点。一个区块链网络中有多个orderer结点，它们共同提供排序服务。

●Endorser（背书结点）：Fabric 1.0架构中的一类peer结点角色，负责检验某个交易是否合法，是否愿意为之签名背书。

●Committer（提交结点）：Fabric 1.0架构中的另一类peer结点角色，负责对orderer结点排序后的交易进行检查，选择合法的交易执行并写入存储。

●Enrollment Certificate Authority（ECA，注册证书认证中心）：负责成员身份相关证书管理的认证中心。

●Transaction Certificate Authority（TCA，交易证书认证中心）：负责维护交易相关证书管理的认证中心。

Fabric中主要可分为两种类型的结点：peer结点和orderer结点。一个区块链网络中会有多个peer结点，一个peer结点可以充当多种角色，如可以充当背书结点endorser，充当提交结点committer。链码（Chaincode）部署在peer结点上，则这个结点用于执行智能合约。orderer结点在网络中起到代理作用，多个orderer结点会连接到Kafka集群，利用Kafka的共识功能，完成对网络中交易的排序和打包成区块的工作。另外一个peer结点可以加入多个通道，多个通道之间是完全隔离的，每个通道只会接收和处理该通道相关交易的区块，而与其他交易完全隔离，实现数据隔离和保密。

超级账本Fabric的特点
=============

超级账本的架构使它拥有以下特点。

●模块化设计，包括共识、权限管理、加解密、账本机制等模块，可以灵活地进行选择和替换。

●具有多种结点类型。不同结点被赋予了不同的功能，提升了交易处理效率。

●加强了身份证书管理服务，提供了身份证书、数字签名、验证算法以及若干判断身份是否有效的功能。

●支持多通道特性，不同通道之间的数据彼此隔离，提高隔离安全性。

●引入链码来实现智能合约的功能，实现了可编程性，支持第三方实现自定义功能。

●充分利用Docker容器技术，可以根据负载进行灵活部署。

搭建Fabric开发环境
============

超级账本主要由Go语言开发，并使用Docker容器技术进行部署。超级账本开发环境配置过程比较简单，在Windows、Linux和Mac系统下均可进行操作。使用超级账本开发区块链需要先安装Go语言开发环境和Docker工具。然后使用官方提供的安装脚本即可自动下载安装所需要的文件和Docker镜像，下载完成后即可进行开发。这里先简单介绍一下Go语言和Docker工具，对这两部分有了解的读者可以跳过，直接阅读Fabric本地开发环境安装部分

Go语言简介及其开发环境安装
==============

Go语言是Google推出的一门强类型的通用编程语言，Go语言良好的语言设计、高效的性能以及强大的并发编程能力使其很适合开发区块链这样的分布式系统。

要安装使用Go语言可以到Go的下载地址https：//golang.org/dl/选择对应系统的Go语言开发环境的安装文件进行下载安装（需要有相应设置才可访问），go语言的下载页面如图6-7所示。

Go语言的开发环境安装完成后需要将Go的目录/usr/local/go/bin添加至系统的PATH环境变量中，命令如下：

$ export PATH=$PATH：/usr/local/go/bin

之后，编写一个输出“Hello，Golang！”的程序测试Go的开发环境是否安装完成。

新建一个名为hello.go的文件，在文件中输入以下内容：

![](https://storage.googleapis.com/papyrus_images/d550dcbf3269cacc3380e2fb824564b24c1b72b3f845cc7243343b74d30ba1af.png)

![Go语言的下载页面](https://storage.googleapis.com/papyrus_images/cbfc3039e07ace910d58d834a23a4c361f0db989853868fa6be9bff60bab60dc.png)

Go语言的下载页面

然后打开系统的命令行终端工具（terminal）执行go run hello.go命令，可以看到“Hello，Golang！”的输出信息，如图

![](https://storage.googleapis.com/papyrus_images/f0a7e640badcf0a68932970531997a051a8a6af32b35ebb75bfae342572cbdf6.png)

Go的语法比较简单，Go语言官网也提供了在线学习的教程，有需要的读者可以访问https：//tour.golang.org/welcome/1进行学习

Docker是一个开源的应用容器引擎，基于Go语言开发。它是目前最流行的容器解决方案。Docker属于Linux容器的一种封装，提供简单易用的容器使用接口。

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的Linux机器上，便可以启动和运行应用程序了。Docker使开发者能够非常方便快捷地管理自己的项目，只需要几分钟就能完成项目的发布和更新。

Docker使用客户端/服务器（C/S）架构模式，包括Docker客户端（Docker Client）和Docker守护进程（Docker Deamon）两部分。Docker守护进程运行在宿主机上，处理复杂繁重的任务，例如建立、运行、发布Docker容器。Docker客户端（或者说命令行工具），是用户使用Docker的主要方式，Docker客户端与Docker守护进程通信并将结果返回给用户。Docker客户端和Docker守护进程可以运行在同一个系统上，当然也可以使用Docker客户端去连接一个远程的Docker守护进程。Docker客户端和Docker守护进程之间通过socket或者RESTful API进行通信，如图

![Go语言在线学习的网页](https://storage.googleapis.com/papyrus_images/0c2c33b5020a9f797c4b496a6c15669f93c4e1f08b31635993366a39bfd7fbd8.png)

Go语言在线学习的网页

![  Docker客户端和Docker守护进程](https://storage.googleapis.com/papyrus_images/c8f8465eb802daeb55b4911be8990267a302781ef384c661c2a71bce029d6bfe.png)

Docker客户端和Docker守护进程

了解了Docker的基本构成，再来了解一下Docker的3个主要概念。

●Docker镜像：Docker镜像是只读的，镜像中包含有需要运行的文件。镜像用来创建容器，一个镜像可以运行多个容器；镜像可以通过Dockerfile创建（Dockerfile是一个文本文件，Docker根据这个文件生成一个镜像），也可以从Docker仓库上下载。

●Docker容器：Docker容器是Docker的运行组件，启动一个镜像就是一个容器，容器是一个隔离环境，多个容器之间不会相互影响，保证容器中的程序运行在一个相对安全的环境中。

●Docker仓库：Docker仓库用于共享和管理Docker镜像，用户可以上传或者下载镜像。

Docker仓库的官方地址为https：//registry.hub.docker.com/，也可以搭建自己私有的Docker仓库

接下来进行Docker的安装，在Mac和Windows上可以到官网下载安装包进行安装，在其他Linux系统中可以通过命令方式进行安装。

### Docker的安装包的下载地址为：https：//[www.docker.com/get-started](http://www.docker.com/get-started)

下载文件后双击Docker安装程序进行安装即可。安装完成后就可以双击Docker图标启动Docker守护进程，然后使用Docker客户端与Docker守护进程进行交互。如一切安装正常，在终端中输入docker run hello-word命令即可自动下载hello-world镜像，并启动一个容器输出“Hello from Docker”，如图所示。

![](https://storage.googleapis.com/papyrus_images/85dacc307b932458a299b53820cdf24bff20746dda42069a2fb41730c9ac819a.png)

![输出Hello from Docker](https://storage.googleapis.com/papyrus_images/3a903576649ac415c15f4b45913047263b31510c1f054637fb0a272cc2c63798.png)

输出Hello from Docker

这就说明Docker已经可以正常使用了。直接输入docker命令可以查看Docker客户端的常见使用方法，如

![Docker客户端的使用方法](https://storage.googleapis.com/papyrus_images/26b09d948f438be2a76878083b83b54fcb0ebe666698c66b522c3a23acfee9b0.png)

Docker客户端的使用方法

这里列举几个常用的Docker命令。

●启动容器并启动命令行工具bash。

docker run -i -t＜image\_name/continar\_id＞/bin/bash

●进入正在运行的容器内部，同时运行bash。

docker exec -t -i＜id/container\_name＞/bin/bash

●查看容器日志。

docker logs＜id/container\_name＞

●列出当前所有正在运行的容器。

docker ps

●删除单个容器。

docker rm Name/ID

●停止、启动、终止、重启一个容器。

docker stop Name/ID

docker start Name/ID

docker kill Name/ID

docker restart name/ID

●列出镜像。

docker images

●搜索镜像。

docker search image\_name

●下载image。

docker pull image\_name

●删除一个或者多个镜像。

docker rmi image\_name

关于Docker，最后还需要知道如何生成自定义的镜像文件。生成自定义的镜像文件需要编写一个Dockefile。Dockerfile由一行行命令语句组成，并且支持以#开头的注释行。一般而言，Dockerfile分为基础镜像信息、维护者信息、镜像的操作指令、容器启动时执行指令这4个部分。这里以一个nginx（一个高性能的HTTP和反向代理服务器）作为基础镜像为例，新建一个Dockerfile的空白文件，输入以下内容：

Dockerfile示例
============

第1行必须指定基于的镜像基础
==============

FROM nginx

维护者信息
=====

MAINTAINER XXX [XXX@qq.com](mailto:XXX@qq.com)

镜像的操作指令
=======

RUN echo‘＜h1＞Hello，Docker！＜/h1＞'＞/usr/share/nginx/html/index.html

#容器启动时执行指令

！！这个示例功能比较简单，不需要在容器启动时执行指令！！
============================

完成后保存文件，然后在终端中执行docker build-t hello\_docker.命令构建镜像，执行完成后可以看到本地多了一个名为hello\_docker的镜像，如图所示。

![](https://storage.googleapis.com/papyrus_images/45a74cc52341190fbfedc57575964d24a5de6cfca72bdb52feb9c9535ada8128.png)

以上即为Docker的简要介绍，若需深入学习可购买专门的Docker教程自学，如《Docker入门与实战》，《Docker第一本书》

对Go语言和Docker有了一定了解后，就可以正式搭建Fabric的开发环境了。

当前Fabric的最新版本为1.2.1，打开命令行工具使用以下命令就可以进行安装：

curl-sSL http//bit.ly/2ysbOFE|bash-s 1.2.1

这个命令会执行以下操作。

1）检查是否有1.2.1版本的Fabric代码。

2）将1.2.1版本的Fabric项目中的程序和配置文件下载到当前文件夹中，如图

![](https://storage.googleapis.com/papyrus_images/22b87d6e8678fed303cfa10243a69f48f70d14397a0d8c92bb88de95d6f9e31b.png)

3）下载1.2.1的Fabric docker镜像到当前系统中，如图

![下载的镜像文件](https://storage.googleapis.com/papyrus_images/6faefa4cdfce79a7adceb7177146a18b8e3470bab1d00a9477d0d55e2a6c1a52.png)

下载的镜像文件

然后还可以下载Fabric项目的示例代码到本地，这些示例代码是基于Fabric实现的项目，本书也是通过这些示例来讲解Fabric的使用方法。示例代码的下载命令如下：

git clone https//github.com/hyperledger/fabric-samples.git

至此，Fabric的开发环境搭建完成，可以访问Fabric的官网查阅安装步骤的说明，网页链接地址为https//hyperledger-fabric.readthedocs.io/en/latest/getting\_started.html

### 正式进入超级账本的开发，首先来了解一下Chaincode的概念，然后介绍如何开发Chaincode，如何将Chaincode部署到Fabric中，以及如何使用Chaincode。

---

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