banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

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

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

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

●掌握 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 架构的变化

●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 的文件,在文件中输入以下内容:

image

Go 语言的下载页面

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

image

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 语言在线学习的网页

  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#

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

image

输出 Hello from Docker

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

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 [email protected]

镜像的操作指令#

RUN echo‘<h1>Hello,Docker!</h1>'>/usr/share/nginx/html/index.html

#容器启动时执行指令

!!这个示例功能比较简单,不需要在容器启动时执行指令!!#

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

image

以上即为 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 项目中的程序和配置文件下载到当前文件夹中,如图

image

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

下载的镜像文件

然后还可以下载 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。#

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.