e2e_cli示例里有下载docker镜像的脚本download-dockerimages.sh,直接运行即可。
进入到e2e-cli路径中
cd opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
检查下载的镜像列表:
docker images
fabric/examples/e2e_cli目录下存有文件network_setup.sh用于一键部署环境并测试chaincode示例代码。
首先把fabric切换到v1.0.0版本:
git checkout v1.0.0
在e2e_cli文件夹里,执行如下脚本:
./network_setup.sh up
这个做了如下操作:
1编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin
2基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。
3基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。
4基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。
5在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。
测试同我上一篇博客的测试步骤。
以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。首先进入cli:
docker exec -it cli bash
在cli容器里查询初始值:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
可以看到余额是90。
接着调用链码,从“a”转移20到“b”:
peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}}'
再次查询“a”和“b”的值:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
查询结果显示,“a”的值为Query Result:70,“b”的值为Query Result:230。
最后关闭时首先运行exit命令退出cli容器,接着关闭fabric网络:
cd opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh down
network_setup.sh其中包括两个部分,一个是利用generateArtifacts.sh脚本文件配置组织关系和颁发证书,另一个是docker-compose-cli.yaml用于根据配置启动集群并测试chaincode的示例代码。
具体流程如下图:
generateArtifacts.sh包含三个函数:
generateCerts:使用cryptogen工具根据crypto-config.yaml来生成证书。
replacePrivateKey:将docker-compose-e2e-template.yaml文档中的ca私钥替换成具体的私钥。(本例中未使用)
generateChannelArtifacts:使用configtxgen工具根据configtx.yaml文件来生成orderer
genesis block、channel configuration transaction、anchor peer update。
docker-compose-cli.yaml文件根据组织关系启动docker集群,并在cli容器中执行command命令运行./scripts/script.sh脚本文件。
./scripts/script.sh脚本包含以下函数:
createChannel:创建channel。 joinChannel:将每个peer节点加入channel。
updateAnchorPeers installChaincode:部署chaincode。
instantiateChaincode:初始化chaincode,并设置背书策略。 chaincodeQuery
chaincodeInvoke
还有一个博文更详细地分析了network_setup.sh的启动过程,可以参考:粗略分析hyperledger-fabric之e2e_cli是如何开启网络
首先从GitHub上下载fabric-samples的源代码并进入fabric-samples的first-network文件夹:
cd opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperleger/fabric-samples.git
cd fabric-samples/first-network
执行脚本,生成MSP证书和创世区块:
./byfn.sh -m generate
该命令做的主要操作如下:
1 用cryptogen工具生成证书
2 生成排序服务的创世区块 ‘genesis.block’
3 生成通道配置交易 ‘channel.tx’
4 生成Org1MSP锚节点配置 ‘Org1MSPanchors.tx’
5 生成Org2MSP锚节点配置 ‘Org2MSPanchors.tx’
执行成功以后生成的Peer节点和排序服务节点的MSP证书文件在目录crypto-config下,包含四个Peer节点(分成两个Org)和1个排序服务节点,排序后默认使用SOLO。
生成的创世区块在目录channel-artifacts下:
tree channel-artifacts
channel-artifacts
——Org1MSPanchors.tx
——Org2MSPanchors.tx
——channel.tx
——genesis.block
启动超级账本网络:
./byfn.sh -m up
byfn.sh会根据docker compose配置文件docker-compose.yaml启动超级账本网络,还会执行scripts/script.sh脚本安装和实例化链码,并执行简单链码调用和查询操作。
成功后会出现和e2e_cli示例相同的END标识,脚本自动执行的过程结束,但超级账本网络还在继续运行。
测试结束后调用脚本关闭超级账本网络:
./byfn.sh -m down
本人在运行这个例程的时候出现了很多问题,写出来给大家做个参考。
在e2e_cli示例中:
Creating kafka2 ...
Creating kafka1 ...
Creating kafka2
Creating kafka3
Creating kafka0
Creating kafka3 ... done
Creating orderer.example.com ...
Creating orderer.example.com ... done
Creating cli ...
Creating cli ... done
____ _____ _ ____ _____ _____ ____ _____
/ ___| |_ _| / \ | _ \ |_ _| | ____| |___ \ | ____|
\___ \ | | / _ \ | |_) | | | _____ | _| __) | | _|
___) | | | / ___ \ | _ < | | |_____| | |___ / __/ | |___
|____/ |_| /_/ \_\ |_| \_\ |_| |_____| |_____| |_____|
Channel name : mychannel
Check orderering service availability...
Attempting to fetch system channel 'testchainid' ...4 secs
Attempting to fetch system channel 'testchainid' ...33 secs
Attempting to fetch system channel 'testchainid' ...59 secs
2018-03-28 02:14:34.999 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-03-28 02:14:35.098 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-03-28 02:14:55.260 UTC [grpc] Printf -> DEBU 003 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: Error while dialing dial tcp: i/o timeout"; Reconnecting to {orderer.example.com:7050 }
Error: Error connecting due to rpc error: code = Unavailable desc = grpc: the connection is unavailable
Usage:
peer channel fetch [outputfile] [flags]
Flags:
-c, --channelID string In case of a newChain command, the channel ID to create.
Global Flags:
--cafile string Path to file containing PEM-encoded trusted certificate(s) for the ordering endpoint
--logging-level string Default logging level and overrides, see core.yaml for full syntax
-o, --orderer string Ordering service endpoint
--test.coverprofile string Done (default "coverage.cov")
--tls Use TLS when communicating with the orderer endpoint
-v, --version Display current version of fabric peer server
!!!!!!!!!!!!!!! Ordering Service is not available, Please try again ... !!!!!!!!!!!!!!!!
================== ERROR !!! FAILED to execute End-2-End Scenario ==================
或者
Cannot run peer because cannot init crypto, missing opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp folder
或者
Attempting to Query PEER0 ...3 secs
Attempting to Query PEER0 ...6 secs
Attempting to Query PEER0 ...9 secs
Attempting to Query PEER0 ...12 secs
Attempting to Query PEER0 ...15 secs
Attempting to Query PEER0 ...18 secs
Attempting to Query PEER0 ...21 secs
Attempting to Query PEER0 ...24 secs
Attempting to Query PEER0 ...27 secs
Attempting to Query PEER0 ...30 secs
Attempting to Query PEER0 ...33 secs
Attempting to Query PEER0 ...37 secs
Attempting to Query PEER0 ...40 secs
Attempting to Query PEER0 ...43 secs
Attempting to Query PEER0 ...46 secs
Attempting to Query PEER0 ...49 secs
Attempting to Query PEER0 ...52 secs
Attempting to Query PEER0 ...55 secs
Attempting to Query PEER0 ...58 secs
Attempting to Query PEER0 ...61 secs
crypto证书找不到,说明没有生成Fabric公私钥、证书。查看fabric/release/linux-amd64/bin文件夹,发现文件夹下无内容,也没有crypto、configtxgen等文件。有可能bin文件夹生成了但在其他目录下。
可能原因是configtxgen版本不一致导致的。
branch版本、镜像版本、configtxgen版本都应是1.0.0。
方法是通过版本切换和下载镜像时指定版本使三者保持一致。
如果bin文件夹下还没有文件,手动运行bootstrap.1.0.0.sh下载,如果还没有,那就参考下面的解决方法从别的地方拷。
其他错误信息:
Error when setting up MSP from directory /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp: err Could not load a valid signer certificate from directory /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts, err stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts: no such file or directory
其他错误:channel-artifacts文件夹里没有内容。
说明generate步骤没做或者没成功。
Error: Error endorsing chaincode: rpc error: code = Unknown desc = Error starting container: API error (404): {“message”:”network e2ecli_default not found”}
原因是:
e2e_cli目录是固定的,启动后会创建一个docker network以此为名字,这里是e2e_cli。如果修改该目录,要修改/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/base目录下的peer-base.yaml
将网络名改成如下名称即可
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default
在first-network示例中:
报错:
cryptogen tool not found. exiting
在执行first-network例子的上一层目录下面要有一个bin文件夹,里面放着需要的可执行文件。
操作:首先看一下,该目录下面是否有一个脚本:bootstrap-1.0.0.sh , 有即执行即可。
没有的话: 你需要在fabric-samples目录下面执行如下命令,将所需要的二进制文件下载下来:
curl -sSL https://goo.gl/eYdRbX | bash
执行完以后会在fabric-samples目录下面创建一个bin目录,下面放着所需要的所有的二进制工具。
或者从fabric目录下的bin文件夹中把文件拷到fabric-samples中。
另外需注意,fabric源码的路径最好和运行程序里的配置的路径和go安装时配置的环境变量相对应,如我在环境变量里设置的go的工作目录为opt/gopath,我的fabric源码就下载到了opt/gopath/src/github.com/hyperledger。(我也不知道这个有没有关系)
参考自:
快速搭建一个Fabric 1.0的环境
Hyperledger Fabric 1.0 从零开始(五)——运行测试e2e
cryptogen tool not found. exiting错误解决办法
network_setup.sh分析