区块链开发实战:Hyperledger Fabric关键技术与案例分析
上QQ阅读APP看书,第一时间看更新

第2章 实战准备

区块链技术是由多种技术组合而成的一个技术栈,要正确了解和掌握区块链技术需要对整个区块链技术栈有一个初步的了解。本章会介绍区块链系统中经常用到的一些技术和工具,这些工具在使用区块链技术的时候经常被用到。在作者运营区块链技术论坛的过程中,通过对数百个问题进行分析之后我们发现,很多区块链技术问题都不在区块链本身,而是由于对区块链周边一些技术的不熟悉而引起的。我们建议读者在阅读本书后续内容之前,首先仔细阅读本章内容。

2.1 开发环境准备

学习和使用区块链技术,除了要对区块链平台的开发语言有所了解之外,还需要了解操作系统、虚拟机软件等相关技术,这些技术在区块链的使用过程中占有比较重要的比重。我们这套系列书的实战项目主要是基于Fabric、以太坊、比特币这三个平台。本节内容将重点介绍这三个区块链主流技术平台对操作系统的要求。

2.1.1 操作系统的配置

目前主流的区块链平台基本上都支持Linux、MacOS、Windows这三个常用的操作系统。但是由于各个平台本身的特性,我们建议在Linux或者MacOS系统中部署和测试区块链平台。Linux可以选择CentOS或者Ubuntu这两个平台。如果平时比较习惯Windows系统,那么我们建议另外准备一台安装CentOS或者Ubuntu的机器。如果没有条件,可以选择虚拟机器软件xbox或者vmware来安装一台虚拟的操作系统。

本书是一本实战性很强的书,书中涉及大量的实际操作过程。因此在开始阅读本书后续章节之前,我们建议读者先准备相关的硬件,建议配置如下:

● 一台MacOS系统的电脑

● 一台Ubuntu系统的电脑

● 一个Windows系统的机器+一台安装CentOS或者Ubuntu的实体机(如果条件不具备,通过虚拟机软件安装CentOS或者Ubuntu也是可以的)

注意

在一台安装有Windows系统的电脑上面运行本书后面的例子时可能会遇到问题。

在学习环境中可以按照上面的配置,但是在生产环境中一般都将区块链系统部署在Linux平台之上,可以是CentOS或者Ubuntu。各个区块链平台对操作系统的版本要求是不一致的,在后续章节中我们将详细介绍各个区块链平台对操作系统的要求。

2.1.2 Docker的使用

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器完全使用沙箱机制,相互之间不会有任何接口。Docker在区块链相关的技术平台中应用非常广泛,特别在Fabric中几乎无法离开Docker。本节中我们将给大家介绍Docker的安装方式以及几个常用的Docker命令。

1. Docker的安装和配置

(1)Ubuntu上面安装Docker

执行下面的命令安装Docker和Docker Compose:

apt install docker.io
apt install docker-compose

安装完成之后系统会自动启动Docker。

(2)CentOS上面安装Docker

由于CentOS在启动程序的时候有所不同,有的版本采用service命令启动,有的版本采用systemctl命令,为此我们在可能出现重复的地方同时标注两个命令,各位读者在进行实践操作的时候要注意。

执行下面的命令:

yum install docker python-pip
pip install --upgrade pip
pip install docker-compose

安装完成之后需要执行下面的命令启动docker:

service docker start

docker安装完成之后执行以下命令检查是否打开http通道,否则后面会出现无法识别的错误。

curl  -XPOST  --unix-socket  /var/run/docker.sock  -d ‘{“Image”:”nginx”}' -H‘Content-Type: application/json'http://localhost/containers/create

2. Docker的常用命令

(1)查看Docker版本

docker version**

(2)查看镜像的列表

docker images

(3)查看正在运行的镜像

docker ps

(4)查看容器的详细信息

docker inspect 142aef786231

docker inspect后面的参数是docker ps命令返回结果中的CONTAINER ID字段的值,这是一个非常重要的命令。

(5)运行镜像

docker start -it -p 8880:80 nginx

docker start(start后面的参数为容器编号或者容器名称,在执行完docker create命令之后,可以通过docker ps -a命令获取)。

(6)创建容器并且运行容器

docker run -d -p 8880:80 nginx

● -d:守护进程运行。

● -p:端口映射,后面的是Docker容器内的端口,前面的是宿主服务器的端口。

● nginx:是镜像的名字。

(7)查询本镜像

docker images

(8)停止正在运行的镜像实例(容器)

docker stop 0067a3c9ef6c

注意

stop后面的参数是镜像运行实例的编号,可以支持运行多个镜像的实例(多个容器),镜像实例的编号可以通过命令docker ps获取,CONTAINER ID就是实例的编号。

(9)进入容器

docker exec -it c4dbfde3b039 /bin/bash

其中-it后面的就是容器实例的编号,获取实例编号的方法上面已经说过了。

(10)导出Docker镜像

sudo docker save -o导出的文件路径 镜像名称:版本号

(11)导入Docker镜像

docker load --input镜像文件名

(12)查询hub.docker.com中的镜像

docker search

(13)下载hub.docker.com中的镜像

docker pull nginx

(14)删除本地已经存在的镜像文件

docker rmi镜像名称或者镜像编号

注意

如果直接用,可以在镜像名字的后面加上:+标签号。

(15)停止容器并删除

docker kill $(docker ps -q)&&docker rm $\(docker ps -qa\)

停止所有正在运行的Docker容器,然后删除所有Docker容器文件。这两个命令可以拆开运行。

(16)根据关键字删除Docker镜像

docker rmi -f $\(docker images\|grep $keyword\|awk '{print $3}'\)

