1、git安装
apt-getinstallgit
查看当前安装git的版本:
gitversion
验证git是否安装好。
2、golang环境搭建
(1)安装
apt-getinstallgolang
(2)查看go的安装路径
goenv
(3)配置Go环境变量,对应有{GOROOT,GOPATH,PATH}:
对应修改路径:
mkdir/opt/gopath/src/github.com/hyperledger/-p vi/etc/profile exportGOROOT=/usr/lib/go-1.7 exportGOPATH=/opt/gopath exportPATH=$GOROOT/bin:$GOPATH/bin:$PATH source/etc/profile
3、docker安装
aptinstalldockerdocker.io systemctlstartdocker systemctlenabledocker
4、安装docker-compose
首先,安装 python-pip 软件包:
aptinstallpython-pip
安装docker-compose版本不低于1.7.0:
pipinstalldocker-compose
5、安装相关依赖包
aptinstalllibtoollibltdl-dev-y
6、获取fabric
cd/opt/gopath/src/github.com/hyperledger/ gitclonehttps://github.com/hyperledger/fabric.git
7、构建configtxgen工具
cd/opt/gopath/src/github.com/hyperledger/fabric/ chmod755./scripts/goListFiles.sh makeconfigtxgen 结果将输出以下内容 root@ubuntu-virtual-machine:/opt/gopath/src/github.com/hyperledger/fabric#makeconfigtxgen build/bin/configtxgen CGO_CFLAGS=""GOBIN=/opt/gopath/src/github.com/hyperledger/fabric/build/bingoinstall-tags"nopkcs11"-ldflags"-Xgithub.com/hyperledger/fabric/common/Metadata.Version=1.0.0-alpha3-snapshot-010dcf62-Xgithub.com/hyperledger/fabric/common/Metadata.BaseVersion=0.3.1-Xgithub.com/hyperledger/fabric/common/Metadata.BaseDockerLabel=org.hyperledger.fabric-Xgithub.com/hyperledger/fabric/common/Metadata.DockerNamespace=hyperledger-Xgithub.com/hyperledger/fabric/common/Metadata.BaseDockerNamespace=hyperledger"github.com/hyperledger/fabric/common/configtx/tool/configtxgen Binaryavailableasbuild/bin/configtxgen
8、下载fabric镜像
cd/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli chmod+xdownload-dockerimages.sh ./download-dockerimages.sh
确认镜像
dockerimages
9、手动执行交易过程
9.1、配置交易生成器
确保你有配置文件制品(orderer.block 和channel.tx,文件位于 /fabric/examples/e2e_cli/crypto/orderer 目录),如果没有,通过以下命令生成:
cd/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli
generateCfgTrx.sh 脚本接收一个通道ID 参数(channel-ID)。如果没有提供这个参数, 生成的通道会取默认的通道名mychannel。 命令如下:
./generateCfgTrx.shmychannel
这个脚本执行后,会生成2 个文件orderer.block 和channel.tx。文件位于/fabric/examples/e2e_cli/crypto/orderer 目录。
Orderer.block 文件是排序服务的创世区块,
channel.tx 文件包含了新的通道的配置信息。
正如先前描述的,这两个文件都是根据configtx.yaml 文件的配置内容生成,并且包含像加密证书资料和网络节点信息的数据。
9.2、修改docker-compose 文件
打开docker-compose.yaml 文件,添加注释到script.sh 文件前面,目的是不让它自动执行交易脚本。
working_dir:/opt/gopath/src/github.com/hyperledger/fabric/peer #command:/bin/bash-c'./scripts/script.sh${CHANNEL_NAME}'
保存文件。
9.3、启动网络
CHANNEL_NAME=mychanneldocker-composeup-d
9.4、创建通道
执行下列命令进入cli 容器,
dockerexec-itclibash
成功执行命令后,你会看到如下信息:
root@db1538155f54:/opt/gopath/src/github.com/hyperledger/fabric/peer#
运行如下创建通道命令,通过-c 指定通道名,-f 指定通道配置交易文件,这里的我们是crypto/orderer/channel.tx,你也可以你自己的不同名字的配置交易文件。
因为channel create 命令是针对orderer 容器运行,因此我们需要覆盖先前设置的环境变量,完整的命令如下:
CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig CORE_PEER_LOCALMSPID="OrdererMSP" peerchannelcreate-oorderer0:7050-cmychannel-fcrypto/orderer/channel.tx--tls$CORE_PEER_TLS_ENABLED--cafile$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem
注意:下面的其他命令依然在cli 容器中执行,而且要记住命令里每个peer 对应的环境变量。
9.5、加入通道
通过命令channel join 加入特定的peer 到通道中,命令如下:
CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer0/localMspConfig CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_LOCALMSPID="Org0MSP" CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer0/localMspConfig/cacerts/peerOrg0.pem peerchanneljoin-bmychannel.block
成功执行命令后,可以通过命令docker exec -it peer0 bash 进入到peer0 容器中去验证是否成功加入了通道。切换到如下目录 /var/hyperledger/production/ledgersData/chains/chains 会发现生成了以通道名命名的目录,目录下生成一个名字为blockfile_000000 的文件。通过更改环境变量,可以根据需要加入其它peer 到通道中。 比如,加入peer2 到通道中的命令如下:
CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig/cacerts/peerOrg1.pem peerchanneljoin-bmychannel.block
加入peer3 到通道中的命令如下:
/opt/gopath/src/github.com/hyperledger/fabric/peer#CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer3/localMspConfig CORE_PEER_ADDRESS=peer3:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer3/localMspConfig/cacerts/peerOrg1.pem peerchanneljoin-bmychannel.block
9.6、在远程peer 上安装chaincode
安装fabric 提供的例子chaincode 到peer2 上,命令为:
CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfigCORE_PEER_ADDRESS=peer2:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig/cacerts/peerOrg1.pem peerchaincodeinstall-nmycc-v1.0-pgithub.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
在peer2 容器的/var/hyperledger/production/chaincodes 目录下发现生成了一个mycc.1.0 文件,这证明了chaincode mycc 安装成功。而在其它同一通道的peer(如peer0,peer3,注意,我们并没有把peer1 加入mychannel 通道)对应的容器里不会有此文件。
9.7、实例化chaincode 并定义背书策略
在特定peer 上实例化chaincode 会启动一个chaincode 容器,这个chaincode 容器专门为这个特定的peer 工作,然后为chaincode 设置背书策略。此例中定义的背书策略是只要来自Org0 或Org1 的任何一个peer 背书即可。命令如下:
#执行命令前记得设置环境变量。 #注意传递正确的-C参数,也就是通道名,我们例子中使用的是mychannel. CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig/cacerts/peerOrg1.pem peerchaincodeinstantiate-oorderer0:7050--tls$CORE_PEER_TLS_ENABLED--cafile$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem-Cmychannel-nmycc-v1.0-pgithub.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02-c'{"Args":["init","a","100","b","200"]}'-P"OR('Org0MSP.member','Org1MSP.member')"
注意这里的的-P 参数的写法,这里的背书策略是:"OR ('Org0MSP.member','Org1MSP.member')"
9.8、调用chaincode
执行invoke 命令前记住设置全局环境变量
CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_LOCALMSPID="Org1MSP"CORE_PEER_TLS_ROOTCERT_FILE=$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/peer/peer2/localMspConfig/cacerts/peerOrg1.pem
我们在peer2 上执行命令,所以环境变量设置为peer2,执行invoke 命令前,先执行query 命令: 先执行查询命令:
peerchaincodequery-Cmychannel-nmycc-c'{"Args":["query","a"]}'
查询结果显示: Query Result: 100 然后执行invoke 命令:
peerchaincodeinvoke-oorderer0:7050--tls$CORE_PEER_TLS_ENABLED--cafile$GOPATH/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem-Cmychannel-nmycc-c'{"Args":["invoke","10"]}'
注意,通道名不能错,如果这里写成-C mychannel,必须跟实际创建通道的名字一致。 通道名错误,会报如下错误: Error: Error endorsing invoke: rpc error: code = 2 desc = Failed to deserialize creator identity,err MSP Org1MSP is unknown 再次执行查询命令(查询a 的值):
查询结果显示: Query Result: 90 再次执行查询命令(查询b 的值):查询结果显示: Query Result: 210 如果你细心,就会发现,我们实例化chaincode 的时候b 的值是200,现在是210,再次验证了我们的交易成功执行了。
10、常见问题:
(1)docker镜像下载慢问题
由于镜像源在国外,导致下载速度慢,源切换为阿里这边
(2)如何保存docker images,方便下次或者别人搭建环境
docker save命令-打包image
打包:dockersavehyperledger/fabric-peer:latest>fabric-peer_latest.tar导入:
dockerload<fabric-peer_latest.tar(3)、环境清理
用下列命令删除当前运行的容器
dockerrm-f$(dockerps-aq)