fabric 一键部署&手动单机部署

安装与配置 Go

  • 下载并解压 go
    1
    2
    wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.13.5.linux-amd64.tar.gz
  • 设置当前用户的环境变量:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vi /etc/profile
    //添加以下内容:
    export PATH=$PATH:/usr/local/go/bin
    export GOROOT=/usr/local/go
    export GOPATH=$HOME/gopath
    export PATH=$PATH:$HOME/gopath/bin
    //编辑保存并退出vi后,记得把这些环境载入:
    source /etc/profile
    //我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建gopath文件夹
    cd ~
    mkdir gopath

安装 Docker

  • 安装并启动 docker 服务

    1
    2
    3
    sudo yum install docker-ce
    docker version
    sudo systemctl start docker
  • 将当前用户添加到 docker 用户组

    1
    2
    3
    4
    5
    6
    7
    8
    // 添加 docker 用户组
    groupadd docker
    // 把需要执行的 docker 用户添加进该组
    gpasswd -a $USER docker
    // 重启 docker
    systemctl restart docker
    // 设置 docker 服务开机自启动
    systemctl enable docker
  • 若提示 get …… dial unix /var/run/docker.sock 权限不够,则修改 /var/run/docker.sock 权限即可:

    1
    sudo chmod a+rw /var/run/docker.sock

安装 Docker-Compose

  • 安装
    1
    2
    3
    sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose version

下载&编译 fabic

  • 创建下载目录,下载 fabric 源码:

    1
    2
    3
    mkdir -p ~/go/src/github.com/hyperledger 
    cd ~/go/src/github.com/hyperledger
    git clone https://github.com/hyperledger/fabric.git
  • 编译 fabric 相关组件

    1
    make all

    all 表明编译所有组件(包括镜像)
    若想编译某个特定的组件:执行 make {$component-name} 即可

  • 利用 byfn.sh 编译 fabric 相关组件,此脚本能起 1 orderer + 2 Organization 的 fabric 网络

    1
    ./byfn.sh up

查看 fabric 网络

1
docker images -a | grep fabric
  • 若出现如下几个镜像则表明 fabric 网络所需要的镜像准备完毕:
    1
    2
    3
    4
    5
    6
    hyperledger/fabric-orderer
    hyperledger/fabric-ccenv
    hyperledger/fabric-peer
    hyperledger/fabric-tools
    hyperledger/fabric-baseos
    hyperledger/fabric-buildenv

手动部署 fabric 网络

  • 1、通过 crypto-config.yaml 配置文件,生成所需要的证书文件:

    • 生成证书

      1
      ./bin/cryptogen generate --config=./crypto-config.yaml

      此时, 文件夹 crypto-config 里会有 ordererOrganizationspeerOrganizations 两个目录,分别存放 orderer 节点证书和 organization 节点证书。

    • cryto-config.yaml 参数说明:

      1
      2
      3
      4
      5
      6
      7
      - Name: Org2
      Domain: org2.example.com
      EnableNodeOUs: true
      Template:
      Count: 2
      Users:
      Count: 1

      NameDomain: 指定该组织的名字和域名,生成的证书内将包含该信息。
      Template.Count=2: 表明生成 2 套证书,一套是 peer0.org2 的,还有一套是 peer1.org2
      Users.Count=1: 指定该组织有多少普通 User(用户)(注:Admin 不计入 count 中)

  • 2、根据 configtx.yaml 生成创世区块

    1
    ./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID sys-channel

    命令生效后会在 channel-artifacts 此目录下生成 genesis.block 文件(创世区块),同时将系统通道命名为 sys-channel

  • 3、生成通道配置区块

    1
    ./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

    命令生效后,生成 mychannel.tx 配置交易文件,同时将应用通道命名为 mychannel

  • 4、生成用于锚节点配置更新的交易文件

    1
    2
    3
    4
    // 更新 Org1 的锚节点
    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
    // 更新 Org2 的锚节点
    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

    锚节点作用是用于组织间的通信

  • 最终在 channel-artifacts 文件夹下可以看到四个新生成的文件:
    1
    2
    3
    4
    5
    channel-artifacts/
    ├── channel.tx
    ├── genesis.block
    ├── Org1MSPanchors.tx
    └── Org2MSPanchors.tx
  • 4、启动 Fabric 网络

    • 部署 orderer 节点
      1
      docker-compose -f docker-compose-orderer.yaml up -d
    • 部署 peer 节点
      1
      docker-compose -f docker-compose-peer.yaml up –d
  • 5、进入 cli 容器里

    1
    docker exec –it cli bash 进去客户端  创建一个channel
  • 6、创建应用通道 mychannel

    1
    2
    ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    peer channel create –o orderer.example.com:7050 –c mychannel –f ./channel-artifacts/mychannel.tx --tls true --cafile $ORDERER_CA

    ORDERER_CA 是 orderer 的 tls 根证书,用于验证在开启 tls 下验证 orderer 的 TLS 证书。

  • 7、将各个组织的 peer 节点加入到 mychannel 通道中

    • 将 peer0.org1 加入通道:

      1
      2
      // 由于 cli 默认是充当是的 peer0.org1 的客户端(cli 的环境变量使用的是 peer0.org1 的)
      peer channel join -b mychannel.block
    • 将 peer1.org1 加入通道:

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org1MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
      CORE_PEER_ADDRESS=peer1.org1.example.com:8051
      peer channel join -b mychannel.block
    • 将 peer0.org2 加入通道:

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org2MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
      CORE_PEER_ADDRESS=peer0.org2.example.com:9051
      peer channel join -b mychannel.block
    • 将 peer1.org2 加入通道:

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org2MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
      CORE_PEER_ADDRESS=peer1.org2.example.com:10051
      peer channel join -b mychannel.block
  • 8、更新锚节点

    • 更新 Org1 的锚节点(这里指定的是 peer0.org1,在 configtx.yaml 中有定义)

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org1MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
      CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
    • 更新 Org2 的锚节点

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org2MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
      CORE_PEER_ADDRESS=peer0.org2.example.com:9051
      peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
  • 9、安装智能合约

    • 在 peer0.org1 节点上,安装链码

      1
      2
      3
      4
      5
      6
      CORE_PEER_LOCALMSPID="Org1MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
      CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      // 使用 peer chaincode install 命令可以安装指定的 ChainCode 并对其命名 mychaincode:
      peer chaincode install -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go/
    • 在 peer0.org2 节点上,安装链码

      1
      2
      3
      4
      5
      CORE_PEER_LOCALMSPID="Org2MSP"
      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
      CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
      CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      peer chaincode install -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go/
  • 10、实例化合约

    1
    peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mychaincode -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"
  • 11、查询链码

    1
    peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
  • 12、 调用链码

    1
    peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'

    调用结束后可以查询是否转账成功。 当前都是在 peer0.org1 节点执行,如果需要在其他节点执行查询链码或者调用链码,只需切换环境变量即可(参考加入通道相关流程)。

ps: 本章节所介绍的 fabric 网络部署在单机中,后续章节将补充 fabric 多机部署。。。