删除已经下载的Docker镜像,上述命令中的参数$keyword为所删除文件中包含的关键字。比如$keyword的值为"fabric",那么上述命令将会删除名称中包含"fabric"字符串的镜像文件。

2.1.3 Git的使用

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。Git在没网的时候仍然可以使用大部分命令信息操作,在网络恢复的时候再跟服务器进行同步,这样可以更好地实现多人联合编程。

目前几乎所有的区块链项目都是开源项目,这些开源项目的源代码都是托管在github上面的,了解常用的Git命令对阅读本书特别是操作本书提供的示例还是有帮助的。下面我们将介绍常用的几个Git命令。

1.将远程的版本库克隆到本地

git clone

2.获取当前版本库的状态

git status

3.提交代码

git add . 或者git add文件名
git commit -m注释
git push

4.从远程版本库获取最新的代码更新

git pull

2.2 开发语言

本书介绍的区块链技术中主要涉及Golang、Node.js等编程语言。了解这些编程语言的特性对学习和使用相关的区块链技术平台是有帮助的。

2.2.1 GO语言

Go语言又称为Golang(本书中一律称为Golang),是谷歌2009年发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全,支持并行进程。目前大多数区块链项目都是用Go语言开发的(如以太坊、Fabric)。但比特币由于出现年份稍早,因此采用C++语言开发,所以针对比特币的项目需要了解以下C++语言。

Go语言是区块链平台的开发的重要语言。在学习区块链平台使用的过程中,为了更好地理解这些平台的技术特性有时候需要阅读相关项目的源代码,熟练掌握Go语言的基本语法特性是必要的。由于本书篇幅的限制,我们只列出对本书项目有用的一些特性供大家参考。

1. Go语言的路径

Go语言的包路径是Go语言中比较容易出错的部分,很多初学者在这个步骤容易出错。要彻底搞清楚Go语言的包路径问题可能需要参考专门的资料,这里不再详细说明。我们建议读者把所有的Go项目包括Fabric源代码和所有Chaincode代码都存放在GOPATH设定的路径下面。

下面是我编写的GOPATH路径和项目结构的示例。如果你对Go语言比较熟悉可以跳过这部分内容直接阅读后面的内容。

在命令行中执行命令go evn,结果如下所示:

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/project/goworkspace"

从上面的信息中可以看出作者的GOPATH为文件夹/project/goworkspace。通过tree命令可以获取该文件夹中项目的结构如下:

这里将所有项目都存放在GOPATH所设定的目录中的src文件夹中,也许不是最好的项目结构方式,但是考虑到读者有很多人是初次接触Golang,这种方法能减少出错的几率。如果读者对Golang比较熟悉,可以选择自己熟悉的项目结构方式。

2. Golang的IDE工具

Goland是Golang集成开发环境,提供了代码提示、语法错误提示、程序调试等功能。可以通过下面的网址下载:

https://www.jetbrains.com/go/

2.2.2 Node.js

Node.js是一个基于Chrome V8引擎的JavaScript运行环境。Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。Node.js的包管理器npm,是全球最大的开源库生态系统。Node.js这门语言本身和区块链的关系不是很大,但是很多优秀的基于区块链的开源项目都是基于Node.js开发的,这些应用对我们学习和使用区块链的技术提供了很好的借鉴作用,有时候我们需要阅读这些项目的源码来验证我们的想法。

本书所有的实战项目也都是用Node.js开发的,因此了解Node.js相关的特点有助于更好地阅读与理解本书的内容。Node.js使用的是Javascript的语法特性,如果你对Javascript不是非常熟悉可以参考相关的资料。

Node.js的IDE我们推荐使用webstorm。webstorm是功能丰富的Node.js集成开发环境,提供了代码提示、调试器等常用功能。可以通过以下路径下载:

https://www.jetbrains.com/webstorm/

2.3 常用工具

2.3.1 Curl

Curl(Command Line URL Viewer)是一个Linux/Windows命令行工具。Curl能从服务器下载数据,也能往服务器上发送数据。Curl支持多种协议,包括:DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET和TFTP。从Curl支持的协议就可以看出,CURL命令非常强大。在区块链系统中,有些时候需要通过Curl来快速调用相关的JSON-RPC接口,以便快速完成相关的操作。

由于本书篇幅有限,无法详细介绍Curl所有的命令,并且在区块链系统中只需用到Curl中的部分命令,因此本节中只简单介绍Curl在各个平台上的安装,在后续章节中我们会在需要的时候详细地介绍相关的命令。

Curl工具CentOS中的安装:

yum install curlapt install curl

Curl工具Ubuntu中的安装:

apt install curl

2.3.2 tree

tree命令是Linux/UNIX系统中常用的命令,可以非常方便地查看文件夹的结构,并且以树形目录的形式展现。命令执行结果示例如下所示:

tree命令的安装非常简单,tree命令Ubuntu和CentOS的安装方式分别如下所示。

tree命令Ubuntu中的安装:

sudo apt-get install tree

tree命令CentOS中的安装:

yum install tree

2.3.3 Jq

Jq是Linux处理JSON文件的工具,Jq是一个基于命令行的工具,通过简单的命令可以完成对JSON格式文件的操作,比如取值、设值等操作。Jq工具在Ubuntu和CentOS中的安装方式分别如下所示。

Jq工具在Ubuntu中的安装:

apt-get install jq

Jq工具在CentOS中的安装:

yum install jq

2.4 本章小结

本章的内容看起来和区块链及技术关系不大,但是在区块链技术的实际使用中还是具有比较重要的作用。虽然这些小技术不是什么复杂而宏大的技术,但是对它们任何的一个忽略都能会在后续的实际操作中带来障碍。我们可以躲避大树,但是尝尝被小石头绊倒。通过阅读本章的内容可以有效地避免这些小障碍。