一、生成组织结构、通道和锚节点配置文件
步骤与请参考手动启动一个网络
二、下载 安装 Fabric SDK Go
<font color=red>在进行以下操作前,请确保终端可以翻墙 !</font>
安装Hyperledger Fabric SDK Go,可以很容易的与Fabric的组件进行通信。 不需要安装Fabric或Fabric CA框架,因为SDK会自动在本地处理。
安装软件包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 kevin
添加成功后必须注销/退出并重新登录(退出终端重新连接即可)
执行以下命令请确保网络通畅及稳定
$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim
下载Fabric SDK Go,因为Fabric SDK Go
一直在更新,有些方法可能会被修改,为避免错误,不要从github上直接下载
将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
$ make depend-install
修改配置文件
$ vim Makefile
fabric-sdk-go/Makefile文件中的
1.0 修改为 1.1
1.0.5 修改为 1.1.0
0.4.2 修改为 0.4.6
$ vim test/fixtures/dockerenv/.evn
fabric-sdk-go/test/fixtures/dockerenv/.env 文件中
修改Docker镜像文件的版本为 1.1.0
0.4.2 修改为 0.4.6
执行make
$ cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go
$ make
如果下载失败, 则需多尝试几次
该make过程需要一段时间(取决于网络连接情况)。 在这个过程中,虚拟网络已经建成并且已经进行了一些测试以检查您的系统是否准备就绪。 现在我们可以使用我们的第一个应用程序
注意 :有很多的输出内容,但将它放在这里并不重要。 唯一需要关心的是
fabsdkgo_integration-tests_1 exited with code 0
。 如果你有fabsdkgo_integration-tests_1 exited with code 1
那么表示有问题。 在输出的消息中向上滚动以查找错误。
三、创建第一个项目
1、创建go项目,项目名bill
2、项目中新建目录fixtures
将fabric-samples/first-network/channel-artifacts
(里面包含创世区块、通道、锚节点配置文件)和fabric-samples/first-network/crypto-config
(包含组织结构和证书)两个目录拷贝到fixtures
目录下
将 channel-artifacts
文件夹名称修改为 artifacts
$ mv channel-artifacts/ artifacts
移除无用的文件
$ sudo rm -f artifacts/.gitkeep
将 fabric-samples/basic-network/docker-compose.yml
文件复制至当前的 fixtures
目录下,或者直接新建docker-compose.yml
文件名随意, 进行编辑,该文件用于配置节点信息
$ sudo vim docker-compose.yml
-
将
network下的basic
修改为default
version: '2' networks: default: services:
-
编辑 orderer 部分
orderer.example.com: container_name: orderer.example.com image: hyperledger/fabric-orderer environment: - ORDERER_GENERAL_LOGLEVEL=debug - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp - ORDERER_GENERAL_LISTENPORT=7050 # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt, /var/hyperledger/peerOrg1/tls/ca.crt, /var/hyperledger/peerOrg2/tls/ca.crt] working_dir: /opt/gopath/src/github.com/hyperledger/fabric command: orderer ports: - 7050:7050 volumes: - ./artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls:/var/hyperledger/orderer/tls - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/var/hyperledger/peerOrg1 - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/var/hyperledger/peerOrg2 networks: default: aliases: - orderer.example.com
-
编辑 ca 部分
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/私钥文件名 - 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/私钥文件名 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
<font color=red> 注意:
FABRIC_CA_SERVER_CA_KEYFILE
和FABRIC_CA_SERVER_TLS_KEYFILE
对应的私钥要与自己生成的私钥一致,因为当前配置的Org1的CA证书,所以对应的私钥为fixtures/crypto-config/peerOrganizations/org1.example.com/ca/5839e7c26a2440eac09853ff41e199c28ea2449eed4b2884480b0891c096f58d_sk
,将私钥文件名
改为5839e7c26a2440eac09853ff41e199c28ea2449eed4b2884480b0891c096f58d_sk
即可 </font>
-
编辑Peer部分
-
peer0.org1.example.com
内容如下peer0.org1.example.com: image: hyperledger/fabric-peer container_name: peer0.org1.example.com environment: - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_VM_DOCKER_ATTACHSTDOUT=true - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_NETWORKID=bill - CORE_PEER_PROFILE_ENABLED=true - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_ADDRESSAUTODETECT=true - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer0.org1.example.com working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer command: peer node start volumes: - /var/run/:/host/var/run/ - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/var/hyperledger/msp - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/var/hyperledger/tls ports: - 7051:7051 - 7053:7053 depends_on: - orderer.example.com links: - orderer.example.com networks: default: aliases: - peer0.org1.example.com
-
peer1.org1.example.com 内容如下
peer1.org1.example.com: image: hyperledger/fabric-peer container_name: peer1.org1.example.com environment: - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_VM_DOCKER_ATTACHSTDOUT=true - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_NETWORKID=bill - CORE_PEER_PROFILE_ENABLED=true - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt - CORE_PEER_ID=peer1.org1.example.com - CORE_PEER_ADDRESSAUTODETECT=true - CORE_PEER_ADDRESS=peer1.org1.example.com:7051 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051 - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer1.org1.example.com working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer command: peer node start volumes: - /var/run/:/host/var/run/ - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/var/hyperledger/msp - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/var/hyperledger/tls ports: - 8051:7051 - 8053:7053 depends_on: - orderer.example.com links: - orderer.example.com networks: default: aliases: - peer1.org1.example.com
-
-
其余可根据实际情况进行添加
将 fixtures
文件的所属修改为当前用户及组
$ sudo chown -R zhqmac:zhqmac ../fixtures
<font color=red>编辑docker-compose.yml文件时注意格式,不要用tab
键缩进,为了方便可以到这里下载,替换CA证书即可</font>
3、测试
环境已经搭建完了,接下来测试一下
为了检查网络是否正常工作,使用docker-compose
同时启动或停止所有容器。 进入fixtures
文件夹,运行:
$ cd $GOPATH/src/github.com/kongyixueyuan.com/bill/fixtures
$ docker-compose up
控制台会输出很多不同颜色的日志(红色不等于错误)。
打开一个新终端并运行:
$ 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
执行 docker-compose down
可能会有错误,如:ERROR:network fixtures_default has active endpoints
解决方案:
-
第一种:使用 docker network disconnect -f {network} {endpoint-name},其中的 {endpoint-name} 可以使用命令 docker network inspect {network} 获得。然后再做你想做的操作。
-
第二种:重启 Docker service:sudo service docker restart。然后再做你想做的操作。