• 1. 准备运行 Fabric 所需工具
  • 2. 准备 Fabric 镜像、程序以及测试代码
  • 3. 运行一个简单的 byfn 测试网
  • 4. 参考资料

1. 准备运行 Fabric 所需工具

本文所述运行环境均在 centos 系统下进行。

搭建开发环境需要安装以下工具:

  • docker
  • docker-compose
  • git
  • golang

安装 docker:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo systemctl start docker

安装 docker-compose:

$ yum install docker-compose

安装 git:

$ yum install git

安装 golang:

$ wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz

$HOME/.bash_profile 添加:

export GO111MODULE=auto
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

生效变量修改:

$ source $HOME/.bash_profile

2. 准备 Fabric 镜像、程序以及测试代码

运行 byfn 测试网的准备工作,也是搭建开发环境的过程,最终,测试网能成功运行也说明环境搭建成功。

新建一个目录并进入:

$ mkdir hyperledger && cd hyperledger

下载执行脚本,此脚本用来自动化下载 fabric 镜像、程序和测试网运行脚本等工具:

$ wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
--2020-12-15 14:07:12--  https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6521 (6.4K) [text/plain]
Saving to: ‘bootstrap.sh’bootstrap.sh              100%[==================================>]   6.37K  --.-KB/s    in 0s2020-12-15 14:07:12 (102 MB/s) - ‘bootstrap.sh’ saved [6521/6521]

给脚本添加执行权限:

$ chmod +x bootstrap.sh

执行脚本,指定下载 v1.3.0 版本的相关工具:

$ ./bootstrap.sh 1.3.0 1.3.0

点击查看脚本执行结果

