HyperLedger-fabric項目的手動部署教程

規劃

建立一個名爲fabric-deploy的目錄,用來存放部署過程使用到的文件。html

mkdir ~/fabric-deploy

這裏將用三臺機器部署一個fabric網絡,該網絡中有兩個組織:java

org1.example.com
org2.example.com

一個order:node

orderer.example.com

org1.example.com有兩個peer:linux

peer0.org1.example.com
peer1.org1.example.com

org2.example.com有一個peer:golang

peer0.org2.example.com

三臺機器的IP,以及部署的組件以下:docker

192.168.88.10  部署:  orderer、peer0@org1
192.168.88.11  部署:  peer1@org1
192.168.88.12  部署: peer0@org2

相應域名的IP分別爲:json

192.168.88.10 orderer.example.com
192.168.88.10 peer0.org1.example.com
192.168.88.11 peer1.org1.example.com
192.168.88.12 peer0.org2.example.com

將這四條記錄添加到每臺機器的/etc/hosts文件中。bootstrap

每臺機器上還須要安裝docker:bash

yum install -y docker 
systemctl start docker

另外fabric的peer會調用docker,須要在全部peer上安裝docker,並提早下載鏡像:網絡

docker pull hyperledger/fabric-javaenv:x86_64-1.1.0
docker pull hyperledger/fabric-ccenv:x86_64-1.1.0
docker pull hyperledger/fabric-baseos:x86_64-0.4.6

下載的鏡像須要與下面步驟中建立的core.yaml中的鏡像配對:

...
chaincode:
    peerAddress:
    id:
        path:
        name:
    builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
    golang:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
    car:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
    java:
        Dockerfile:  |
            from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION)
...

建立合約的時候會用到這些鏡像,鏡像下載可能比較慢,根據本身的狀況配置加速器。另外每一個peer上都須要下載。

我在」區塊鏈實踐分享」中提供的fabric-deploy中下載包中提供了這三個鏡像,能夠直接使用:

cd fabric-deploy/docker-images
./load.sh

編譯或下載fabric文件

編譯方法見:hyperledger fabric編譯

執行下面的命令能夠下載編譯好的fabric以及依賴的鏡像:

curl -sSL https://goo.gl/6wtTN5 | bash

或者直接到這裏下載: hyperledger fabric download

這裏使用的linux-amd64,fabric-1.1.0:

wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz
wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5

下載完成後校驗一下:

$ md5sum hyperledger-fabric-linux-amd64-1.1.0.tar.gz
6be979ccd903752aefba9da4fc9e1d44  hyperledger-fabric-linux-amd64-1.1.0.tar.gz
$ cat hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5
6be979ccd903752aefba9da4fc9e1d44

解壓後獲得兩個bin和config兩個目錄:

tar -xvf hyperledger-fabric-linux-amd64-1.1.0.tar.gz

bin目錄中是fabric的組件,config是配置文件模版。

$ ls bin/
configtxgen   configtxlator   cryptogen   get-byfn.sh   get-docker-images.sh orderer   peer

$ ls config/
configtx.yaml  core.yaml  orderer.yaml

保留備用。

準備證書

證書的準備方式有兩種,一種用cryptogen命令生成,一種是經過fabric-ca服務生成。

cryptogen的方式

建立一個配置文件crypto-config.yaml,這裏配置了兩個組織,org1的Count是2,表示兩個peer:

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer
PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Org2
    Domain: org2.example.com
    Template:
      Count: 1
    Users:
      Count: 1

而後執行crypto,生成證書:

./bin/cryptogen generate --config=crypto-config.yaml --output ./certs

certs目錄下生成了兩個目錄:

$ ls ./certs/
ordererOrganizations  peerOrganizations

certs目錄的內容比較多,而且目錄很深,須要提早說明一下。搞清楚了這裏面文件的含義,就懂了一半。

certs/ordererOrganizations/example.com/orderers/orderer.example.com/目錄中內容爲例。

這裏目錄中的內容是用於orderer.example.com的,裏面有兩個子目錄tlsmsp

