• 手动启动Fabric v1.1.0环境


    一、为指定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]# 

    已经都删除了。

  • 相关阅读:
    Android中对TextView中的部分内容的字体样式的设置方法
    Android中的ListView的绘制过程中执行的方法
    EL表达式的简单介绍
    Android中ViewPgae中的Fragment如何确认当前页面可见的问题
    Jsp中的注释
    Android onActivityResult()运行时刻的问题
    JSTL标签的用法详解
    JavaWeb开发中遇到的错误:org.apache.catalina.core.StandardWrapperValve invoke
    Apache中配置数据库连接池(数据源)
    IT阅读——关于“业务”
  • 原文地址:https://www.cnblogs.com/sky-cheng/p/12190036.html
Copyright © 2020-2023  润新知