Fabric SDK 构建应用程序之网络环境搭建

介绍Hyperledger Fabric Go SDK,基于区块链构建一个应用程序。

  1. 先决条件
  2. Hyperledger Fabric简介
  3. 安装指南
    1. Docker
    2. Docker-compose
    3. Go
    4. Fabric SDK Go
  4. 制作第一个区块链网络
    1. 准备环境
    2. 测试
  5. 使用Fabric SDK Go
  6. 链码开发及安装与实例化
  7. 链码调用
  8. 在Web应用程序中进行设置

1.先决条件

Ubuntu 16.04上发布, 使用Go语言来设计应用程序,因为Hyperledger Fabric也是在Go中构建的,Fabric SDK Go的使用非常简单

Hyperledger Fabric使用Docker轻松部署区块链网络。 另外,一些组件(同级)也部署docker容器来分离数据(通道)。 所以请确保所使用的平台支持这种虚拟化。

2. Hyperledger Fabric介绍

Hyperledger Fabric是分布式账本解决方案的平台,支持模块化架构,提供高度的机密性,弹性,灵活性和可扩展性。 它旨在支持不同组件的可插拔实现,并适应经济生态系统中存在的复杂性。

3.安装指南

a. Docker

需要Docker版本1.12或更高版本。

 docker -v 

b. Docker Compose

Docker-compose 1.8或更高版本是必需的。

我们目前无法一次性轻松管理多个容器。 为了解决这个问题,需要docker-compose

 docker-compose version 

C. Go

需要版本1.10.x或更高版本。

 go version 

设置GOPATH & GOROOT环境变量, 通过 go env 查看GOPATH路径

d. Fabric SDK Go

安装软件包libltdl-dev

$ sudo apt update
$ sudo apt install libltdl-dev 

将当前用户添加到Docker组

否则在执行make命令时会造成错误: ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

$ sudo usermod -aG docker 用户名

添加成功后必须注销/退出并重新登录(退出终端重新连接即可)

执行以下命令请确保网络通畅及稳定

安装Hyperledger Fabric SDK Go,可以很容易的与Fabric的组件进行通信。 不需要安装Fabric或Fabric CA框架,因为SDK会自动在本地处理。

$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim

将fabric-sdk-go目录上传并解压至$GOPATH/src/github.com/hyperledger目录下

$ unzip -d $GOPATH/src/github.com/hyperledger fabric-sdk-go.zip

将如下环境变量设置到用户的环境文件中(.bashrc)中

export PATH=$PATH:$GOPATH/bin

确保有所需的所有依赖关系:

$ cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go 
$sudo make depend-install 

在执行 make depend-install 的时候很有可能出现多种错误,这些错误基本上都是由网络原因造成,必须保证网络良好,且命令行需要翻墙

如出现以下错误:

Please replace the Apache license header comment text with:
SPDX-License-Identifier: Apache-2.0

Checking committed files for traditional Apache License headers ...
The following files are missing traditional Apache 2.0 headers:
ci.properties
Fatal Error - All files must have a license header
Makefile:185: recipe for target 'license' failed
make: *** [license] Error 1

test/scripts/check_license.sh 文件中的内容替换为:

#!/bin/bash
#
# Copyright IBM Corp, SecureKey Technologies Inc. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

function filterExcludedFiles {
  CHECK=`echo "$CHECK" | grep -v .png$ | grep -v .rst$ | grep -v ^.git/ \
  | grep -v .pem$ | grep -v .block$ | grep -v .tx$ | grep -v ^LICENSE$ | grep -v _sk$ \
  | grep -v .key$ | grep -v .crt$ | grep -v \\.gen.go$ | grep -v \\.json$ | grep -v Gopkg.lock$ \
  | grep -v .md$ | grep -v ^vendor/ | grep -v ^build/ | grep -v .pb.go$ | grep -v ci.properties$ | sort -u`
}

CHECK=$(git diff --name-only --diff-filter=ACMRTUXB HEAD)
filterExcludedFiles
if [[ -z "$CHECK" ]]; then
  LAST_COMMITS=($(git log -2 --pretty=format:"%h"))
  CHECK=$(git diff-tree --no-commit-id --name-only --diff-filter=ACMRTUXB -r ${LAST_COMMITS[1]} ${LAST_COMMITS[0]})
  filterExcludedFiles
fi

if [[ -z "$CHECK" ]]; then
   echo "All files are excluded from having license headers"
   exit 0
fi

missing=`echo "$CHECK" | xargs ls -d 2>/dev/null | xargs grep -L "SPDX-License-Identifier"`
if [[ -z "$missing" ]]; then
   echo "All files have SPDX-License-Identifier headers"
   exit 0
fi
echo "The following files are missing SPDX-License-Identifier headers:"
echo "$missing"
echo
echo "Please replace the Apache license header comment text with:"
echo "SPDX-License-Identifier: Apache-2.0"

echo
echo "Checking committed files for traditional Apache License headers ..."
missing=`echo "$missing" | xargs ls -d 2>/dev/null | xargs grep -L "http://www.apache.org/licenses/LICENSE-2.0"`
if [[ -z "$missing" ]]; then
   echo "All remaining files have Apache 2.0 headers"
   exit 0
fi
echo "The following files are missing traditional Apache 2.0 headers:"
echo "$missing"
echo "Fatal Error - All files must have a license header"
exit 1

来源: https://github.com/hyperledger/fabric-sdk-go/blob/master/test/scripts/check_license.sh

修改配置文件

$ vim Makefile