$ tree certs/ordererOrganizations/example.com/orderers/orderer.example.com/
certs/ordererOrganizations/example.com/orderers/orderer.example.com/
|-- msp
|   |-- admincerts
|   |   -- Admin@example.com-cert.pem
|   |-- cacerts
|   |   -- ca.example.com-cert.pem
|   |-- keystore
|   |   -- 16da15d400d4ca4b53d369b6d6e50a084d4354998c3b4d7a0934635d3907f90f_sk
|   |-- signcerts
|   |   -- orderer.example.com-cert.pem
|   -- tlscacerts
|       -- tlsca.example.com-cert.pem
-- tls
    |-- ca.crt
    |-- server.crt
    -- server.key

tls目錄中的內容很好理解,它是order對外服務時使用的私鑰(server.key)和證書(server.crt),ca.crt是簽註這個證書的CA,須要提供給發起請求的一端。

msp中有五個目錄,對區塊鏈進行操做時須要使用這些文件。

msp/admincerts中存放的是用戶證書,使用該證書的用戶對orderer.example.com具備管理權限。

msp/cacerts是簽署msp/signcerts中用戶證書的ca,能夠用來校驗用戶的證書:

$ cd ./certs/ordererOrganizations/example.com/orderers/orderer.example.com/msp/
$ openssl verify -CAfile ./cacerts/ca.example.com-cert.pem  admincerts/Admin\@example.com-cert.pem
admincerts/Admin@example.com-cert.pem: OK

msp/keystore是orderer.example.com操做區塊,進行簽署時使用的的私鑰。

msp/signcerts是orderer.example.com提供其它組件用來覈實它的簽署的公鑰。

msp/tlscacerts文件與tls/ca.crt相同。

這裏須要特別提到的是msp/admincerts,在使用fabric時,你可能會發現有些操做須要admin權限,例如在某個peer上安裝合約。

那麼管理員是如何認定的?就是看當前用戶的證書是否是在msp/admincerts目錄中。

這個目錄中的內容目前是(版本1.1.x)啓動時加載的,所以若是在裏面添加或刪除文件後,須要重啓使用到它的組件。

ordererOrganizations/example.com/還有其它幾個目錄:

ca  msp  orderers  tlsca  users

orderers中存放就簽名分析的每一個orderer組件的證書文件。

users中存放的用戶的證書文件,與orderer.example.com中內容基本相同,不過tls目錄中文件名變成了client.X

$ tree ordererOrganizations/example.com/users
ordererOrganizations/example.com/users
-- Admin@example.com
    |-- msp
    |   |-- admincerts
    |   |   -- Admin@example.com-cert.pem
    |   |-- cacerts
    |   |   -- ca.example.com-cert.pem
    |   |-- keystore
    |   |   -- 1ac3b40c9ddda7e7a0f724b18faa0ce6fdf3f9e9ff5eac59e1e3f9739499ac2d_sk
    |   |-- signcerts
    |   |   -- Admin@example.com-cert.pem
    |   -- tlscacerts
    |       -- tlsca.example.com-cert.pem
    -- tls
        |-- ca.crt
        |-- client.crt
        -- client.key

certs/peerOrganizations中的內容與certs/ordererOrganizations中也基本相同,只不過它裏面存放的是peer要使用的證書文件。

certs目錄中的文件留着備用。

使用fabric-ca生成證書

fabric-ca的部署和詳細用法見:hyperledger的fabricCA的使用

只用fabric-ca生成證書的過程相對繁瑣不少,須要爲每一個組件、每一個用戶生成,這裏不作示例。

orderer.example.com

建一個目錄存放orderer.example.com須要文件:

mkdir orderer.example.com

先將bin/orderer以及證書複製到orderer.example.com目錄中。