Clone hyperledger/fabric-samples repo===> Cloning hyperledger/fabric-samples repo
Cloning into 'fabric-samples'...
remote: Enumerating objects: 6935, done.
remote: Total 6935 (delta 0), reused 0 (delta 0), pack-reused 6935
Receiving objects: 100% (6935/6935), 4.05 MiB | 2.07 MiB/s, done.
Resolving deltas: 100% (3608/3608), done.
===> Checking out v1.3.0 of hyperledger/fabric-samplesPull Hyperledger Fabric binaries===> Downloading version 1.3.0 platform specific fabric binaries
===> Downloading:  https://github.com/hyperledger/fabric/releases/download/v1.3.0/hyperledger-fabric-linux-amd64-1.3.0.tar.gz% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   667  100   667    0     0   1450      0 --:--:-- --:--:-- --:--:--  1450
100 43.3M  100 43.3M    0     0  2411k      0  0:00:18  0:00:18 --:--:-- 3436k
==> Done.
===> Downloading version 1.3.0 platform specific fabric-ca-client binary
===> Downloading:  https://github.com/hyperledger/fabric-ca/releases/download/v1.3.0/hyperledger-fabric-ca-linux-amd64-1.3.0.tar.gz% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   670  100   670    0     0   1196      0 --:--:-- --:--:-- --:--:--  1196
100 5109k  100 5109k    0     0  1602k      0  0:00:03  0:00:03 --:--:-- 2321k
==> Done.Pull Hyperledger Fabric docker imagesFABRIC_IMAGES: peer orderer ccenv tools
===> Pulling fabric Images
====> hyperledger/fabric-peer:1.3.0
1.3.0: Pulling from hyperledger/fabric-peer
3b37166ec614: Pull complete
504facff238f: Pull complete
ebbcacd28e10: Pull complete
c7fb3351ecad: Pull complete
2e3debadcbf7: Pull complete
8ff2951c3d3f: Pull complete
1fe35bf6bbad: Pull complete
9c1ac744ea5e: Pull complete
8bbadd32d9dc: Pull complete
2c5a546e366f: Pull complete
Digest: sha256:6756c7c48234ae6b0a8822a378681017cf6dbfeadfbf1f8a528ee6c4db343621
Status: Downloaded newer image for hyperledger/fabric-peer:1.3.0
docker.io/hyperledger/fabric-peer:1.3.0
====> hyperledger/fabric-orderer:1.3.0
1.3.0: Pulling from hyperledger/fabric-orderer
3b37166ec614: Already exists
504facff238f: Already exists
ebbcacd28e10: Already exists
c7fb3351ecad: Already exists
2e3debadcbf7: Already exists
8ff2951c3d3f: Already exists
1fe35bf6bbad: Already exists
9c1ac744ea5e: Already exists
245ee9cc02c1: Pull complete
d904630190ca: Pull complete
Digest: sha256:6ee1abcfd84031765d67544e5d6b4f3af08c3f064312c65715587d392fe7c3eb
Status: Downloaded newer image for hyperledger/fabric-orderer:1.3.0
docker.io/hyperledger/fabric-orderer:1.3.0
====> hyperledger/fabric-ccenv:1.3.0
1.3.0: Pulling from hyperledger/fabric-ccenv
3b37166ec614: Already exists
504facff238f: Already exists
ebbcacd28e10: Already exists
c7fb3351ecad: Already exists
2e3debadcbf7: Already exists
8ff2951c3d3f: Already exists
1fe35bf6bbad: Already exists
f3bda0ed3a94: Pull complete
bd61b4bf6419: Pull complete
e8dc2740dfec: Pull complete
4f3dcdea854d: Pull complete
bfb507a16746: Pull complete
9b1c9eb92240: Pull complete
f161031e61cc: Pull complete
Digest: sha256:05fce5513fcae3110ac041469ed9e0e4c9661f44782f52ef5d8930eb416c2197
Status: Downloaded newer image for hyperledger/fabric-ccenv:1.3.0
docker.io/hyperledger/fabric-ccenv:1.3.0
====> hyperledger/fabric-tools:1.3.0
1.3.0: Pulling from hyperledger/fabric-tools
3b37166ec614: Already exists
504facff238f: Already exists
ebbcacd28e10: Already exists
c7fb3351ecad: Already exists
2e3debadcbf7: Already exists
8ff2951c3d3f: Already exists
1fe35bf6bbad: Already exists
f3bda0ed3a94: Already exists
bd61b4bf6419: Already exists
e8dc2740dfec: Already exists
4f3dcdea854d: Already exists
8aa8fc04c03e: Pull complete
d5b255748f84: Pull complete
8c54f840b9e3: Pull complete
Digest: sha256:058cff3b378c1f3ebe35d56deb7bf33171bf19b327d91b452991509b8e9c7870
Status: Downloaded newer image for hyperledger/fabric-tools:1.3.0
docker.io/hyperledger/fabric-tools:1.3.0
===> Pulling fabric ca Image
====> hyperledger/fabric-ca:1.3.0
1.3.0: Pulling from hyperledger/fabric-ca
3b37166ec614: Already exists
504facff238f: Already exists
ebbcacd28e10: Already exists
c7fb3351ecad: Already exists
2e3debadcbf7: Already exists
8ff2951c3d3f: Already exists
1fe35bf6bbad: Already exists
439bddb5d064: Pull complete
2c28e4d49d97: Pull complete
457b98c91ee8: Pull complete
45b3e17861f4: Pull complete
2b1b8d679889: Pull complete
Digest: sha256:83abc367c5273a12d59ef9777637eb6c1abf04a5d00d66a0bffc55c40075850e
Status: Downloaded newer image for hyperledger/fabric-ca:1.3.0
docker.io/hyperledger/fabric-ca:1.3.0
===> List out hyperledger docker images
hyperledger/fabric-ca        1.3       5c6b20ba944f   2 years ago   244MB
hyperledger/fabric-ca        1.3.0     5c6b20ba944f   2 years ago   244MB
hyperledger/fabric-ca        latest    5c6b20ba944f   2 years ago   244MB
hyperledger/fabric-tools     1.3       c056cd9890e7   2 years ago   1.5GB
hyperledger/fabric-tools     1.3.0     c056cd9890e7   2 years ago   1.5GB
hyperledger/fabric-tools     latest    c056cd9890e7   2 years ago   1.5GB
hyperledger/fabric-ccenv     1.3       953124d80237   2 years ago   1.38GB
hyperledger/fabric-ccenv     1.3.0     953124d80237   2 years ago   1.38GB
hyperledger/fabric-ccenv     latest    953124d80237   2 years ago   1.38GB
hyperledger/fabric-orderer   1.3       f430f581b46b   2 years ago   145MB
hyperledger/fabric-orderer   1.3.0     f430f581b46b   2 years ago   145MB
hyperledger/fabric-orderer   latest    f430f581b46b   2 years ago   145MB
hyperledger/fabric-peer      1.3       f3ea63abddaa   2 years ago   151MB
hyperledger/fabric-peer      1.3.0     f3ea63abddaa   2 years ago   151MB
hyperledger/fabric-peer      latest    f3ea63abddaa   2 years ago   151MB

