一、为指定channel生成证书、密钥和节点配置文件
进入fabric-sample目录运行byfn.sh -m generate -c firstchannel,生成指定channel的相关节点证书以及配置文件
[root@localhost first-network]# ./byfn.sh -m generate -c firstchannel Generating certs and genesis block for with channel 'firstchannel' and CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... /home/go/src/github.com/hyperledger/bin/cryptogen ########################################################## ##### Generate certificates using cryptogen tool ######### ########################################################## + cryptogen generate --config=./crypto-config.yaml org1.example.com org2.example.com + res=0 + set +x /home/go/src/github.com/hyperledger/bin/configtxgen ########################################################## ######### Generating Orderer Genesis block ############## ########################################################## + configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block 2020-01-13 23:46:35.681 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2020-01-13 23:46:35.706 CST [msp] getMspConfig -> INFO 002 Loading NodeOUs 2020-01-13 23:46:35.707 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs 2020-01-13 23:46:35.707 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Generating genesis block 2020-01-13 23:46:35.708 CST [common/tools/configtxgen] doOutputBlock -> INFO 005 Writing genesis block + res=0 + set +x ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID firstchannel 2020-01-13 23:46:35.735 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2020-01-13 23:46:35.758 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx 2020-01-13 23:46:35.759 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs 2020-01-13 23:46:35.760 CST [msp] getMspConfig -> INFO 004 Loading NodeOUs 2020-01-13 23:46:35.847 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 005 Writing new channel tx + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org1MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID firstchannel -asOrg Org1MSP 2020-01-13 23:46:35.874 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2020-01-13 23:46:35.897 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update 2020-01-13 23:46:35.898 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 firstchannel -asOrg Org2MSP 2020-01-13 23:46:35.925 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2020-01-13 23:46:35.948 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update 2020-01-13 23:46:35.948 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update + res=0 + set +x [root@localhost first-network]#
此时channel-artifacts/,会有4个配置文件
[root@localhost first-network]# cd channel-artifacts/ [root@localhost channel-artifacts]# ll 总用量 28 -rw-r--r-- 1 root root 352 1月 13 23:46 channel.tx -rw-r--r-- 1 root root 12647 1月 13 23:46 genesis.block -rw-r--r-- 1 root root 290 1月 13 23:46 Org1MSPanchors.tx -rw-r--r-- 1 root root 290 1月 13 23:46 Org2MSPanchors.tx [root@localhost channel-artifacts]#
channel、创世区块、两个组织的锚节点配置文件,
crypto-config目录里放置了网络的各个节点的证书文件和秘钥
[root@localhost crypto-config]# tree . ├── ordererOrganizations │?? └── example.com │?? ├── ca │?? │?? ├── 48e4ab6336bbd21ff94abbbdbdfd898f733b30de70f640de9531951b5c92a76c_sk │?? │?? └── ca.example.com-cert.pem │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── Admin@example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.example.com-cert.pem │?? │?? └── tlscacerts │?? │?? └── tlsca.example.com-cert.pem │?? ├── orderers │?? │?? └── orderer.example.com │?? │?? ├── msp │?? │?? │?? ├── admincerts │?? │?? │?? │?? └── Admin@example.com-cert.pem │?? │?? │?? ├── cacerts │?? │?? │?? │?? └── ca.example.com-cert.pem │?? │?? │?? ├── keystore │?? │?? │?? │?? └── 79cc6ab0df1fcfcbcbb277d043a1f2abf1d52fa0733b6603aa33b4aeb9d30434_sk │?? │?? │?? ├── signcerts │?? │?? │?? │?? └── orderer.example.com-cert.pem │?? │?? │?? └── tlscacerts │?? │?? │?? └── tlsca.example.com-cert.pem │?? │?? └── tls │?? │?? ├── ca.crt │?? │?? ├── server.crt │?? │?? └── server.key │?? ├── tlsca │?? │?? ├── 05bb775fe81085d478be5db4f72ee7f4d2e7ced6e1cc3a8e3efab502d9e86240_sk │?? │?? └── tlsca.example.com-cert.pem │?? └── users │?? └── Admin@example.com │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── Admin@example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.example.com-cert.pem │?? │?? ├── keystore │?? │?? │?? └── 443c3e090347260cd0773f023c617944b3c1f717e76b767675027bad5280a3ea_sk │?? │?? ├── signcerts │?? │?? │?? └── Admin@example.com-cert.pem │?? │?? └── tlscacerts │?? │?? └── tlsca.example.com-cert.pem │?? └── tls │?? ├── ca.crt │?? ├── client.crt │?? └── client.key └── peerOrganizations ├── org1.example.com │?? ├── ca │?? │?? ├── b1fc8628b1610ee770cadb0e8a66c4c78ba4d23b678eda7f2fe0630433c53ce6_sk │?? │?? └── ca.org1.example.com-cert.pem │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── Admin@org1.example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.org1.example.com-cert.pem │?? │?? ├── config.yaml │?? │?? └── tlscacerts │?? │?? └── tlsca.org1.example.com-cert.pem │?? ├── peers │?? │?? ├── peer0.org1.example.com │?? │?? │?? ├── msp │?? │?? │?? │?? ├── admincerts │?? │?? │?? │?? │?? └── Admin@org1.example.com-cert.pem │?? │?? │?? │?? ├── cacerts │?? │?? │?? │?? │?? └── ca.org1.example.com-cert.pem │?? │?? │?? │?? ├── config.yaml │?? │?? │?? │?? ├── keystore │?? │?? │?? │?? │?? └── a75c8f89e7788658415edd4793262d74c2c2e675135885bf1e1097642fc3e458_sk │?? │?? │?? │?? ├── signcerts │?? │?? │?? │?? │?? └── peer0.org1.example.com-cert.pem │?? │?? │?? │?? └── tlscacerts │?? │?? │?? │?? └── tlsca.org1.example.com-cert.pem │?? │?? │?? └── tls │?? │?? │?? ├── ca.crt │?? │?? │?? ├── server.crt │?? │?? │?? └── server.key │?? │?? └── peer1.org1.example.com │?? │?? ├── msp │?? │?? │?? ├── admincerts │?? │?? │?? │?? └── Admin@org1.example.com-cert.pem │?? │?? │?? ├── cacerts │?? │?? │?? │?? └── ca.org1.example.com-cert.pem │?? │?? │?? ├── config.yaml │?? │?? │?? ├── keystore │?? │?? │?? │?? └── fc3b76a55a85188ee90aeb0f59c58bb8cf7e42158c6eb84bbd0a0eb65b0e85ad_sk │?? │?? │?? ├── signcerts │?? │?? │?? │?? └── peer1.org1.example.com-cert.pem │?? │?? │?? └── tlscacerts │?? │?? │?? └── tlsca.org1.example.com-cert.pem │?? │?? └── tls │?? │?? ├── ca.crt │?? │?? ├── server.crt │?? │?? └── server.key │?? ├── tlsca │?? │?? ├── 0849b9f55fde11a99c0e924a21f19783dd50eacffe5933ed191f5fe35ace76ee_sk │?? │?? └── tlsca.org1.example.com-cert.pem │?? └── users │?? ├── Admin@org1.example.com │?? │?? ├── msp │?? │?? │?? ├── admincerts │?? │?? │?? │?? └── Admin@org1.example.com-cert.pem │?? │?? │?? ├── cacerts │?? │?? │?? │?? └── ca.org1.example.com-cert.pem │?? │?? │?? ├── keystore │?? │?? │?? │?? └── d4984ad22f91a87a8f6ed8137d3bf4424549fe4b5f22224b3a817bb3737c5528_sk │?? │?? │?? ├── signcerts │?? │?? │?? │?? └── Admin@org1.example.com-cert.pem │?? │?? │?? └── tlscacerts │?? │?? │?? └── tlsca.org1.example.com-cert.pem │?? │?? └── tls │?? │?? ├── ca.crt │?? │?? ├── client.crt │?? │?? └── client.key │?? └── User1@org1.example.com │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── User1@org1.example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.org1.example.com-cert.pem │?? │?? ├── keystore │?? │?? │?? └── cbafefbcd58ecf9d9a77fe3b912ea0a16b60547b4fe556cf14c97e371f8ee8a4_sk │?? │?? ├── signcerts │?? │?? │?? └── User1@org1.example.com-cert.pem │?? │?? └── tlscacerts │?? │?? └── tlsca.org1.example.com-cert.pem │?? └── tls │?? ├── ca.crt │?? ├── client.crt │?? └── client.key └── org2.example.com ├── ca │?? ├── 2d7523d79b67beea7075c098932a85c8abc621915c1f080f3e024f732ec3ced1_sk │?? └── ca.org2.example.com-cert.pem ├── msp │?? ├── admincerts │?? │?? └── Admin@org2.example.com-cert.pem │?? ├── cacerts │?? │?? └── ca.org2.example.com-cert.pem │?? ├── config.yaml │?? └── tlscacerts │?? └── tlsca.org2.example.com-cert.pem ├── peers │?? ├── peer0.org2.example.com │?? │?? ├── msp │?? │?? │?? ├── admincerts │?? │?? │?? │?? └── Admin@org2.example.com-cert.pem │?? │?? │?? ├── cacerts │?? │?? │?? │?? └── ca.org2.example.com-cert.pem │?? │?? │?? ├── config.yaml │?? │?? │?? ├── keystore │?? │?? │?? │?? └── aeaeeff6297ae7e62bf8f8f4333933506e5f102125c3b13cefcb133e6b3eb971_sk │?? │?? │?? ├── signcerts │?? │?? │?? │?? └── peer0.org2.example.com-cert.pem │?? │?? │?? └── tlscacerts │?? │?? │?? └── tlsca.org2.example.com-cert.pem │?? │?? └── tls │?? │?? ├── ca.crt │?? │?? ├── server.crt │?? │?? └── server.key │?? └── peer1.org2.example.com │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── Admin@org2.example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.org2.example.com-cert.pem │?? │?? ├── config.yaml │?? │?? ├── keystore │?? │?? │?? └── 162f9c8f83a304bd1a55ff387c401206893531d8748ce62c63f8d355de558aed_sk │?? │?? ├── signcerts │?? │?? │?? └── peer1.org2.example.com-cert.pem │?? │?? └── tlscacerts │?? │?? └── tlsca.org2.example.com-cert.pem │?? └── tls │?? ├── ca.crt │?? ├── server.crt │?? └── server.key ├── tlsca │?? ├── b196a7c2ab65ca9da09abdb438d50290f6de23767dafea12b2510bc47bf11d68_sk │?? └── tlsca.org2.example.com-cert.pem └── users ├── Admin@org2.example.com │?? ├── msp │?? │?? ├── admincerts │?? │?? │?? └── Admin@org2.example.com-cert.pem │?? │?? ├── cacerts │?? │?? │?? └── ca.org2.example.com-cert.pem │?? │?? ├── keystore │?? │?? │?? └── 37a15cca88cbb00b9f327a14b94f898262d3c90375d69db05c42fd0447bda63d_sk │?? │?? ├── signcerts │?? │?? │?? └── Admin@org2.example.com-cert.pem │?? │?? └── tlscacerts │?? │?? └── tlsca.org2.example.com-cert.pem │?? └── tls │?? ├── ca.crt │?? ├── client.crt │?? └── client.key └── User1@org2.example.com ├── msp │?? ├── admincerts │?? │?? └── User1@org2.example.com-cert.pem │?? ├── cacerts │?? │?? └── ca.org2.example.com-cert.pem │?? ├── keystore │?? │?? └── aab3e8ffcd1004944815d152cc3450541852d9b5320ead700f5596a617ca6c85_sk │?? ├── signcerts │?? │?? └── User1@org2.example.com-cert.pem │?? └── tlscacerts │?? └── tlsca.org2.example.com-cert.pem └── tls ├── ca.crt ├── client.crt └── client.key 109 directories, 107 files [root@localhost crypto-config]#
二、用docker-compose指定配置文件启动网络
[root@localhost first-network]# docker-compose -f docker-compose-cli.yaml up Creating 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 orderer.example.com ... done Creating peer1.org1.example.com ... done Creating peer1.org2.example.com ... done Creating peer0.org2.example.com ... done Creating peer0.org1.example.com ... done Creating cli ... done Attaching to peer0.org1.example.com, peer1.org1.example.com, peer0.org2.example.com, orderer.example.com, peer1.org2.example.com, cli peer0.org2.example.com | 2020-01-13 15:55:11.447 UTC [msp] getMspConfig -> INFO 001 Loading NodeOUs orderer.example.com | 2020-01-13 15:55:11.643 UTC [orderer/common/server] prettyPrintStruct -> INFO 001 Orderer config values: orderer.example.com | General.LedgerType = "file" orderer.example.com | General.ListenAddress = "0.0.0.0" orderer.example.com | General.ListenPort = 7050 orderer.example.com | General.TLS.Enabled = true orderer.example.com | General.TLS.PrivateKey = "/var/hyperledger/orderer/tls/server.key" orderer.example.com | General.TLS.Certificate = "/var/hyperledger/orderer/tls/server.crt" orderer.example.com | General.TLS.RootCAs = [/var/hyperledger/orderer/tls/ca.crt] orderer.example.com | General.TLS.ClientAuthRequired = false orderer.example.com | General.TLS.ClientRootCAs = [] orderer.example.com | General.Keepalive.ServerMinInterval = 1m0s orderer.example.com | General.Keepalive.ServerInterval = 2h0m0s orderer.example.com | General.Keepalive.ServerTimeout = 20s orderer.example.com | General.GenesisMethod = "file" orderer.example.com | General.GenesisProfile = "SampleInsecureSolo" orderer.example.com | General.SystemChannel = "testchainid" orderer.example.com | General.GenesisFile = "/var/hyperledger/orderer/orderer.genesis.block" orderer.example.com | General.Profile.Enabled = false orderer.example.com | General.Profile.Address = "0.0.0.0:6060" orderer.example.com | General.LogLevel = "INFO" orderer.example.com | General.LogFormat = "%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}" orderer.example.com | General.LocalMSPDir = "/var/hyperledger/orderer/msp" orderer.example.com | General.LocalMSPID = "OrdererMSP" orderer.example.com | General.BCCSP.ProviderName = "SW" orderer.example.com | General.BCCSP.SwOpts.SecLevel = 256 orderer.example.com | General.BCCSP.SwOpts.HashFamily = "SHA2" orderer.example.com | General.BCCSP.SwOpts.Ephemeral = false orderer.example.com | General.BCCSP.SwOpts.FileKeystore.KeyStorePath = "/var/hyperledger/orderer/msp/keystore" orderer.example.com | General.BCCSP.SwOpts.DummyKeystore = orderer.example.com | General.BCCSP.PluginOpts = orderer.example.com | General.BCCSP.Pkcs11Opts = orderer.example.com | General.Authentication.TimeWindow = 15m0s orderer.example.com | FileLedger.Location = "/var/hyperledger/production/orderer" orderer.example.com | FileLedger.Prefix = "hyperledger-fabric-ordererledger" orderer.example.com | RAMLedger.HistorySize = 1000 orderer.example.com | Kafka.Retry.ShortInterval = 5s orderer.example.com | Kafka.Retry.ShortTotal = 10m0s orderer.example.com | Kafka.Retry.LongInterval = 5m0s orderer.example.com | Kafka.Retry.LongTotal = 12h0m0s orderer.example.com | Kafka.Retry.NetworkTimeouts.DialTimeout = 10s orderer.example.com | Kafka.Retry.NetworkTimeouts.ReadTimeout = 10s orderer.example.com | Kafka.Retry.NetworkTimeouts.WriteTimeout = 10s orderer.example.com | Kafka.Retry.Metadata.RetryMax = 3 orderer.example.com | Kafka.Retry.Metadata.RetryBackoff = 250ms orderer.example.com | Kafka.Retry.Producer.RetryMax = 3 orderer.example.com | Kafka.Retry.Producer.RetryBackoff = 100ms orderer.example.com | Kafka.Retry.Consumer.RetryBackoff = 2s orderer.example.com | Kafka.Verbose = false orderer.example.com | Kafka.Version = 0.10.2.0 orderer.example.com | Kafka.TLS.Enabled = false orderer.example.com | Kafka.TLS.PrivateKey = "" orderer.example.com | Kafka.TLS.Certificate = "" orderer.example.com | Kafka.TLS.RootCAs = [] orderer.example.com | Kafka.TLS.ClientAuthRequired = false orderer.example.com | Kafka.TLS.ClientRootCAs = [] orderer.example.com | Debug.BroadcastTraceDir = "" orderer.example.com | Debug.DeliverTraceDir = "" orderer.example.com | 2020-01-13 15:55:11.643 UTC [orderer/common/server] initializeServerConfig -> INFO 002 Starting orderer with TLS enabled orderer.example.com | 2020-01-13 15:55:11.664 UTC [fsblkstorage] newBlockfileMgr -> INFO 003 Getting block information from block storage peer0.org1.example.com | 2020-01-13 15:55:10.912 UTC [msp] getMspConfig -> INFO 001 Loading NodeOUs orderer.example.com | 2020-01-13 15:55:11.735 UTC [orderer/commmon/multichannel] NewRegistrar -> INFO 004 Starting system channel 'testchainid' with genesis block hash eaaec7c4594a95effa4526d27697326f1b9d8a205cf18881ad77334c31e6f6bf and orderer type solo peer0.org2.example.com | 2020-01-13 15:55:11.531 UTC [nodeCmd] serve -> INFO 002 Starting peer: peer0.org2.example.com | Version: 1.1.0 peer0.org2.example.com | Go version: go1.9.2 peer0.org2.example.com | OS/Arch: linux/amd64 peer0.org2.example.com | Experimental features: false peer0.org2.example.com | Chaincode: peer0.org2.example.com | Base Image Version: 0.4.6 peer0.org2.example.com | Base Docker Namespace: hyperledger peer0.org2.example.com | Base Docker Label: org.hyperledger.fabric peer0.org2.example.com | Docker Namespace: hyperledger peer0.org2.example.com | orderer.example.com | 2020-01-13 15:55:11.735 UTC [orderer/common/server] Start -> INFO 005 Starting orderer: orderer.example.com | Version: 1.1.0 orderer.example.com | Go version: go1.9.2 orderer.example.com | OS/Arch: linux/amd64 orderer.example.com | Experimental features: false orderer.example.com | 2020-01-13 15:55:11.735 UTC [orderer/common/server] Start -> INFO 006 Beginning to serve requests peer0.org1.example.com | 2020-01-13 15:55:11.004 UTC [nodeCmd] serve -> INFO 002 Starting peer: peer0.org1.example.com | Version: 1.1.0 peer0.org1.example.com | Go version: go1.9.2 peer0.org1.example.com | OS/Arch: linux/amd64 peer0.org1.example.com | Experimental features: false peer0.org1.example.com | Chaincode: peer0.org1.example.com | Base Image Version: 0.4.6 peer0.org1.example.com | Base Docker Namespace: hyperledger peer0.org1.example.com | Base Docker Label: org.hyperledger.fabric peer0.org1.example.com | Docker Namespace: hyperledger peer0.org1.example.com | peer0.org1.example.com | 2020-01-13 15:55:11.004 UTC [ledgermgmt] initialize -> INFO 003 Initializing ledger mgmt peer0.org1.example.com | 2020-01-13 15:55:11.004 UTC [kvledger] NewProvider -> INFO 004 Initializing ledger provider peer1.org1.example.com | 2020-01-13 15:55:11.188 UTC [msp] getMspConfig -> INFO 001 Loading NodeOUs peer1.org1.example.com | 2020-01-13 15:55:11.277 UTC [nodeCmd] serve -> INFO 002 Starting peer: peer1.org1.example.com | Version: 1.1.0 peer1.org1.example.com | Go version: go1.9.2 peer1.org1.example.com | OS/Arch: linux/amd64 peer1.org1.example.com | Experimental features: false peer1.org1.example.com | Chaincode: peer1.org1.example.com | Base Image Version: 0.4.6 peer1.org1.example.com | Base Docker Namespace: hyperledger peer1.org1.example.com | Base Docker Label: org.hyperledger.fabric peer1.org1.example.com | Docker Namespace: hyperledger peer1.org1.example.com | peer0.org2.example.com | 2020-01-13 15:55:11.531 UTC [ledgermgmt] initialize -> INFO 003 Initializing ledger mgmt peer1.org2.example.com | 2020-01-13 15:55:11.619 UTC [msp] getMspConfig -> INFO 001 Loading NodeOUs peer1.org1.example.com | 2020-01-13 15:55:11.277 UTC [ledgermgmt] initialize -> INFO 003 Initializing ledger mgmt peer1.org1.example.com | 2020-01-13 15:55:11.277 UTC [kvledger] NewProvider -> INFO 004 Initializing ledger provider peer1.org1.example.com | 2020-01-13 15:55:11.374 UTC [kvledger] NewProvider -> INFO 005 ledger provider Initialized peer1.org1.example.com | 2020-01-13 15:55:11.374 UTC [ledgermgmt] initialize -> INFO 006 ledger mgmt initialized peer1.org1.example.com | 2020-01-13 15:55:11.374 UTC [peer] func1 -> INFO 007 Auto-detected peer address: 172.30.0.3:7051 peer1.org1.example.com | 2020-01-13 15:55:11.375 UTC [peer] func1 -> INFO 008 Returning peer1.org1.example.com:7051 peer1.org1.example.com | 2020-01-13 15:55:11.375 UTC [peer] func1 -> INFO 009 Auto-detected peer address: 172.30.0.3:7051 peer1.org1.example.com | 2020-01-13 15:55:11.375 UTC [peer] func1 -> INFO 00a Returning peer1.org1.example.com:7051 peer0.org1.example.com | 2020-01-13 15:55:11.116 UTC [kvledger] NewProvider -> INFO 005 ledger provider Initialized peer0.org1.example.com | 2020-01-13 15:55:11.116 UTC [ledgermgmt] initialize -> INFO 006 ledger mgmt initialized peer1.org2.example.com | 2020-01-13 15:55:11.697 UTC [nodeCmd] serve -> INFO 002 Starting peer: peer1.org2.example.com | Version: 1.1.0 peer1.org2.example.com | Go version: go1.9.2 peer1.org2.example.com | OS/Arch: linux/amd64 peer1.org2.example.com | Experimental features: false peer1.org2.example.com | Chaincode: peer1.org2.example.com | Base Image Version: 0.4.6 peer1.org2.example.com | Base Docker Namespace: hyperledger peer1.org2.example.com | Base Docker Label: org.hyperledger.fabric peer1.org2.example.com | Docker Namespace: hyperledger peer1.org2.example.com | peer0.org2.example.com | 2020-01-13 15:55:11.531 UTC [kvledger] NewProvider -> INFO 004 Initializing ledger provider peer1.org2.example.com | 2020-01-13 15:55:11.697 UTC [ledgermgmt] initialize -> INFO 003 Initializing ledger mgmt peer1.org2.example.com | 2020-01-13 15:55:11.697 UTC [kvledger] NewProvider -> INFO 004 Initializing ledger provider peer0.org2.example.com | 2020-01-13 15:55:11.639 UTC [kvledger] NewProvider -> INFO 005 ledger provider Initialized peer1.org1.example.com | 2020-01-13 15:55:11.377 UTC [nodeCmd] serve -> INFO 00b Starting peer with TLS enabled peer0.org2.example.com | 2020-01-13 15:55:11.639 UTC [ledgermgmt] initialize -> INFO 006 ledger mgmt initialized peer1.org2.example.com | 2020-01-13 15:55:11.856 UTC [kvledger] NewProvider -> INFO 005 ledger provider Initialized peer1.org2.example.com | 2020-01-13 15:55:11.856 UTC [ledgermgmt] initialize -> INFO 006 ledger mgmt initialized peer0.org2.example.com | 2020-01-13 15:55:11.639 UTC [peer] func1 -> INFO 007 Auto-detected peer address: 172.30.0.4:7051 peer1.org1.example.com | 2020-01-13 15:55:11.381 UTC [eventhub_producer] start -> INFO 00c Event processor started peer1.org1.example.com | 2020-01-13 15:55:11.382 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00d Entering computeChaincodeEndpoint with peerHostname: peer1.org1.example.com peer1.org1.example.com | 2020-01-13 15:55:11.383 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00e Exit with ccEndpoint: peer1.org1.example.com:7052 peer1.org1.example.com | 2020-01-13 15:55:11.383 UTC [nodeCmd] createChaincodeServer -> WARN 00f peer.chaincodeListenAddress is not set, using peer1.org1.example.com:7052 peer0.org1.example.com | 2020-01-13 15:55:11.116 UTC [peer] func1 -> INFO 007 Auto-detected peer address: 172.30.0.2:7051 peer0.org2.example.com | 2020-01-13 15:55:11.640 UTC [peer] func1 -> INFO 008 Returning peer0.org2.example.com:7051 peer1.org2.example.com | 2020-01-13 15:55:11.856 UTC [peer] func1 -> INFO 007 Auto-detected peer address: 172.30.0.6:7051 peer1.org1.example.com | 2020-01-13 15:55:11.393 UTC [chaincode] NewChaincodeSupport -> INFO 010 Chaincode support using peerAddress: peer1.org1.example.com:7052 peer1.org2.example.com | 2020-01-13 15:55:11.857 UTC [peer] func1 -> INFO 008 Returning peer1.org2.example.com:7051 peer0.org1.example.com | 2020-01-13 15:55:11.120 UTC [peer] func1 -> INFO 008 Returning peer0.org1.example.com:7051 peer0.org1.example.com | 2020-01-13 15:55:11.120 UTC [peer] func1 -> INFO 009 Auto-detected peer address: 172.30.0.2:7051 peer1.org2.example.com | 2020-01-13 15:55:11.857 UTC [peer] func1 -> INFO 009 Auto-detected peer address: 172.30.0.6:7051 peer1.org1.example.com | 2020-01-13 15:55:11.394 UTC [sccapi] registerSysCC -> INFO 011 system chaincode cscc(github.com/hyperledger/fabric/core/scc/cscc) registered peer1.org1.example.com | 2020-01-13 15:55:11.394 UTC [sccapi] registerSysCC -> INFO 012 system chaincode lscc(github.com/hyperledger/fabric/core/scc/lscc) registered peer1.org1.example.com | 2020-01-13 15:55:11.394 UTC [sccapi] registerSysCC -> INFO 013 system chaincode escc(github.com/hyperledger/fabric/core/scc/escc) registered peer1.org1.example.com | 2020-01-13 15:55:11.394 UTC [sccapi] registerSysCC -> INFO 014 system chaincode vscc(github.com/hyperledger/fabric/core/scc/vscc) registered peer1.org1.example.com | 2020-01-13 15:55:11.394 UTC [sccapi] registerSysCC -> INFO 015 system chaincode qscc(github.com/hyperledger/fabric/core/chaincode/qscc) registered peer0.org2.example.com | 2020-01-13 15:55:11.640 UTC [peer] func1 -> INFO 009 Auto-detected peer address: 172.30.0.4:7051 peer0.org1.example.com | 2020-01-13 15:55:11.121 UTC [peer] func1 -> INFO 00a Returning peer0.org1.example.com:7051 peer0.org2.example.com | 2020-01-13 15:55:11.640 UTC [peer] func1 -> INFO 00a Returning peer0.org2.example.com:7051 peer1.org1.example.com | 2020-01-13 15:55:11.398 UTC [gossip/service] func1 -> INFO 016 Initialize gossip with endpoint peer1.org1.example.com:7051 and bootstrap set [peer0.org1.example.com:7051] peer0.org1.example.com | 2020-01-13 15:55:11.123 UTC [nodeCmd] serve -> INFO 00b Starting peer with TLS enabled peer0.org1.example.com | 2020-01-13 15:55:11.129 UTC [eventhub_producer] start -> INFO 00c Event processor started peer0.org1.example.com | 2020-01-13 15:55:11.130 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00d Entering computeChaincodeEndpoint with peerHostname: peer0.org1.example.com peer0.org1.example.com | 2020-01-13 15:55:11.130 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00e Exit with ccEndpoint: peer0.org1.example.com:7052 peer1.org2.example.com | 2020-01-13 15:55:11.857 UTC [peer] func1 -> INFO 00a Returning peer1.org2.example.com:7051 peer1.org1.example.com | 2020-01-13 15:55:11.403 UTC [msp] DeserializeIdentity -> INFO 017 Obtaining identity peer0.org2.example.com | 2020-01-13 15:55:11.643 UTC [nodeCmd] serve -> INFO 00b Starting peer with TLS enabled peer1.org1.example.com | 2020-01-13 15:55:11.409 UTC [gossip/discovery] NewDiscoveryService -> INFO 018 Started {peer1.org1.example.com:7051 [] [49 143 218 110 6 23 131 50 148 148 230 200 208 172 165 194 67 16 230 217 46 113 83 234 170 54 224 92 139 28 72 74] peer1.org1.example.com:7051 <nil>} incTime is 1578930911408702039 peer1.org1.example.com | 2020-01-13 15:55:11.409 UTC [gossip/gossip] NewGossipService -> INFO 019 Creating gossip service with self membership of {peer1.org1.example.com:7051 [] [49 143 218 110 6 23 131 50 148 148 230 200 208 172 165 194 67 16 230 217 46 113 83 234 170 54 224 92 139 28 72 74] peer1.org1.example.com:7051 <nil>} peer0.org1.example.com | 2020-01-13 15:55:11.131 UTC [nodeCmd] createChaincodeServer -> WARN 00f peer.chaincodeListenAddress is not set, using peer0.org1.example.com:7052 peer0.org2.example.com | 2020-01-13 15:55:11.648 UTC [eventhub_producer] start -> INFO 00c Event processor started peer1.org2.example.com | 2020-01-13 15:55:11.860 UTC [nodeCmd] serve -> INFO 00b Starting peer with TLS enabled peer0.org2.example.com | 2020-01-13 15:55:11.649 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00d Entering computeChaincodeEndpoint with peerHostname: peer0.org2.example.com peer1.org2.example.com | 2020-01-13 15:55:11.864 UTC [eventhub_producer] start -> INFO 00c Event processor started peer0.org2.example.com | 2020-01-13 15:55:11.649 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00e Exit with ccEndpoint: peer0.org2.example.com:7052 peer1.org2.example.com | 2020-01-13 15:55:11.865 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00d Entering computeChaincodeEndpoint with peerHostname: peer1.org2.example.com peer0.org1.example.com | 2020-01-13 15:55:11.141 UTC [chaincode] NewChaincodeSupport -> INFO 010 Chaincode support using peerAddress: peer0.org1.example.com:7052 peer1.org1.example.com | 2020-01-13 15:55:11.418 UTC [gossip/gossip] start -> INFO 01a Gossip instance peer1.org1.example.com:7051 started peer1.org1.example.com | 2020-01-13 15:55:11.420 UTC [cscc] Init -> INFO 01b Init CSCC peer1.org1.example.com | 2020-01-13 15:55:11.420 UTC [sccapi] deploySysCC -> INFO 01c system chaincode cscc/(github.com/hyperledger/fabric/core/scc/cscc) deployed peer0.org1.example.com | 2020-01-13 15:55:11.145 UTC [sccapi] registerSysCC -> INFO 011 system chaincode cscc(github.com/hyperledger/fabric/core/scc/cscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.145 UTC [sccapi] registerSysCC -> INFO 012 system chaincode lscc(github.com/hyperledger/fabric/core/scc/lscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.145 UTC [sccapi] registerSysCC -> INFO 013 system chaincode escc(github.com/hyperledger/fabric/core/scc/escc) registered peer0.org1.example.com | 2020-01-13 15:55:11.145 UTC [sccapi] registerSysCC -> INFO 014 system chaincode vscc(github.com/hyperledger/fabric/core/scc/vscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.145 UTC [sccapi] registerSysCC -> INFO 015 system chaincode qscc(github.com/hyperledger/fabric/core/chaincode/qscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.149 UTC [gossip/service] func1 -> INFO 016 Initialize gossip with endpoint peer0.org1.example.com:7051 and bootstrap set [peer1.org1.example.com:7051] peer1.org1.example.com | 2020-01-13 15:55:11.423 UTC [sccapi] deploySysCC -> INFO 01d system chaincode lscc/(github.com/hyperledger/fabric/core/scc/lscc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.865 UTC [nodeCmd] computeChaincodeEndpoint -> INFO 00e Exit with ccEndpoint: peer1.org2.example.com:7052 peer0.org2.example.com | 2020-01-13 15:55:11.650 UTC [nodeCmd] createChaincodeServer -> WARN 00f peer.chaincodeListenAddress is not set, using peer0.org2.example.com:7052 peer1.org1.example.com | 2020-01-13 15:55:11.424 UTC [escc] Init -> INFO 01e Successfully initialized ESCC peer1.org1.example.com | 2020-01-13 15:55:11.424 UTC [sccapi] deploySysCC -> INFO 01f system chaincode escc/(github.com/hyperledger/fabric/core/scc/escc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.866 UTC [nodeCmd] createChaincodeServer -> WARN 00f peer.chaincodeListenAddress is not set, using peer1.org2.example.com:7052 peer0.org2.example.com | 2020-01-13 15:55:11.654 UTC [chaincode] NewChaincodeSupport -> INFO 010 Chaincode support using peerAddress: peer0.org2.example.com:7052 peer0.org1.example.com | 2020-01-13 15:55:11.162 UTC [msp] DeserializeIdentity -> INFO 017 Obtaining identity peer1.org2.example.com | 2020-01-13 15:55:11.870 UTC [chaincode] NewChaincodeSupport -> INFO 010 Chaincode support using peerAddress: peer1.org2.example.com:7052 peer1.org1.example.com | 2020-01-13 15:55:11.426 UTC [sccapi] deploySysCC -> INFO 020 system chaincode vscc/(github.com/hyperledger/fabric/core/scc/vscc) deployed peer0.org1.example.com | 2020-01-13 15:55:11.168 UTC [gossip/discovery] NewDiscoveryService -> INFO 018 Started {peer0.org1.example.com:7051 [] [87 211 211 52 22 106 14 200 131 204 225 116 164 172 138 208 148 23 136 130 230 136 190 117 127 14 100 179 140 197 132 4] peer0.org1.example.com:7051 <nil>} incTime is 1578930911166966238 peer0.org1.example.com | 2020-01-13 15:55:11.168 UTC [gossip/gossip] NewGossipService -> INFO 019 Creating gossip service with self membership of {peer0.org1.example.com:7051 [] [87 211 211 52 22 106 14 200 131 204 225 116 164 172 138 208 148 23 136 130 230 136 190 117 127 14 100 179 140 197 132 4] peer0.org1.example.com:7051 <nil>} peer1.org1.example.com | 2020-01-13 15:55:11.430 UTC [qscc] Init -> INFO 021 Init QSCC peer1.org1.example.com | 2020-01-13 15:55:11.430 UTC [sccapi] deploySysCC -> INFO 022 system chaincode qscc/(github.com/hyperledger/fabric/core/chaincode/qscc) deployed peer1.org1.example.com | 2020-01-13 15:55:11.430 UTC [nodeCmd] initSysCCs -> INFO 023 Deployed system chaincodes peer1.org2.example.com | 2020-01-13 15:55:11.871 UTC [sccapi] registerSysCC -> INFO 011 system chaincode cscc(github.com/hyperledger/fabric/core/scc/cscc) registered peer1.org1.example.com | 2020-01-13 15:55:11.431 UTC [nodeCmd] serve -> INFO 024 Starting peer with ID=[name:"peer1.org1.example.com" ], network ID=[dev], address=[peer1.org1.example.com:7051] peer1.org2.example.com | 2020-01-13 15:55:11.871 UTC [sccapi] registerSysCC -> INFO 012 system chaincode lscc(github.com/hyperledger/fabric/core/scc/lscc) registered peer1.org1.example.com | 2020-01-13 15:55:11.432 UTC [nodeCmd] serve -> INFO 025 Started peer with ID=[name:"peer1.org1.example.com" ], network ID=[dev], address=[peer1.org1.example.com:7051] peer1.org1.example.com | 2020-01-13 15:55:11.432 UTC [nodeCmd] func7 -> INFO 026 Starting profiling server with listenAddress = 0.0.0.0:6060 peer0.org2.example.com | 2020-01-13 15:55:11.655 UTC [sccapi] registerSysCC -> INFO 011 system chaincode cscc(github.com/hyperledger/fabric/core/scc/cscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.177 UTC [gossip/gossip] start -> INFO 01a Gossip instance peer0.org1.example.com:7051 started peer0.org1.example.com | 2020-01-13 15:55:11.178 UTC [cscc] Init -> INFO 01b Init CSCC peer0.org1.example.com | 2020-01-13 15:55:11.178 UTC [sccapi] deploySysCC -> INFO 01c system chaincode cscc/(github.com/hyperledger/fabric/core/scc/cscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.655 UTC [sccapi] registerSysCC -> INFO 012 system chaincode lscc(github.com/hyperledger/fabric/core/scc/lscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.181 UTC [sccapi] deploySysCC -> INFO 01d system chaincode lscc/(github.com/hyperledger/fabric/core/scc/lscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.655 UTC [sccapi] registerSysCC -> INFO 013 system chaincode escc(github.com/hyperledger/fabric/core/scc/escc) registered peer0.org1.example.com | 2020-01-13 15:55:11.183 UTC [escc] Init -> INFO 01e Successfully initialized ESCC peer0.org1.example.com | 2020-01-13 15:55:11.183 UTC [sccapi] deploySysCC -> INFO 01f system chaincode escc/(github.com/hyperledger/fabric/core/scc/escc) deployed peer0.org1.example.com | 2020-01-13 15:55:11.185 UTC [sccapi] deploySysCC -> INFO 020 system chaincode vscc/(github.com/hyperledger/fabric/core/scc/vscc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.871 UTC [sccapi] registerSysCC -> INFO 013 system chaincode escc(github.com/hyperledger/fabric/core/scc/escc) registered peer1.org2.example.com | 2020-01-13 15:55:11.872 UTC [sccapi] registerSysCC -> INFO 014 system chaincode vscc(github.com/hyperledger/fabric/core/scc/vscc) registered peer0.org2.example.com | 2020-01-13 15:55:11.655 UTC [sccapi] registerSysCC -> INFO 014 system chaincode vscc(github.com/hyperledger/fabric/core/scc/vscc) registered peer0.org2.example.com | 2020-01-13 15:55:11.656 UTC [sccapi] registerSysCC -> INFO 015 system chaincode qscc(github.com/hyperledger/fabric/core/chaincode/qscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.187 UTC [qscc] Init -> INFO 021 Init QSCC peer0.org1.example.com | 2020-01-13 15:55:11.187 UTC [sccapi] deploySysCC -> INFO 022 system chaincode qscc/(github.com/hyperledger/fabric/core/chaincode/qscc) deployed peer0.org1.example.com | 2020-01-13 15:55:11.187 UTC [nodeCmd] initSysCCs -> INFO 023 Deployed system chaincodes peer0.org2.example.com | 2020-01-13 15:55:11.658 UTC [gossip/service] func1 -> INFO 016 Initialize gossip with endpoint peer0.org2.example.com:7051 and bootstrap set [peer1.org2.example.com:7051] peer0.org1.example.com | 2020-01-13 15:55:11.190 UTC [nodeCmd] serve -> INFO 024 Starting peer with ID=[name:"peer0.org1.example.com" ], network ID=[dev], address=[peer0.org1.example.com:7051] peer0.org1.example.com | 2020-01-13 15:55:11.191 UTC [nodeCmd] serve -> INFO 025 Started peer with ID=[name:"peer0.org1.example.com" ], network ID=[dev], address=[peer0.org1.example.com:7051] peer1.org2.example.com | 2020-01-13 15:55:11.872 UTC [sccapi] registerSysCC -> INFO 015 system chaincode qscc(github.com/hyperledger/fabric/core/chaincode/qscc) registered peer0.org1.example.com | 2020-01-13 15:55:11.192 UTC [nodeCmd] func7 -> INFO 026 Starting profiling server with listenAddress = 0.0.0.0:6060 peer0.org2.example.com | 2020-01-13 15:55:11.663 UTC [msp] DeserializeIdentity -> INFO 017 Obtaining identity peer1.org2.example.com | 2020-01-13 15:55:11.875 UTC [gossip/service] func1 -> INFO 016 Initialize gossip with endpoint peer1.org2.example.com:7051 and bootstrap set [peer0.org2.example.com:7051] peer0.org2.example.com | 2020-01-13 15:55:11.668 UTC [gossip/discovery] NewDiscoveryService -> INFO 018 Started {peer0.org2.example.com:7051 [] [199 92 79 153 170 228 25 89 46 104 76 191 172 124 27 212 112 158 60 3 126 180 28 173 235 121 214 23 87 211 241 157] peer0.org2.example.com:7051 <nil>} incTime is 1578930911667293966 peer0.org2.example.com | 2020-01-13 15:55:11.670 UTC [gossip/gossip] NewGossipService -> INFO 019 Creating gossip service with self membership of {peer0.org2.example.com:7051 [] [199 92 79 153 170 228 25 89 46 104 76 191 172 124 27 212 112 158 60 3 126 180 28 173 235 121 214 23 87 211 241 157] peer0.org2.example.com:7051 <nil>} peer1.org2.example.com | 2020-01-13 15:55:11.880 UTC [msp] DeserializeIdentity -> INFO 017 Obtaining identity peer1.org2.example.com | 2020-01-13 15:55:11.885 UTC [gossip/discovery] NewDiscoveryService -> INFO 018 Started {peer1.org2.example.com:7051 [] [198 157 145 54 160 118 194 235 137 134 179 60 153 144 168 70 67 73 212 14 27 36 142 242 212 67 45 207 175 28 85 70] peer1.org2.example.com:7051 <nil>} incTime is 1578930911884767464 peer1.org2.example.com | 2020-01-13 15:55:11.885 UTC [gossip/gossip] NewGossipService -> INFO 019 Creating gossip service with self membership of {peer1.org2.example.com:7051 [] [198 157 145 54 160 118 194 235 137 134 179 60 153 144 168 70 67 73 212 14 27 36 142 242 212 67 45 207 175 28 85 70] peer1.org2.example.com:7051 <nil>} peer0.org2.example.com | 2020-01-13 15:55:11.674 UTC [gossip/gossip] start -> INFO 01a Gossip instance peer0.org2.example.com:7051 started peer1.org2.example.com | 2020-01-13 15:55:11.889 UTC [gossip/gossip] start -> INFO 01a Gossip instance peer1.org2.example.com:7051 started peer1.org2.example.com | 2020-01-13 15:55:11.891 UTC [cscc] Init -> INFO 01b Init CSCC peer0.org2.example.com | 2020-01-13 15:55:11.677 UTC [cscc] Init -> INFO 01b Init CSCC peer0.org2.example.com | 2020-01-13 15:55:11.678 UTC [sccapi] deploySysCC -> INFO 01c system chaincode cscc/(github.com/hyperledger/fabric/core/scc/cscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.680 UTC [sccapi] deploySysCC -> INFO 01d system chaincode lscc/(github.com/hyperledger/fabric/core/scc/lscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.682 UTC [escc] Init -> INFO 01e Successfully initialized ESCC peer0.org2.example.com | 2020-01-13 15:55:11.682 UTC [sccapi] deploySysCC -> INFO 01f system chaincode escc/(github.com/hyperledger/fabric/core/scc/escc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.684 UTC [sccapi] deploySysCC -> INFO 020 system chaincode vscc/(github.com/hyperledger/fabric/core/scc/vscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.685 UTC [qscc] Init -> INFO 021 Init QSCC peer0.org2.example.com | 2020-01-13 15:55:11.685 UTC [sccapi] deploySysCC -> INFO 022 system chaincode qscc/(github.com/hyperledger/fabric/core/chaincode/qscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.685 UTC [nodeCmd] initSysCCs -> INFO 023 Deployed system chaincodes peer1.org2.example.com | 2020-01-13 15:55:11.892 UTC [sccapi] deploySysCC -> INFO 01c system chaincode cscc/(github.com/hyperledger/fabric/core/scc/cscc) deployed peer0.org2.example.com | 2020-01-13 15:55:11.686 UTC [nodeCmd] serve -> INFO 024 Starting peer with ID=[name:"peer0.org2.example.com" ], network ID=[dev], address=[peer0.org2.example.com:7051] peer0.org2.example.com | 2020-01-13 15:55:11.687 UTC [nodeCmd] serve -> INFO 025 Started peer with ID=[name:"peer0.org2.example.com" ], network ID=[dev], address=[peer0.org2.example.com:7051] peer0.org2.example.com | 2020-01-13 15:55:11.688 UTC [nodeCmd] func7 -> INFO 026 Starting profiling server with listenAddress = 0.0.0.0:6060 peer1.org2.example.com | 2020-01-13 15:55:11.894 UTC [sccapi] deploySysCC -> INFO 01d system chaincode lscc/(github.com/hyperledger/fabric/core/scc/lscc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.896 UTC [escc] Init -> INFO 01e Successfully initialized ESCC peer1.org2.example.com | 2020-01-13 15:55:11.896 UTC [sccapi] deploySysCC -> INFO 01f system chaincode escc/(github.com/hyperledger/fabric/core/scc/escc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.898 UTC [sccapi] deploySysCC -> INFO 020 system chaincode vscc/(github.com/hyperledger/fabric/core/scc/vscc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.899 UTC [qscc] Init -> INFO 021 Init QSCC peer1.org2.example.com | 2020-01-13 15:55:11.900 UTC [sccapi] deploySysCC -> INFO 022 system chaincode qscc/(github.com/hyperledger/fabric/core/chaincode/qscc) deployed peer1.org2.example.com | 2020-01-13 15:55:11.900 UTC [nodeCmd] initSysCCs -> INFO 023 Deployed system chaincodes peer1.org2.example.com | 2020-01-13 15:55:11.901 UTC [nodeCmd] serve -> INFO 024 Starting peer with ID=[name:"peer1.org2.example.com" ], network ID=[dev], address=[peer1.org2.example.com:7051] peer1.org2.example.com | 2020-01-13 15:55:11.901 UTC [msp] DeserializeIdentity -> INFO 025 Obtaining identity peer1.org2.example.com | 2020-01-13 15:55:11.902 UTC [nodeCmd] serve -> INFO 026 Started peer with ID=[name:"peer1.org2.example.com" ], network ID=[dev], address=[peer1.org2.example.com:7051] peer1.org2.example.com | 2020-01-13 15:55:11.904 UTC [nodeCmd] func7 -> INFO 027 Starting profiling server with listenAddress = 0.0.0.0:6060
启动完毕,我们再打开一个会话,查看容器
[root@localhost first-network]# docker-compose -f docker-compose-cli.yaml ps Name Command State Ports --------------------------------------------------------------------------------------------------- cli /bin/bash Up orderer.example.com orderer Up 0.0.0.0:7050->7050/tcp peer0.org1.example.com peer node start Up 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org2.example.com peer node start Up 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer1.org1.example.com peer node start Up 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org2.example.com peer node start Up 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp [root@localhost first-network]#
可以看到所有节点启动成功。
三、进入cli容器中,执行创建channel,加入channel,以及部署调用chaincode等操作
cli容器在整个Fabric网络中扮演客户端的角色,在开发测试的时候可以用cli来代替SDK,执行各种SDK能执行的操作。cliI会和Peer相连,把指令发送给对应的Peer执行。cli的配置在docker-compose-cli.yaml中
[root@localhost ~]# docker exec -it cli bash
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer#
首先需要配置ORDERER_CA环境变量指向Order节点的证书路径
echo "export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem">>/etc/profile source /etc/profile echo $ORDERER_CA /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
四、创建channel
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel create -o orderer.example.com:7050 -c firstchannel -f channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA 2020-01-14 01:36:18.629 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 01:36:18.703 UTC [channelCmd] InitCmdFactory -> INFO 002 Endorser and orderer connections initialized 2020-01-14 01:36:18.909 UTC [main] main -> INFO 003 Exiting..... root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer#
查看之前启动网络的会话窗口,可以看到一些打印的相关日志
orderer.example.com | 2020-01-14 01:36:18.653 UTC [msp] DeserializeIdentity -> INFO 007 Obtaining identity orderer.example.com | 2020-01-14 01:36:18.657 UTC [msp] DeserializeIdentity -> INFO 008 Obtaining identity orderer.example.com | 2020-01-14 01:36:18.679 UTC [msp] DeserializeIdentity -> INFO 009 Obtaining identity orderer.example.com | 2020-01-14 01:36:18.708 UTC [fsblkstorage] newBlockfileMgr -> INFO 00a Getting block information from block storage orderer.example.com | 2020-01-14 01:36:18.751 UTC [orderer/commmon/multichannel] newChain -> INFO 00b Created and starting new chain firstchannel orderer.example.com | 2020-01-14 01:36:18.905 UTC [msp] DeserializeIdentity -> INFO 00c Obtaining identity
将生成的firstchammel.block文件移动到channel-artifacts下
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# mv firstchannel.block channel-artifacts/
五、将peer加入channel
因为当前cli容器默认连接的是peer0.org1,所以可以直接使用peer channel join 将org1的peer0加入channel
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel join -b channel-artifacts/firstchannel.block 2020-01-14 01:44:15.756 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 01:44:15.944 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel 2020-01-14 01:44:15.944 UTC [main] main -> INFO 003 Exiting.....
然后查看$CORE_PEER_ADDRESS变量值
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# echo $CORE_PEER_ADDRESS peer0.org1.example.com:7051
当前是org1的peer0,我们设置为org1的peer1
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_ADDRESS=peer1.org1.example.com:7051 root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# echo $CORE_PEER_ADDRESS peer1.org1.example.com:7051
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
再次执行peer channel join 将org1的peer1加入channel
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel join -b channel-artifacts/firstchannel.block 2020-01-14 02:03:26.240 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 02:03:26.413 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel 2020-01-14 02:03:26.413 UTC [main] main -> INFO 003 Exiting.....
设置org2环境变量
#运行命令的peer所在的组织MSPID
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_LOCALMSPID=Org2MSP
#运行命令的peer根证书文件
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
#运行命令的peer的所在的组织MSP,使用组织内的管理员权限访问网络
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/msp/
设置org2的peer0环境变量
#要访问的peer的地址和端口号
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_ADDRESS=peer0.org2.example.com:7051
将org2的peer0加入channel
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel join -b channel-artifacts/firstchannel.block 2020-01-14 02:13:45.975 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 02:13:46.146 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel 2020-01-14 02:13:46.146 UTC [main] main -> INFO 003 Exiting.....
设置org2的peer1环境变量,将org2的peer1加入channel
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_ADDRESS=peer1.org2.example.com:7051
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel join -b channel-artifacts/firstchannel.block 2020-01-14 02:15:04.296 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 02:15:04.467 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel 2020-01-14 02:15:04.467 UTC [main] main -> INFO 003 Exiting.....
六、更新channel的锚节点
首先推出cli容器,重新进入,要不在执行channel update时会报错
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# exit
[root@localhost ~]# docker exec -it cli bash
设置ORDERER_CA环境变量
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# echo $ORDERER_CA
/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
根据channel-artifacts/Org1MSPanchors.tx的配置,更新org1锚节点
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel update -o orderer.example.com:7050 -c firstchannel -f channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA 2020-01-14 02:26:39.195 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-01-14 02:26:39.225 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update 2020-01-14 02:26:39.226 UTC [main] main -> INFO 003 Exiting.....
根据channel-artifacts/Org2MSPanchors.tx的配置,更新org2锚节点
七、安装chaincode
首先进入/opt/gopath/src目录
root@063be0d1e577:/opt/gopath/src# cd /opt/gopath/src/
运行peer chaincode install 安装指定路径的chaincode ,链上代码的安装需要在各个相关的Peer上进行,对于我们现在这种Fabric网络,如果4个Peer都想对Example02进行操作,那么就需要安装4次。
安装的过程其实就是对CLI中指定的代码进行编译打包,并把打包好的文件发送到Peer,等待接下来的实例化
root@063be0d1e577:/opt/gopath/src# peer chaincode install -n firstchaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go/ 2020-01-14 02:42:56.619 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 02:42:56.619 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-01-14 02:42:56.959 UTC [main] main -> INFO 003 Exiting.....
八、实例化chaincode
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode instantiate -C firstchannel -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -n firstchaincode -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" 2020-01-14 03:00:04.529 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 03:00:04.529 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-01-14 03:00:05.828 UTC [main] main -> INFO 003 Exiting.....
实例化链上代码主要是在Peer所在的机器上对前面安装好的链上代码进行包装,生成对应Channel的Docker镜像和Docker容器。并且在实例化时我们可以指定背书策略
这里的-P "OR ('Org1MSP.member','Org2MSP.member')" 是指定背书策略,在Fabric中有一个非常重要的概念叫Endorsement,中文叫背书。背书的过程就是一笔交易被确认的过程。背书策略被用来指示对相关参与方如何对交易进行确认。当一个节点接收到一个交易请求时,会调用VSCC(系统链码,处理背书验证相关的操作)与交易的chaincode共同来验证交易的合法性。在VSCC和交易的chaincode共同对交易的确认中,通常会做以下校验:
1. 交易中所有背书签名是否有效
2. 参与背书的数量是否满足要求
3. 所有背书参与方是否满足要求
背书策略是指定第二和第三点的一种方式。
比如"OR (‘Org1MSP.member’, ‘Org2MSP.member’)"。这个参数说明对当前实例化的chaincode发起的交易,需要组织编号为Org1MSP或者组织编号为Org2MSP组织中任何一个用户共同参与交易的确认并签名同意,这样的交易就能够生效,被记录到区块链中。
除了上面用到的OR关键字,换可以用AND,比如:"AND ('Org1MSP.member', 'Org2MSP.member')"这样就表示对当前实例化的chaincode发起的交易,需要组织编号为Org1MSP和组织编号为Org2MSP组织中任何一个用户共同参与交易的确认并签名同意,这样的交易就能够生效。
示例一
AND('Org1MSP.member', 'Org2MSP.member', 'Org3MSP.member')
按照示例一进行背书的交易,必须经过组织Org1MSP、Org2MSP、Org3MSP中的用户共同验证的交易才能生效。
示例二
OR('Org1MSP.member', 'Org2MSP.member')
按照示例二进行背书的交易,只需经过组织Org1MSP或组织Org2MSP中的用户共同验证的交易就能生效。
示例三
OR('Org1MSP.member', AND('Org1MSP.member', 'Org2MSP.member'))
按照示例三进行背书的交易,有两种办法让交易生效:
组织Org1MSP的某个用户对交易进行验证。
组织Org2MSP和Org3MSP中成员共同对交易进行验证。
需要注意的是,背书规则只针对那些对chaincode有写入操作的交易,对于查询类的交易不需要背书。另外一点是fabric的背书是发生在客户端,需要进行相关代码的编写才能完成背书。
我们可以利用peer channel getinfo查看区块的信息
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel getinfo -c firstchannel 2020-01-14 03:00:48.750 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized Blockchain info: {"height":2,"currentBlockHash":"8TDJk6susa1+CkXIBunpS/AxdtdY8sOpgCRaxIW36uQ=","previousBlockHash":"wuhlnYUPDfG+Zv5kRcQk7CxhpumtJmiuWtd4t90SGzo="} 2020-01-14 03:00:48.757 UTC [main] main -> INFO 002 Exiting.....
目前区块高度为2,因为我们初始化chaincode的交易,需要通过order节点进行排序验证并写入到区块中。
九、调用chaincode
在Org1的peer0上首先指定查询账户方法
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C firstchannel -n firstchaincode -c '{"Args":["query","a"]}' 2020-01-14 03:04:23.567 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 03:04:23.567 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc Query Result: 100 2020-01-14 03:04:23.579 UTC [main] main -> INFO 003 Exiting.....
已经正确返回了账户a的余额为100
在Org1的peer0上再执行转账方法,a往b转50
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode invoke -C firstchannel -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -n firstchaincode -c '{"Args":["invoke","a","b","50"]}' 2020-01-14 03:10:01.320 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 03:10:01.321 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-01-14 03:10:01.337 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 003 Chaincode invoke successful. result: status:200 2020-01-14 03:10:01.338 UTC [main] main -> INFO 004 Exiting.....
执行完毕,我们再次查询账户
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C firstchannel -n firstchaincode -c '{"Args":["query","a"]}' 2020-01-14 03:15:44.169 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 03:15:44.169 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc Query Result: 50 2020-01-14 03:15:44.180 UTC [main] main -> INFO 003 Exiting.....
账户a余额变为50
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C firstchannel -n firstchaincode -c '{"Args":["query","b"]}' 2020-01-14 03:16:06.017 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-01-14 03:16:06.017 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc Query Result: 250 2020-01-14 03:16:06.028 UTC [main] main -> INFO 003 Exiting.....
账户b余额变为250
我们更改环境变量设置到Org2的peer0上,然后执行安装chaincode操作,注意不能再执行实例化chaincode操作,因为已经在Org1的peer0上实例化了,也就是说对应的区块已经生成了,我们在Org2.peer0上执行查询操作,同样可以得到上述的余额。首次执行操作的时候会等待很久,应为会在Org2的peer0上生成docker镜像以及创建chaincode容器。
查看区块信息
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel getinfo -c firstchannel 2020-01-14 03:16:42.453 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized Blockchain info: {"height":3,"currentBlockHash":"TrH17UFC7yILhxvVS02kF9dy4eG9x/+t1tsah3dMhfY=","previousBlockHash":"8TDJk6susa1+CkXIBunpS/AxdtdY8sOpgCRaxIW36uQ="} 2020-01-14 03:16:42.459 UTC [main] main -> INFO 002 Exiting.....
当前区块高度为3,说明刚才的转账交易已经打包到区块中。
十、关闭网络
退出cli容器ctrl+d
root@063be0d1e577:/opt/gopath/src/github.com/hyperledger/fabric/peer# exit
[root@localhost ~]#
回到启动网络会话窗口,ctrl+c退出
peer0.org1.example.com | 2020-01-14 03:00:07.951 UTC [kvledger] CommitWithPvtData -> INFO 036 Channel [firstchannel]: Committed block [2] with 1 transaction(s) peer0.org2.example.com | 2020-01-14 03:00:07.987 UTC [kvledger] CommitWithPvtData -> INFO 03e Channel [firstchannel]: Committed block [2] with 1 transaction(s) peer1.org1.example.com | 2020-01-14 03:00:07.993 UTC [kvledger] CommitWithPvtData -> INFO 03d Channel [firstchannel]: Committed block [2] with 1 transaction(s) peer1.org2.example.com | 2020-01-14 03:00:08.083 UTC [kvledger] CommitWithPvtData -> INFO 039 Channel [firstchannel]: Committed block [2] with 1 transaction(s) peer0.org1.example.com | 2020-01-14 03:10:03.481 UTC [kvledger] CommitWithPvtData -> INFO 037 Channel [firstchannel]: Committed block [3] with 1 transaction(s) peer1.org2.example.com | 2020-01-14 03:10:03.487 UTC [kvledger] CommitWithPvtData -> INFO 03a Channel [firstchannel]: Committed block [3] with 1 transaction(s) peer1.org1.example.com | 2020-01-14 03:10:03.529 UTC [kvledger] CommitWithPvtData -> INFO 03e Channel [firstchannel]: Committed block [3] with 1 transaction(s) peer0.org2.example.com | 2020-01-14 03:10:03.529 UTC [kvledger] CommitWithPvtData -> INFO 03f Channel [firstchannel]: Committed block [3] with 1 transaction(s) ^CGracefully stopping... (press Ctrl+C again to force) Stopping cli ... done Stopping peer0.org2.example.com ... done Stopping peer0.org1.example.com ... done Stopping peer1.org1.example.com ... done Stopping peer1.org2.example.com ... done Stopping orderer.example.com ... done [root@localhost first-network]#
执行 ./byfn.sh -m down 关闭网络
[root@localhost first-network]# ./byfn.sh -m down -c firstchannle Stopping with channel 'firstchannle' and CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... Removing cli ... done Removing peer0.org2.example.com ... done Removing peer0.org1.example.com ... done Removing peer1.org1.example.com ... done Removing peer1.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 network net_byfn WARNING: Network net_byfn not found. Removing volume net_orderer.example.com WARNING: Volume net_orderer.example.com not found. Removing volume net_peer0.org1.example.com WARNING: Volume net_peer0.org1.example.com not found. Removing volume net_peer1.org1.example.com WARNING: Volume net_peer1.org1.example.com not found. Removing volume net_peer0.org2.example.com WARNING: Volume net_peer0.org2.example.com not found. Removing volume net_peer1.org2.example.com WARNING: Volume net_peer1.org2.example.com not found. 2663f56a8139 Untagged: dev-peer0.org1.example.com-firstchaincode-1.0-4a20ed69acba5d93a9acbf40435c399617eeab82ff9b27ed64a73f4a730f1bdf:latest Deleted: sha256:fdf54013ae4e0c4b4a4c8166bf546b51cf31df159e5bce9d03cdf35a82e649ff Deleted: sha256:9db1bf27e5e962bb0e83b883e2ccce7e1071f230d54a9c762cb471cf12e1b81d Deleted: sha256:0a8743e4a2040e9dffd0d35c5045aaf1d2b1df5ff0dfa4dbe4da0f2d9ce82780 Deleted: sha256:59b158e422154fb81cf4e267929dc7e013c3a7e48d7dbc6346afd07d08fdbcde Error: No such image: 113a43faa138 [root@localhost first-network]#
查看容器
[root@localhost first-network]# docker-compose -f docker-compose-cli.yaml ps Name Command State Ports ------------------------------ [root@localhost first-network]#
已经都删除了。