在fabric-sdk-go/Makefile文件中,修改版本信息为当前Fabric版本,如下:

	  FABRIC_STABLE_VERSION           := 1.2.0
    FABRIC_STABLE_VERSION_MINOR     := 1.2
    FABRIC_STABLE_VERSION_MAJOR     := 1
    FABRIC_BASEIMAGE_STABLE_VERSION := 0.4.10

    FABRIC_PRERELEASE_VERSION       := 1.2.0-alpha
    FABRIC_PREV_VERSION             := 1.2.0
    FABRIC_DEVSTABLE_VERSION_MINOR  := 1.1
    FABRIC_DEVSTABLE_VERSION_MAJOR  := 1


$ vim test/fixtures/dockerenv/.env

在fabric-sdk-go/test/fixtures/dockerenv/.env 文件中

	FABRIC_FIXTURE_VERSION=v1.2
    FABRIC_CRYPTOCONFIG_VERSION=v1
    FABRIC_CA_FIXTURE_TAG=1.2.0
    FABRIC_ORDERER_FIXTURE_TAG=1.2.0
    FABRIC_PEER_FIXTURE_TAG=1.2.0
    FABRIC_COUCHDB_FIXTURE_TAG=1.2.0
    FABRIC_BUILDER_FIXTURE_TAG=1.2.0
    FABRIC_BASEOS_FIXTURE_TAG=0.4.10
    FABRIC_BASEIMAGE_FIXTURE_TAG=0.4.10

4.创建第一个区块链网络

a. 准备环境

为了构建区块链网络,使用docker构建处理不同角色的虚拟计算机。 在这里我们将尽可能保持简单。 Hyperledger Fabric需要大量证书来确保在整个端到端流程(TSL,身份验证,签名块……)期间进行加密。 创建这些文件需要一点时间,为了直接了解问题的核心,我们已经在此存储库的文件夹中为您准备了所有相关内容。

GOPATHsrc文件夹中新建一个目录如下:

$ mkdir -p $GOPATH/src/github.com/kongyixueyuan.com/bill 
$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill

新建fixtures文件夹

$ mkdir fixtures

channel-artifactscrypto-config 两个文件夹复制到 fixture 目录中

$ cd fixtures
$ sudo cp -r ~/hyfa/fabric-samples/first-network/channel-artifacts ./
$ sudo cp -r ~/hyfa/fabric-samples/first-network/crypto-config ./

channel-artifacts 文件夹名称修改为 artifacts

$ mv channel-artifacts/ artifacts

移除无用的文件

$ sudo rm -f artifacts/.gitkeep

fabric-samples/basic-network/docker-compose.yml 文件复制至当前的 fixtures 目录下, 进行编辑

$ sudo cp ~/hyfa/fabric-samples/basic-network/docker-compose.yml ./

只需将以下源文件替换即可,无需编辑

docker-compose.yml

     ca.org1.example.com:
       image: hyperledger/fabric-ca
       environment:
         - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
         - FABRIC_CA_SERVER_CA_NAME=ca.org1.example.com
         - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
         # path: crypto-config\peerOrganizations\org1.example.com\ca\..._sk
         - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/e9d74f61229b0b6b12c113940cf77de80996cace5911134cc9425c5232d9234d_sk
         - FABRIC_CA_SERVER_TLS_ENABLED=true
         - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
         - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/e9d74f61229b0b6b12c113940cf77de80996cace5911134cc9425c5232d9234d_sk
       ports:
         - "7054:7054"
       command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
       volumes:
         - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
       container_name: ca.org1.example.com
       networks:
         default:
           aliases:
             - ca.org1.example.com
             

注意:ca 部分的私钥( - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/e9d74f61229b0b6b12c113940cf77de80996cace5911134cc9425c5232d9234d_sk 与 FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/e9d74f61229b0b6b12c113940cf77de80996cace5911134cc9425c5232d9234d_sk)需要替换成你本机crypto-config\peerOrganizations\org1.example.com\ca\ 这个路径下的私钥即:( - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/34aedf41229b0b6b12c113940cf77de80996cace5911134cc9425c52334aedf4_sk 与FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/34aedf41229b0b6b12c113940cf77de80996cace5911134cc9425c5232d934aedf4_sk)后面的是这个例子啊,具体私钥参考你本机生成。

同时注意,再获取私钥之前需要先手动启动网络,从新产生Fabric网络运行环境所需证书以及私钥

fixtures 文件的所属修改为当前用户及组

$ sudo chown -R zs:zs ../fixtures

b. 测试

为了检查网络是否正常工作,使用docker-compose同时启动或停止所有容器。 进入fixtures文件夹,运行:

$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill/fixtures
$ docker-compose up -d

执行:

 $ docker ps 

将看到:两个peer,orderer和一个CA容器。 代表已成功创建了一个新的网络,可以随SDK一起使用。 要停止网络,请返回到上一个终端,按Ctrl+C并等待所有容器都停止。

提示 :当网络停止时,所有使用的容器都可以访问。 例如,这对检查日志非常有用。 可以用docker ps -a来看它们。 为了清理这些容器,需要使用docker rm $(docker ps -aq)将其删除,或者如果使用了docker-compose文件,请转至此文件的位置并运行docker-compose down

提示 :可以在后台运行docker-compose命令以保持提示。 为此,请使用参数-d ,如下所示: docker-compose up -d 。 要停止容器,请在docker-compose.yaml所在的文件夹中运行命令: docker-compose stop (或docker-compose down进行清理停止所有容器)。

最后执行命令

$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill/fixtures
$ docker-compose down

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