cp bin/orderer orderer.example.com/
cp -rf certs/ordererOrganizations/example.com/orderers/orderer.example.com/* orderer.example.com/

而後準備orderer的配置文件orderer.yaml:

General:
    LedgerType: file
    ListenAddress: 0.0.0.0
    ListenPort: 7050
    TLS:
        Enabled: true
        PrivateKey: ./tls/server.key
        Certificate: ./tls/server.crt
        RootCAs:
          - ./tls/ca.crt
#        ClientAuthEnabled: false
#        ClientRootCAs:
    LogLevel: debug
    LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
#    GenesisMethod: provisional
    GenesisMethod: file
    GenesisProfile: SampleInsecureSolo
    GenesisFile: ./genesisblock
    LocalMSPDir: ./msp
    LocalMSPID: OrdererMSP
    Profile:
        Enabled: false
        Address: 0.0.0.0:6060
    BCCSP:
        Default: SW
        SW:
            Hash: SHA2
            Security: 256
            FileKeyStore:
                KeyStore:
FileLedger:
    Location:  /opt/app/fabric/orderer/data
    Prefix: hyperledger-fabric-ordererledger
RAMLedger:
    HistorySize: 1000
Kafka:
    Retry:
        ShortInterval: 5s
        ShortTotal: 10m
        LongInterval: 5m
        LongTotal: 12h
        NetworkTimeouts:
            DialTimeout: 10s
            ReadTimeout: 10s
            WriteTimeout: 10s
        Metadata:
            RetryBackoff: 250ms
            RetryMax: 3
        Producer:
            RetryBackoff: 100ms
            RetryMax: 3
        Consumer:
            RetryBackoff: 2s
    Verbose: false
    TLS:
      Enabled: false
      PrivateKey:
        #File: path/to/PrivateKey
      Certificate:
        #File: path/to/Certificate
      RootCAs:
        #File: path/to/RootCAs
    Version:

注意,orderer將被部署在目標機器的/opt/apt/fabric/orderer目錄中,若是要部署在其它目錄中,須要修改配置文件中路徑。

這裏須要用到一個data目錄,存放orderer的數據:

mkdir orderer.example.com/data

peer0.org1.example.com

建一個目錄存放peer0.org1.example.com須要文件:

mkdir peer0.org1.example.com

先將bin/peer以及證書複製到peer0.org1.example.com目錄中。

cp bin/peer peer0.org1.example.com/
cp -rf certs/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/* peer0.org1.example.com/

準備peer0.org1.example.com的配置文件core.yaml:

logging:
    peer:       debug
    cauthdsl:   warning
    gossip:     warning
    ledger:     info
    msp:        warning
    policies:   warning
    grpc:       error
    format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
peer:
    id: peer0.org1.example.com
    networkId: dev
    listenAddress: 0.0.0.0:7051
    address: 0.0.0.0:7051
    addressAutoDetect: false
    gomaxprocs: -1
    gossip:
        bootstrap: 127.0.0.1:7051
        bootstrap: peer0.org1.example.com:7051
        useLeaderElection: true
        orgLeader: false
        endpoint:
        maxBlockCountToStore: 100
        maxPropagationBurstLatency: 10ms
        maxPropagationBurstSize: 10
        propagateIterations: 1
        propagatePeerNum: 3
        pullInterval: 4s
        pullPeerNum: 3
        requestStateInfoInterval: 4s
        publishStateInfoInterval: 4s
        stateInfoRetentionInterval:
        publishCertPeriod: 10s
        skipBlockVerification: false
        dialTimeout: 3s
        connTimeout: 2s
        recvBuffSize: 20
        sendBuffSize: 200
        digestWaitTime: 1s
        requestWaitTime: 1s
        responseWaitTime: 2s
        aliveTimeInterval: 5s
        aliveExpirationTimeout: 25s
        reconnectInterval: 25s
        externalEndpoint: peer0.org1.example.com:7051
        election:
            startupGracePeriod: 15s
            membershipSampleInterval: 1s
            leaderAliveThreshold: 10s
            leaderElectionDuration: 5s
    events:
        address: 0.0.0.0:7053
        buffersize: 100
        timeout: 10ms
    tls:
        enabled: true
        cert:
            file: ./tls/server.crt
        key:
            file: ./tls/server.key
        rootcert:
            file: ./tls/ca.crt
        serverhostoverride:
    fileSystemPath: /opt/app/fabric/peer/data
    BCCSP:
        Default: SW
        SW:
            Hash: SHA2
            Security: 256
            FileKeyStore:
                KeyStore:
    mspConfigPath: msp
    localMspId: Org1MSP
    profile:
        enabled:    true
        listenAddress: 0.0.0.0:6060
vm:
    endpoint: unix:///var/run/docker.sock
    docker:
        tls:
            enabled: false
            ca:
                file: docker/ca.crt
            cert:
                file: docker/tls.crt
            key:
                file: docker/tls.key
        attachStdout: false
        hostConfig:
            NetworkMode: host
            Dns:
               # - 192.168.0.1
            LogConfig:
                Type: json-file
                Config:
                    max-size: "50m"
                    max-file: "5"
            Memory: 2147483648
chaincode:
    peerAddress:
    id:
        path:
        name:
    builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
    golang:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
    car:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
    java:
        Dockerfile:  |
            from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION)
    startuptimeout: 300s
    executetimeout: 30s
    mode: net
    keepalive: 0
    system:
        cscc: enable
        lscc: enable
        escc: enable
        vscc: enable
        qscc: enable
    logging:
      level:  info
      shim:   warning
      format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
ledger:
  blockchain:
  state:
    stateDatabase: goleveldb
    couchDBConfig:
       couchDBAddress: 127.0.0.1:5984
       username:
       password:
       maxRetries: 3
       maxRetriesOnStartup: 10
       requestTimeout: 35s
       queryLimit: 10000
  history:
    enableHistoryDatabase: true

注意,peer將被部署在目標機器的/opt/apt/fabric/peer目錄中,若是要部署在其它目錄中,須要修改配置文件中路徑。

這裏須要用到一個data目錄,存放peer的數據:

mkdir peer0.org1.example.com/data

peer1.org1.example.com

過程與peer0.org1.example.com相似,注意將配置文件中的名稱修改成peer1,而且不要拷錯證書。

這裏直接複製peer0.org1.exampl.com目錄,而後替換其中的文件。

cp -rf peer0.org1.example.com/ peer1.org1.example.com/
rm -rf peer1.org1.example.com/msp/
rm -rf peer1.org1.example.com/tls/
cp -rf certs/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/* peer1.org1.example.com/

最後修改peer1.org1.example.com/core.yml,將其中的peer0.org1.exampl.com修改成peer1.org1.example.com,這裏直接用sed命令替換:

sed -i "s/peer0.org1.example.com/peer1\.org1\.example.com/g" peer1.org1.example.com/core.yaml

peer0.org2.example.com

過程與peer0.org1.example.com相似,注意將配置文件中的名稱修改成org2,而且不要拷錯證書。

這裏直接複製peer0.org1.exampl.com目錄,而後替換其中的文件。

cp -rf peer0.org1.example.com/ peer0.org2.example.com/
rm -rf peer0.org2.example.com/msp/
rm -rf peer0.org2.example.com/tls/
cp -rf certs/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/*  peer0.org2.example.com/

最後修改peer0.org2.example.com/core.yml,將其中的peer0.org1.exampl.com修改成peer0.org2.example.com,這裏直接用sed命令替換:

sed -i "s/peer0.org1.example.com/peer0\.org2\.example.com/g" peer0.org2.example.com/core.yaml

將配置文件中Org1MSP替換成Org2MSP:

sed -i "s/Org1MSP/Org2MSP/g" peer0.org2.example.com/core.yaml

開始部署

部署以前,先確保已經在每臺機器的/etc/hosts文件中添加下列的記錄:

192.168.88.10 orderer.example.com
192.168.88.10 peer0.org1.example.com
192.168.88.11 peer1.org1.example.com
192.168.88.12 peer0.org2.example.com

注意根據你本身的環境狀況修改。

在192.168.88.10上建立目錄:

mkdir -p /opt/app/fabric/{orderer,peer}

將orderer.example.com和peer0.org1.exmaple.com中的內容複製到192.168.88.10:

scp -r orderer.example.com/* root@192.168.88.10:/opt/app/fabric/orderer/
scp -r peer0.org1.example.com/* root@192.168.88.10:/opt/app/fabric/peer/

在192.168.88.11上建立目錄:

mkdir -p /opt/app/fabric/peer

將peer1.org1.exmaple.com中的內容複製到192.168.88.11:

scp -r peer1.org1.example.com/* root@192.168.88.11:/opt/app/fabric/peer/

在192.168.88.12上建立目錄:

mkdir -p /opt/app/fabric/peer

將peer0.org2.exmaple.com中的內容複製到192.168.88.12:

scp -r peer0.org2.example.com/* root@192.168.88.12:/opt/app/fabric/peer/

啓動前準備

order、peer都部署到位,可是對我這裏示意的場景,須要的文件並不齊備。

查看orderer.yaml文件,你會看到有這樣幾行:

GenesisMethod: file
GenesisFile: ./genesisblock
GenesisProfile: SampleInsecureSolo

前兩行配置了創世塊的獲取方式。第一個區塊的獲取方式有多種,這裏採用最簡單的一種作法,用configtxgen生成。

沒有在前面的步驟中一次生成全部須要的文件是由於,若是你修改了配置、使用了其它的方式,可能不須要這裏的操做。

回到存放了全部文件的fabric-deploy目錄中,建立一個名爲configtx.yaml的文件:

Profiles:
    TwoOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: ./certs/ordererOrganizations/example.com/msp
    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: ./certs/peerOrganizations/org1.example.com/msp
        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051
    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: ./certs/peerOrganizations/org2.example.com/msp
        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051
Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Kafka:
        Brokers:
            - 127.0.0.1:9092
    Organizations:
Application: &ApplicationDefaults
    Organizations:

這個配置文件的內容比較多,這裏就不作解釋了,能夠到視頻解說中聽講解。

直接用./bin/configtxgen生成創世塊文件。

./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesisblock

將./genesisblock文件複製到192.168.88.10的/opt/app/fabric/orderer/目錄中:

scp genesisblock root@192.168.88.10:/opt/app/fabric/orderer/

啓動

分別到每臺機器到orderer、peer目錄中啓動:

./orderer  &
./peer node start  &

爲了方便查看輸出的日誌,能夠寫一個腳本:

$ cat start.sh
./orderer 2>&1 |tee log

peer的腳本以下:

$ cat start.sh
./peer node start 2>&1 |tee log

而後將腳本放到後臺運行:

$ ./start.sh &

若是程序啓動失敗,那麼覈實以前的步驟。或者到右側的「區塊鏈實踐分享」知識星球中諮詢。

用戶

要使用得先有用戶。在前面用cryptogen準備證書的時候,它默認建立了用戶。

還記得certs目錄下的幾個users目錄嗎?那裏面就是用戶證書。

users目錄一共有三個,分別是聯盟的用戶,和每一個組織的用戶:

./certs/ordererOrganizations/example.com/users
./certs/peerOrganizations/org1.example.com/users
./certs/peerOrganizations/org2.example.com/users

其中每一個組織有兩個用戶,Admin和User1:

$ ls ./certs/peerOrganizations/org1.example.com/users
Admin@org1.example.com  User1@org1.example.com

Admin和User1惟一的區別是,Admin的用戶證書被添加到了對一個peer的msp/admincerts目錄中。(還記得這個目錄的做用嗎?)

Admin@org1.example.com

使用hyperledger fabric能夠經過SDK,也能夠使用peer命令。

這裏直接演示peer命令的用法。

在fabric-deploy中建立目錄Admin@org1.example.com,在其中存放該用戶的全部資料。

mkdir Admin@org1.example.com

將用戶證書複製到其中:

cp -rf certs/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/* Admin\@org1.example.com/

還須要將core.yaml複製到用戶目錄下:

cp peer0.org1.example.com/core.yaml  Admin\@org1.example.com/

爲了方便使用,在Admin@org1.example.com中建立一個peer.sh腳本:

#!/bin/bash
PATH=`pwd`/../bin:$PATH

export FABRIC_CFG_PATH=`pwd`

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_CERT_FILE=./tls/client.crt
export CORE_PEER_TLS_KEY_FILE=./tls/client.key

export CORE_PEER_MSPCONFIGPATH=./msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=./tls/ca.crt
export CORE_PEER_ID=cli
export CORE_LOGGING_LEVEL=INFO

peer $*

而後直接經過這個腳本訪問peer0.org1.example.com:

$ ./peer.sh node status
status:STARTED
2018-04-29 14:32:03.517 CST [main] main -> INFO 001 Exiting.....

能夠看到peer0.org1.example.com:7051的狀態是啓動的。

爲了後面的演示,下面使用複製替換的方式,準備另外兩個用戶的目錄。

User1@org1.example.com

User1與Admin1使用相同的peer,所以只須要替換用戶證書便可:

cp -rf  Admin\@org1.example.com/ User1\@org1.example.com/
rm -rf  User1\@org1.example.com/msp
rm -rf  User1\@org1.example.com/tls
cp -rf  certs/peerOrganizations/org1.example.com/users/User1\@org1.example.com/* User1\@org1.example.com/

執行peer.sh檢驗:

$ ./peer.sh node status
status:STARTED
2018-04-29 14:37:48.251 CST [main] main -> INFO 001 Exiting.....

Admin@org2.example.com

對於Admin@org2.example.com,core.yaml也須要替換:

cp -rf  Admin\@org1.example.com/ Admin\@org2.example.com/
rm -rf  Admin\@org2.example.com/msp/
rm -rf  Admin\@org2.example.com/tls/
cp -rf certs/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/* Admin\@org2.example.com/
cp peer0.org2.example.com/core.yaml Admin\@org2.example.com/

還須要將peer.sh中peer地址修改成org2的peer地址:

export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP

修改成:

export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP

驗證:

$ ./peer.sh node status
status:STARTED
2018-04-29 14:44:22.395 CST [main] main -> INFO 001 Exiting.....

建立channel與peer的設置

準備channel文件

這裏用命令行演示channel的建立與peer的設置。(也能夠經過SDK,SDK將單獨討論)

須要再次回到fabric-deploy目錄中,用configtxgen生成channel文件:

./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx mychannel.tx -channelID mychannel

channel名字爲mychannel,生成的mychannel.tx備用。

還須要爲每一個組織的peer生成一個anchor文件,每一個組織只須要一個:

./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

生成的Org1MSPanchors.tx和Org2MSPanchors.tx備用。

下一步操做中須要訪問orderer.example.com,須要將驗證orderer.example.com的證書複製到用戶目錄中:

cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem  Admin\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem  User1\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem  Admin\@org2.example.com/

建立channel

在Admin@org1.exampl.com目錄中執行下面的命令,:

./peer.sh channel create -o orderer.example.com:7050 -c mychannel -f ../mychannel.tx --tls true --cafile tlsca.example.com-cert.pem

執行完成後,會生成一個mychannel.block文件:

$ ls
core.yaml  msp  mychannel.block  peer.sh  tls  tlsca.example.com-cert.pem

將mychannel.block複製一份到Admin\@org2.example.com/中備用:

cp Admin\@org1.example.com/mychannel.block Admin\@org2.example.com/

將peer加入channel

分別Admin\@org1.example.com/Admin\@org2.example.com/執行下面的命令:

./peer.sh channel join -b mychannel.block

由於org1有兩個peer,所以須要將peer.sh中peer修改成peer1.org1.example.com後,再添加一次:

./peer.sh channel join -b mychannel.block

能夠用channel list查看peer所在channel

$ ./peer.sh channel list
2018-04-29 16:37:47.016 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychannel
2018-04-29 16:37:47.018 CST [main] main -> INFO 002 Exiting.....

最後須要每一個組織指定一個anchor peer,anchor peer是組織用來與外部通訊的peer:

cd Admin\@org1.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org1MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem

cd Admin\@org2.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org2MSPanchors.tx --tls true --caf
相關文章
相關標籤/搜索