从以上脚本执行结果不难发现除了下载 v1.3.0 的 docker 镜像外,还下载相关二进制程序:

$ ll fabric-samples/bin
total 184944
-rwxrwxr-x 1 1001 1001 18551624 Oct 10  2018 configtxgen
-rwxrwxr-x 1 1001 1001 19693584 Oct 10  2018 configtxlator
-rwxrwxr-x 1 1001 1001 11909544 Oct 10  2018 cryptogen
-rwxrwxr-x 1 1001 1001 19532432 Oct 10  2018 discover
-rwxr-xr-x 1 1001 1001 22956616 Oct  1 03:51 fabric-ca-client
-rwxr-xr-x 1 1001 1001 30289504 Oct  1 03:52 fabric-ca-server
-rwxrwxr-x 1 1001 1001      810 Oct 10  2018 get-docker-images.sh
-rwxrwxr-x 1 1001 1001 10724192 Oct 10  2018 idemixgen
-rwxrwxr-x 1 1001 1001 23890528 Oct 10  2018 orderer
-rwxrwxr-x 1 1001 1001 31812608 Oct 10  2018 peer

将这些程序复制到 GOPATH/bin 路径下以供之后的开发使用:

$ cp fabric-samples/bin/* $GOPATH/bin

至此,fabric v1.3.0 的开发和测试环境就算搭建完毕,接下来就可以运行一个简单的测试网络来检验环境搭建是否成功。

3. 运行一个简单的 byfn 测试网

fabric-samples 目录下包含多个测试用例,最简单的测试用例即为 first-network 下的 byfn.sh 脚本的测试网络:

$ cd fabric-samples/first-network
$ ./byfn.sh up

点击查看脚本执行结果

Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n]
proceeding ...
LOCAL_VERSION=1.3.0
DOCKER_IMAGE_VERSION=1.3.0
/root/hyperledger/fabric-samples/bin/cryptogen##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
+ cryptogen generate --config=./crypto-config.yaml
org1.example.com
org2.example.com
+ res=0
+ set +x/root/hyperledger/fabric-samples/bin/configtxgen
##########################################################
#########  Generating Orderer Genesis block ##############
##########################################################
+ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
2020-12-22 16:58:04.720 CST [common/tools/configtxgen] main -> WARN 001 Omitting the channel ID for configtxgen for output operations is deprecated.  Explicitly passing the channel ID will be required in the future, defaulting to 'testchainid'.
2020-12-22 16:58:04.720 CST [common/tools/configtxgen] main -> INFO 002 Loading configuration
2020-12-22 16:58:04.749 CST [common/tools/configtxgen] doOutputBlock -> INFO 003 Generating genesis block
2020-12-22 16:58:04.750 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Writing genesis block
+ res=0
+ set +x#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
2020-12-22 16:58:04.798 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2020-12-22 16:58:04.823 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2020-12-22 16:58:04.825 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 003 Writing new channel tx
+ res=0
+ set +x#################################################################
#######    Generating anchor peer update for Org1MSP   ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
2020-12-22 16:58:04.872 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2020-12-22 16:58:04.900 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2020-12-22 16:58:04.900 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
+ res=0
+ set +x#################################################################
#######    Generating anchor peer update for Org2MSP   ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
2020-12-22 16:58:04.939 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2020-12-22 16:58:04.965 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2020-12-22 16:58:04.965 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
+ res=0
+ set +xCreating network "net_byfn" with the default driver
Creating volume "net_orderer.example.com" with default driver
Creating volume "net_peer0.org1.example.com" with default driver
Creating volume "net_peer1.org1.example.com" with default driver
Creating volume "net_peer0.org2.example.com" with default driver
Creating volume "net_peer1.org2.example.com" with default driver
Creating peer0.org2.example.com ... done
Creating orderer.example.com    ... done
Creating peer1.org2.example.com ... done
Creating peer1.org1.example.com ... done
Creating peer0.org1.example.com ... done
Creating cli                    ... done____    _____      _      ____    _____
/ ___|  |_   _|    / \    |  _ \  |_   _|
\___ \    | |     / _ \   | |_) |   | |___) |   | |    / ___ \  |  _ <    | |
|____/    |_|   /_/   \_\ |_| \_\   |_|Build your first network (BYFN) end-to-end testChannel name : mychannel
Creating channel...
+ peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
+ set +x
2020-12-22 08:58:08.849 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:08.883 UTC [cli/common] readBlock -> INFO 002 Received block: 0
===================== Channel 'mychannel' created =====================Having all peers join the channel...
+ peer channel join -b mychannel.block
+ res=0
+ set +x
2020-12-22 08:58:08.962 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:09.000 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
===================== peer0.org1 joined channel 'mychannel' =====================+ peer channel join -b mychannel.block
+ res=0
+ set +x
2020-12-22 08:58:12.085 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:12.123 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
===================== peer1.org1 joined channel 'mychannel' =====================+ peer channel join -b mychannel.block
+ res=0
+ set +x
2020-12-22 08:58:15.212 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:15.255 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
===================== peer0.org2 joined channel 'mychannel' =====================+ peer channel join -b mychannel.block
+ res=0
+ set +x
2020-12-22 08:58:18.333 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:18.369 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
===================== peer1.org2 joined channel 'mychannel' =====================Updating anchor peers for org1...
+ peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
+ set +x
2020-12-22 08:58:21.447 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:21.458 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update
===================== Anchor peers updated for org 'Org1MSP' on channel 'mychannel' =====================Updating anchor peers for org2...
+ peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
+ set +x
2020-12-22 08:58:24.535 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-12-22 08:58:24.547 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update
===================== Anchor peers updated for org 'Org2MSP' on channel 'mychannel' =====================Installing chaincode on peer0.org1...
+ peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
+ res=0
+ set +x
2020-12-22 08:58:27.630 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2020-12-22 08:58:27.630 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2020-12-22 08:58:27.841 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
===================== Chaincode is installed on peer0.org1 =====================Install chaincode on peer0.org2...
+ peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
+ res=0
+ set +x
2020-12-22 08:58:27.920 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2020-12-22 08:58:27.920 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2020-12-22 08:58:28.112 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
===================== Chaincode is installed on peer0.org2 =====================Instantiating chaincode on peer0.org2...
+ peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'
+ res=0
+ set +x
2020-12-22 08:58:28.195 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2020-12-22 08:58:28.195 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
===================== Chaincode is instantiated on peer0.org2 on channel 'mychannel' =====================Querying chaincode on peer0.org1...
===================== Querying on peer0.org1 on channel 'mychannel'... =====================
+ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
Attempting to Query peer0.org1 ...3 secs
+ res=0
+ set +x100
===================== Query successful on peer0.org1 on channel 'mychannel' =====================
Sending invoke transaction on peer0.org1 peer0.org2...
+ peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
+ res=0
+ set +x
2020-12-22 08:59:01.751 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
===================== Invoke transaction successful on peer0.org1 peer0.org2 on channel 'mychannel' =====================Installing chaincode on peer1.org2...
+ peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
+ res=0
+ set +x
2020-12-22 08:59:01.833 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2020-12-22 08:59:01.833 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2020-12-22 08:59:02.046 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
===================== Chaincode is installed on peer1.org2 =====================Querying chaincode on peer1.org2...
===================== Querying on peer1.org2 on channel 'mychannel'... =====================
+ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
Attempting to Query peer1.org2 ...3 secs
+ res=0
+ set +x90
===================== Query successful on peer1.org2 on channel 'mychannel' ============================== All GOOD, BYFN execution completed ===========_____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

从上面的运行结果可发现 fabric 环境搭建成功,同时后台正在运行一个由多个容器组成的测试网,可查看容器状态:

$ docker ps
CONTAINER ID   IMAGE                                                                                                  COMMAND                  CREATED              STATUS              PORTS                                              NAMES
0d491d9af2ab   dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab   "chaincode -peer.add…"   About a minute ago   Up About a minute                                                      dev-peer1.org2.example.com-mycc-1.0
adcc2532ea01   dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9   "chaincode -peer.add…"   About a minute ago   Up About a minute                                                      dev-peer0.org1.example.com-mycc-1.0
90fb7eaa241e   dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b   "chaincode -peer.add…"   About a minute ago   Up About a minute                                                      dev-peer0.org2.example.com-mycc-1.0
06fd0733952b   hyperledger/fabric-tools:latest                                                                        "/bin/bash"              2 minutes ago        Up 2 minutes                                                           cli
86f35856f630   hyperledger/fabric-peer:latest                                                                         "peer node start"        2 minutes ago        Up 2 minutes        0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp     peer1.org1.example.com
6683350bd5ba   hyperledger/fabric-peer:latest                                                                         "peer node start"        2 minutes ago        Up 2 minutes        0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp     peer0.org1.example.com
84b00d07df34   hyperledger/fabric-peer:latest                                                                         "peer node start"        2 minutes ago        Up 2 minutes        0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp   peer1.org2.example.com
046558652c66   hyperledger/fabric-peer:latest                                                                         "peer node start"        2 minutes ago        Up 2 minutes        0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp     peer0.org2.example.com
c0769f29999b   hyperledger/fabric-orderer:latest                                                                      "orderer"                2 minutes ago        Up 2 minutes        0.0.0.0:7050->7050/tcp                             orderer.example.com

想要停止测试网也很简单:

$ ./byfn.sh down

点击查看脚本执行结果

Stopping for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n]
proceeding ...
Stopping cli                    ... done
Stopping peer1.org1.example.com ... done
Stopping peer0.org1.example.com ... done
Stopping peer1.org2.example.com ... done
Stopping peer0.org2.example.com ... done
Stopping orderer.example.com    ... done
Removing cli                    ... done
Removing peer1.org1.example.com ... done
Removing peer0.org1.example.com ... done
Removing peer1.org2.example.com ... done
Removing peer0.org2.example.com ... done
Removing orderer.example.com    ... done
Removing network net_byfn
Removing volume net_orderer.example.com
Removing volume net_peer0.org1.example.com
Removing volume net_peer1.org1.example.com
Removing volume net_peer0.org2.example.com
Removing volume net_peer1.org2.example.com
Removing volume net_peer0.org3.example.com
WARNING: Volume net_peer0.org3.example.com not found.
Removing volume net_peer1.org3.example.com
WARNING: Volume net_peer1.org3.example.com not found.
0d491d9af2ab
adcc2532ea01
90fb7eaa241e
Untagged: dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab:latest
Deleted: sha256:c429727b979706dfc6eddf82e2938e8d450cb08097e9d5de6b71a398f0a3160a
Deleted: sha256:53f46be463bfc6eda48964fd9258402f18bef463523dedcddeced57f0976f6af
Deleted: sha256:d52ef5e6b976d0f9611f4a8e266ee156662165bdc0d8bd015010b898249a72cb
Deleted: sha256:8cd50d43c21f01469a48085a851df1327068e9c6d61818f7679501611e755c03
Untagged: dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9:latest
Deleted: sha256:1e8ab6007eab1542f9d1963d6cfb434c4b13e4e723c44c3f7e0b820f223b3499
Deleted: sha256:dadb5ad33ad330a0113cf3ab2aa264d9508b1043d2495c69d62161f08d0c8d67
Deleted: sha256:d12ba73262a090d3142ea2dbe3c788f6c1b669449cc45e575a9c4a8d54e2f3d0
Deleted: sha256:b8c6e9529351ed44fae47e62c0b0a1a0103d8d1dc03192f0c913a2afae4b1865
Untagged: dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b:latest
Deleted: sha256:981325df75500ce39d8c3b5caa09b4620bd5fe56c07c2a641c8e0b1aeb793487
Deleted: sha256:bbad1e5da01ee190fbfef8c76863a8253e7a3dad3b4511a7e450fea307c2a211
Deleted: sha256:69dfd4702a9dca81b474fc8966248c164ee3bd650d94e0cabe26f4190666e32c
Deleted: sha256:fb45098007c68bdc6031e15829926dd76ede880e925cb8b029f1553e5295fd2f

4. 参考资料

  • Install Samples, Binaries and Docker Images
  • Building Your First Network

搭建fabric开发环境相关推荐

  1. emacs 搭建racket开发环境

    emacs 搭建racket开发环境 emacs下搭建开发racket的环境,笔者之前用过下面两种模式:geiser和racket-mode.相对而言,后一种方式要显得简单.本文主要介绍后一种方式环境 ...

  2. 在CentOS 6.2上搭建vim开发环境

    在CentOS 6.2上搭建vim开发环境 最后更新日期:2013-07-05 1.首先使用Ubuntu(所在ip为192.168.16.230)翻墙登陆http://www.vim.org/,下载其 ...

  3. Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤

    之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境,那时 ...

  4. 7 centos 源码安装samba_CentOS搭建WonderTrader开发环境及v0.5.4版本发布

    前言 之前发过一篇关于如何搭建WonderTrader开发环境的文章<从零搭建WonderTrader的开发环境>,帮助不少用户解决了一些编译源码的问题.因为笔者是在Ubuntu 18.0 ...

  5. Windows下搭建PHP开发环境

    PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...

  6. python ai应用开发_AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 联系我们 OpenmindChina@microsoft.com 零.前提条件 一台能联网的电脑,使用macOS操作系统 请确保鼠标.键盘.显示器 ...

  7. mac搭建python开发环境_Mac中基于Homebrew搭建python开发环境

    转移到mac上了.这里是在lion中搭建python开发环境的简单记录.这份记录不是一份step by step.而是事后写的记录,可能有记忆遗漏.如果有错误,请指正. 1.安装homebrew的准备 ...

  8. Windows 10 搭建Python开发环境(PyCharm )

    Windows 10 搭建Python开发环境(PyCharm ) 一.安装Python3 二.安装Pycharm 怎么使用PyCharm编写Python程序,简单教程. windows下安装pyth ...

  9. Eclipse下搭建GitHub开发环境

    自从GitHub的强大性被开发者认识到后,越来越多的开发者选择使用GitHub代替SVN来进行开发.本人也不例外,最近开始研究如何使用GitHub来托管自己的代码,下面就开始介绍如何在Eclipse下 ...

最新文章

  1. 人工智能不是单纯的经验和总结
  2. 微服务网关解决方案调研和使用总结 专题
  3. 七夕节,阿里云AI发女朋友了
  4. 108-学习如何格式化字符串
  5. MATLAB中plot函数的linespec参数
  6. h5页面笔按下默认是拖动_屡屡刷屏的长页面H5原来是这样诞生的
  7. php内核分析(六)-opcode
  8. 使用.NET开发的数据库小工具 DbTool
  9. uva 524(Prime Ring Problem UVA - 524 )
  10. 再说WCF Data Contract KnownTypeAttribute
  11. 相学java_从这两套题,重新认识JS的this、作用域、闭包、对象
  12. 并发编程-concurrent指南-原子操作类-AtomicInteger
  13. 图像批处理高斯滤波降噪+峰值信噪比计算
  14. 常用邮箱接收邮件服务器与发送邮件服务器列表
  15. 程序员提高工作效率的方法
  16. 办公技巧分享:如何把PDF转换成Word的5种方法
  17. Linux ntp时间服务器的搭建和配置
  18. 数学笔记——导数1(导数的基本概念)
  19. 值得入手的键盘——Keychron K8 Pro
  20. SQL Server 数据库

热门文章

  1. Spring集成Day4
  2. yolov5模型问题解决SPPF找不到、yolov5smlx.pt文件下载、coco128文件下载、coco128yaml文件更改、coco128数据集not exist、BrokenPipeErro
  3. 活体检测在移动端模型部署
  4. 1、野火freertos学习笔记
  5. 【VK】商品多规格SKU选择器组件豪华版(uniapp版,可编译成H5、APP、各大小程序)
  6. Python程序设计基础第七章笔记:字符串
  7. Chapter 3 (Determinants): Cramer‘s rule, volume, and linear transformations (克拉默法则、体积和线性变换)
  8. MySQL Packet for query is too large (xxx > xxx)...by setting the ‘max_allowed_packet‘ variable.的解决办法
  9. Android开发秘籍 第2版
  10. python 踩坑之解决django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you insta