部署hyperledger fabric的简单生产网络

步骤一:搭建TLS-CA服务器

证书颁发机构配置。 作为整体决策的一部分,你必须决定你的 peer 节点(有多少,每个通道有多少等等)和你的排序服务(有多少节点,谁将拥有它们),你还必须决定你的组织的 CA(译者注:证书颁发机构,下同)节点如何被部署。生产网络应该使用传输层安全性(TLS),这将需要设置一个 TLS CA,并使用它来生成 TLS 证书。此 TLS CA 需要在你登录 CA 之前部署。

TLS-CA服务器为网络中所有节点颁发TLS证书,用于通信的加密

1. 创建docker-compose.yaml文件

这里只创建一个docker-compose.yaml文件,后面所有CA服务器和节点的启动程序均放在该文件中,方便启动和关闭所有容器

mkdir -p /tmp/hyperledger/docker-compose && cd /tmp/hyperledger/docker-compose
​
touch docker-compose.yaml

docker-compose.yaml的配置

version: '2.1'  # 使用Docker Compose文件格式版本2
​
networks:
  fabric-ca:  # 定义一个名为fabric-ca的Docker网络,用于容器间通信
​
services:  # 定义Docker Compose中管理的服务
   ca-tls:  # 定义一个名为ca-tls的服务,将运行Hyperledger Fabric CA服务器作为TLS CA
     container_name: ca-tls  # 容器的名称设置为ca-tls
     image: hyperledger/fabric-ca  # 指定使用的Docker镜像为hyperledger/fabric-ca
     command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052'  # 容器启动时执行的命令,启动Fabric CA服务器
     environment:  # 设置Fabric CA服务器的环境变量
       - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto  # Fabric CA服务器的主目录
       - FABRIC_CA_SERVER_TLS_ENABLED=true  # 启用TLS支持
       - FABRIC_CA_SERVER_CSR_CN=ca-tls  # 设置CSR(证书签名请求)的常见名称为ca-tls
       - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0  # 允许从任何IP地址访问CA服务器
       - FABRIC_CA_SERVER_PORT=7052  # Fabric CA服务器监听的端口号
       - FABRIC_CA_SERVER_DEBUG=true  # 启用调试模式,以输出更多调试信息
     volumes:  # 指定持久化存储的卷
       - /tmp/hyperledger/fabric-ca-tls:/tmp/hyperledger/fabric-ca  # 映射主机上的目录到容器内,用于存储CA生成的证书和密钥
     networks:  # 指定服务所属的网络
       - fabric-ca  # 将ca-tls服务连接到fabric-ca网络
     ports:  # 暴露容器端口到宿主机
       - 7052:7052  # 将容器的7052端口映射到宿主机的7052端口,使其可以从宿主机访问
​

启动docker容器

docker-compose -f docker-compose.yaml up ca-tls
  • docker-compose:这是Docker Compose命令行工具的主命令,它允许你使用YAML文件定义多个容器的应用服务。
  • -f docker-compose.yaml-f参数指定了Docker Compose配置文件的名称和路径。这里指定的是docker-compose.yaml,它告诉Docker Compose从当前目录下的docker-compose.yaml文件读取配置。如果你的文件位于其他位置或有不同的名称,你需要相应地调整这个参数。
  • up:这个子命令用于创建和启动docker-compose.yaml文件中定义的所有服务。如果服务所需的网络或卷尚未存在,Docker Compose也会自动创建它们。
  • ca-tls:这是docker-compose.yaml文件中定义的一个服务名称。通过在up子命令后指定特定的服务名称,你可以限制Docker Compose只创建和启动该服务,而不是文件中定义的所有服务。这在你只想运行部分服务进行测试或开发时非常有用。

如果命令行出现以下内容则说明启动成功:

[INFO] Listening on https://0.0.0.0:7052

文件结构

[root@localhost /tmp/hyperledger/fabric-ca-tls]# tree
.
└── crypto
    ├── ca-cert.pem
    ├── fabric-ca-server-config.yaml
    ├── fabric-ca-server.db
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── msp
    │   ├── cacerts
    │   ├── keystore
    │   │   ├── 3e1c0550dc6bb4783d9246316a967a45074e9f8747d909ea0552b7a5fad68f1b_sk
    │   │   ├── 560adb4dbc886671eeef5e80704a8a8ae1f012579e9226dd78d3cb3448cf5949_sk
    │   │   ├── IssuerRevocationPrivateKey
    │   │   └── IssuerSecretKey
    │   ├── signcerts
    │   └── user
    └── tls-cert.pem

根目录

  • crypto:这个目录包含所有由Fabric CA服务器生成的加密材料和配置文件。

crypto目录中

  • ca-cert.pem:这是CA的自签名证书,代表这个CA的身份。任何由这个CA颁发的证书都可以通过这个证书来验证。
  • fabric-ca-server-config.yaml:这是Fabric CA服务器的配置文件,定义了CA的行为,比如如何处理登记请求、证书的路径、TLS设置等。
  • fabric-ca-server.db:这是Fabric CA服务器的数据库文件,存储了关于注册用户和颁发证书的信息。
  • IssuerPublicKey:这是CA的公钥文件,用于验证由CA签发的证书。
  • IssuerRevocationPublicKey:这是用于证书撤销的公钥文件。

msp目录中

这个目录包含了与成员服务提供者(MSP)相关的加密材料。

  • cacerts:包含CA证书的目录,用于验证来自这个CA的证书。

  • keystore

    • 包含私钥的目录。在这个示例中,包含多个私钥文件,可能用于不同的目的,如签名或证书撤销。
    • 3e1c0550..._sk560adb4..._sk:私钥文件,用于加密和签名。文件名中的_sk表示这是一个私钥(secret key)。
    • IssuerRevocationPrivateKey:用于证书撤销的私钥。
    • IssuerSecretKey:可能用于内部加密操作的另一个私钥。
  • signcerts:应包含由CA签发的证书,这里没有显示具体的证书文件,但通常这里会存放代表CA身份的证书。

  • user:这个目录可能用于存储特定用户的证书

crypto目录中的其他文件

  • tls-cert.pem:这是TLS证书,如果CA服务器配置了TLS(传输层安全协议),则会使用这个证书进行加密通信。

2. 在TLS CA服务器注册用户

在环境变量指定这些路径
#设置环境变量指定根证书的路径(如果工作目录不同的话记得指定自己的工作目录,以下不再重复说明)
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem
#设置环境变量指定CA客户端的HOME文件夹
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca-tls/admin
​
#打开一个终端开启fabric-ca-tls
docker-compose -f docker-compose.yaml up ca-tls

在另一个终端登录管理员用户(登录的账户为我们的docker配置文件里的ca账户密码),注意这个用户相当于root用户

fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem
  • fabric-ca-client enroll:这是fabric-ca-client命令的enroll操作,用于从Fabric CA获取证书和密钥。enroll操作需要提供有效的登记ID和密码,Fabric CA将验证这些凭据并颁发相应的证书。

  • -d:这个选项启用调试模式,使fabric-ca-client输出更多的调试信息到控制台。这对于诊断问题非常有用。

  • -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052:这部分指定了Fabric CA服务器的URL和用于登记的凭据。

    • https://指明使用HTTPS协议,意味着通信将被加密。
    • tls-ca-admin:tls-ca-adminpw是登记ID(用户名)和密码,用于认证身份。
    • 0.0.0.0:7052指定CA服务器的地址和端口。这里的0.0.0.0表示监听所有网络接口,但在实际使用中应替换为CA服务器的实际IP地址。
  • --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem:这个选项指定了用于TLS连接的CA证书文件路径。当与Fabric CA服务器通信时,fabric-ca-client将使用这个证书验证服务器的身份,这是TLS握手过程的一部分。

    • --tls.certfiles选项告诉fabric-ca-client在建立TLS连接时使用哪个CA证书进行服务器身份验证。
    • /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem是CA的自签名证书的路径,它是在启动CA服务器时生成的。

登录之后会在fabric-ca-tls生成admin文件夹,这个用户为ca的管理员用户。

[root@localhost /tmp/hyperledger/fabric-ca-tls/admin]# tree
.
├── fabric-ca-client-config.yaml
└── msp
    ├── cacerts
    │   └── 0-0-0-0-7052.pem
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── keystore
    │   └── ac0736883180c0b0fc434e16c3d384fe80fce4d42abc2cd4ac4f07796b622bcd_sk
    ├── signcerts
    │   └── cert.pem
    └── user

注册账号(注意这里只是注册了身份还没获取证书)

Org0: 一个orderer节点,一个Org0的Admin节点,一个Org0的peer节点(这里Org0的admin节点我们在创建的时候就存在了)

fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem
​
fabric-ca-client register -d --id.name peer1-org0 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem
公共参数解释
  • registerfabric-ca-client的注册操作,用于在CA中创建新的用户身份。
  • -d:启用调试模式,提供更多的输出信息,有助于调试和问题解析。
  • --id.name:注册的新用户身份的名称。
  • --id.secret:为新用户身份分配的密码,用于之后的登记操作。
  • --id.type:新用户身份的类型,如peerordereradmin等。
  • -u:指定CA服务器的URL,这里使用的是本地地址https://0.0.0.0:7052
  • --tls.certfiles:指定CA服务器TLS证书的路径,用于客户端验证CA服务器身份。
配置Org0的CA服务

创建Org0的ca目录

mkdir -p /tmp/hyperledger/org0/ca

在之前的docker-compose.yaml文件中添加Org0的ca服务器(注意格式不能错)

  org0:
    container_name: org0
    image: hyperledger/fabric-ca:latest
    command: sh -c 'fabric-ca-server start -d -b org0-admin:org0-adminpw --port 7053'
    environment:
      - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_CSR_CN=org0
      - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
      - FABRIC_CA_SERVER_PORT=7053
      - FABRIC_CA_SERVER_DEBUG=true
    volumes:
      - /tmp/hyperledger/org0/ca:/tmp/hyperledger/fabric-ca  ##重要!!!记得修改这里的路径为自己的工作目录
    networks:
      - fabric-ca
    ports:
      - 7053:7053

设置Org0的用户的环境变量

设置环境变量&登陆
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/ca/admin

登录Org0用户获取证书

fabric-ca-client enroll -d -u https://org0-admin:org0-adminpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem

在本组织中共有三个用户:orderer节点和admin用户还有一个peer节点(这里的admin和管理员是不同的。) 将他们注册到org0的CA服务器

fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem
​
fabric-ca-client register -d --id.name peer1-org0 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem
​
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem
​

命令执行完之后,将会注册一个Orderer节点的身份和一个Admin的身份。同时在工作目录下的org0子文件夹中会有两个文件夹:crypto和admin。crypto中是CA服务器的配置信息,admin是服务器管理员的身份信息。

Org0的节点配置
peer1
mkdir -p /tmp/hyperledger/org0/peer1/assets/ca/
​
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem /tmp/hyperledger/org0/peer1/assets/ca/org0-ca-cert.pem

设置环境变量

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/peer1/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

切换docker容器到org0上

docker-compose -f docker-compose.yaml up org0

登陆peer1节点到org0 CA 服务器上

fabric-ca-client enroll -d -u https://peer1-org0:peer1PW@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem

这一步完成后在/tmp/hyperledger/org0/peer1下出现一个msp文件夹,这是peer1节点的msp证书。

接下来是TLS证书

mkdir -p /tmp/hyperledger/org0/peer1/assets/tls-ca
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem  /tmp/hyperledger/org0/peer1/assets/tls-ca/tls-ca-cert.pem

配置Tls的环境变量

export FABRIC_CA_CLIENT_MSPDIR=/tmp/hyperledger/org0/peer1/tls-msp
​
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/peer1/assets/tls-ca/tls-ca-cert.pem

切换docker容器到ca-tls

docker-compose -f docker-compose.yaml up ca-tls

登录peer1节点的TLS CA服务器上

fabric-ca-client enroll -d -u https://peer1-org0:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org0 --tls.certfiles /tmp/hyperledger/org0/peer1/assets/tls-ca/tls-ca-cert.pem

这一步完成后,在/tmp/hyperledger/org0/peer1下会出现一个tls-msp文件夹,这是peer1节点的TLS证书。

为了方便后续操作,建议把密钥文件改个名字

mv /tmp/hyperledger/org0/peer1/tls-msp/keystore/*_sk /tmp/hyperledger/org0/peer1/tls-msp/keystore/key.pem
orderer
mkdir -p /tmp/hyperledger/org0/orderer/assets/ca/
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

配置环境变量

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

登录order节点到org0 CA服务器上

fabric-ca-client enroll -d -u https://orderer1-org0:ordererpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

接下来是TLS证书

mkdir /tmp/hyperledger/org0/orderer/assets/tls-ca/
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem  /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

配置环境变量

export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

登录order节点到TLS CA服务器上

fabric-ca-client enroll -d -u https://orderer1-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer1-org0 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

修改密钥

mv /tmp/hyperledger/org0/orderer/tls-msp/keystore/*_sk /tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
admin

配置环境变量

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

登录admin 用户获取msp

fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

复制证书到admincerts文件夹:

mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem
​
mkdir /tmp/hyperledger/org0/peer1/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/peer1/msp/admincerts/org0-admin-cert.pem

证书都准备好了之后我们还需要在每个msp文件下添加一个config.yaml。(记住不能添加中文)

NodeOUs:
  Enable: true
  ClientOUIdentifier:
    Certificate: cacerts/0-0-0-0-7053.pem
    OrganizationalUnitIdentifier: client
  PeerOUIdentifier:
    Certificate: cacerts/0-0-0-0-7053.pem
    OrganizationalUnitIdentifier: peer
  AdminOUIdentifier:
    Certificate: cacerts/0-0-0-0-7053.pem
    OrganizationalUnitIdentifier: admin
  OrdererOUIdentifier:
    Certificate: cacerts/0-0-0-0-7053.pem
    OrganizationalUnitIdentifier: orderer
启动peer节点
peer1-org0:
    container_name: peer1-org0
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer1-org0
      - CORE_PEER_ADDRESS=peer1-org0:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer1-org0:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1-org0:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org0:7051
      - CORE_PEER_LOCALMSPID=org0MSP
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/peer1/msp
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}=fabric-ca
      - FABRIC_LOGGING_SPEC=debug
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org0/peer1/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org0/peer1/tls-msp/keystore/key.pem
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org0/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org0/peer1
    volumes:
      - /var/run:/host/var/run
      - /tmp/hyperledger/org0/peer1:/tmp/hyperledger/org0/peer1
    networks:
      - fabric-ca

3.Fabric网络

整理MSPDir文件
mkdir -p /tmp/hyperledger/configtx && cd /tmp/hyperledger/configtx
​
mkdir org0
​
cp -r ../org0/admin/msp org0/
​
cd  org0/msp
​
mkdir tlscacerts && cd tlscacerts
​
cp  /tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem ./
configtx.yaml文件配置

在下一个步骤的生成创世区块和通道配置信息需要一个文件:configtx.yaml文件。

cd /tmp/hyperledger/configtx
touch configtx.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
​
---
################################################################################
#
#   Section: Organizations
#
################################################################################
Organizations:
​
    - &org0
        Name: org0MSP
        ID: org0MSP
        MSPDir: ../configtx/org0/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('org0MSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('org0MSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('org0MSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('org0MSP.peer')"
        OrdererEndpoints:
            - orderer1-org0:7050
        # leave this flag set to true.
        AnchorPeers:
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context
            - Host: peer1-org0
              Port: 7051
################################################################################
#
#   SECTION: Capabilities
#
################################################################################
Capabilities:
    Channel: &ChannelCapabilities
        V2_0: true
    Orderer: &OrdererCapabilities
        V2_0: true
    Application: &ApplicationCapabilities
        V2_0: true
​
################################################################################
#
#   SECTION: Application
#
################################################################################
Application: &ApplicationDefaults
    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        LifecycleEndorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"
        Endorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"
    Capabilities:
        <<: *ApplicationCapabilities
​
################################################################################
#
#   SECTION: Orderer
#
################################################################################
Orderer: &OrdererDefaults
    OrdererType: etcdraft
    EtcdRaft:
        Consenters:
        - Host: orderer1-org0
          Port: 7050
          ClientTLSCert: /tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
          ServerTLSCert: /tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"
​
################################################################################
#
#   CHANNEL
#
################################################################################
Channel: &ChannelDefaults
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
    Capabilities:
        <<: *ChannelCapabilities
​
################################################################################
#
#   Profile
#
################################################################################
Profiles:
​
    Org0OrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *org0
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *org0
     
    Org0Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *org0
            Capabilities:
                <<: *ApplicationCapabilities
生成创世区块和通道信息
cd /tmp/hyperledger/configtx
mkdir system-genesis-block 
mkdir channel-artifacts
生成创世区块文件
configtxgen -profile Org0OrdererGenesis -channelID system-channel -outputBlock ./system-genesis-block/genesis.block
生成应用通道的创建交易文件
export CHANNEL_NAME=mychannel
configtxgen -profile Org0Channel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID ${CHANNEL_NAME}
​
这个命令的作用是根据`Org0Channel`配置文件,为名为`mychannel`的应用通道生成一个创建交易文件,并将这个文件保存到`./channel-artifacts/mychannel.tx`
锚节点更新配置
export orgmsp=org0MSP
configtxgen -profile Org0Channel -outputAnchorPeersUpdate ./channel-artifacts/${orgmsp}anchors.tx -channelID ${CHANNEL_NAME} -asOrg ${orgmsp}

创世区块文件通道信息生成后,启动orderer节 orderer1-org0节点的配置文件如下,和之前一样添加进之前的docker-compose.yaml文件中就好:

  orderer1-org0:
    container_name: orderer1-org0
    image: hyperledger/fabric-orderer
    environment:
      - ORDERER_HOME=/tmp/hyperledger/orderer
      - ORDERER_HOST=orderer1-org0
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_LISTENPORT=7050
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/tmp/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=org0MSP
      - ORDERER_GENERAL_LOCALMSPDIR=/tmp/hyperledger/org0/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
​
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
      - ORDERER_GENERAL_TLS_CERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
      - ORDERER_GENERAL_TLS_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]
​
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]
​
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_DEBUG_BROADCASTTRACEDIR=data/logs
    volumes:
      - /tmp/hyperledger/org0/orderer:/tmp/hyperledger/org0/orderer/
      - /tmp/hyperledger/configtx/system-genesis-block/genesis.block:/tmp/hyperledger/orderer/orderer.genesis.block
​
    networks:
      - fabric-ca

至此,整个docker-compose.yaml文件已经配置完整,后续启动网络和关闭网络时,可使用如下命令:

启动所有容器
docker-compose up -d
​
关闭所有容器
docker-compose down
​
关闭所有容器,并清除容器和本地挂载的数据,建议使用此命令
docker-compose down -v
​
docker占用的磁盘空间查看
docker system df
​
删除所有无用的volume
docker volume rm $(docker volume ls -qf dangling=true)
​
docker logs 容器名
创建cli-org0

添加到docker-compose.yaml里面

   cli-org0:
      container_name: cli-org0
      image: hyperledger/fabric-tools
      tty: true
      stdin_open: true
      environment:
        - SYS_CHANNEL=testchainid
        - GOPATH=/opt/gopath
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - FABRIC_LOGGING_SPEC=DEBUG
        - CORE_PEER_ID=cli-org0
        - CORE_PEER_ADDRESS=peer1-org0:7051
        - CORE_PEER_LOCALMSPID=org0MSP
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org0/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org0/peer1/tls-msp/signcerts/cert.pem
        - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org0/peer1/tls-msp/keystore/key.pem
        - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/peer1/msp
      working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org0
      command: /bin/bash
      volumes:
        - /tmp/hyperledger/org0:/tmp/hyperledger/org0/
        - /tmp/hyperledger/org0/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
        - /tmp/hyperledger/org0/admin:/tmp/hyperledger/org0/admin
        - /tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem:/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - /tmp/hyperledger/org0/peer1/tls-msp/tlscacerts:/tmp/hyperledger/org0/admin/msp/tlscacerts
        - /tmp/hyperledger/configtx/channel-artifacts:/tmp/hyperledger/configtx/channel-artifacts
      networks:
        - fabric-ca

4.创建并加入通道

docker exec -it cli-org0 bash
​
export CHANNEL_NAME=mychannel
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/admin/msp
​
cd /tmp/hyperledger/configtx
peer channel create -o orderer1-org0:7050 -c ${CHANNEL_NAME} --ordererTLSHostnameOverride orderer1-org0 -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile ${ORDERER_CA}
​
export CORE_PEER_ADDRESS=peer1-org0:7051
peer channel join -b ./channel-artifacts/mychannel.block
​
export CORE_PEER_LOCALMSPID=org0MSP
peer channel update -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA

5.部署链码

1.打包链码

安装链码前,需要先将打包好的链码压缩包放到/tmp/hyperledger/org0/peer1/assets/chaincode目录,这里可以参照官网去测试网络打包一个链码

在打包链码前,我们需要安装链码依赖。切换到 Go 语言版本的 asset-transfer (basic)目录下。

cd fabric-samples/asset-transfer-basic/chaincode-go

该例子使用 Go module 安装链码依赖。依赖将会被列举到 go.mod 的文件中,其在asset-transfer-basic/chaincode-go的文件夹下。您应花点时间去检查这个文件。

$ cat go.mod
module github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go
​
go 1.14
​
require (
        github.com/golang/protobuf v1.3.2
        github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
        github.com/hyperledger/fabric-contract-api-go v1.1.0
        github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e
        github.com/stretchr/testify v1.5.1
)

go.mod文件将 Fabric 合约 API 导入到智能合约包。您可用文本编辑器打开asset-transfer-basic/chaincode-go/chaincode/smartcontract.go,来查看如何使用合约 API 在智能合约的开头定义SmartContract类型:

// SmartContract provides functions for managing an Asset
type SmartContract struct {
 contractapi.Contract
}

然后,SmartContract 类型用于为智能合约中定义的函数创建交易上下文,这些函数将数据读写到区块链账本。

// CreateAsset issues a new asset to the world state with given details.
func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, id string, color string, size int, owner string, appraisedValue int) error {
 exists, err := s.AssetExists(ctx, id)
 if err != nil {
  return err
 }
 if exists {
  return fmt.Errorf("the asset %s already exists", id)
 }
​
 asset := Asset{
  ID:             id,
  Color:          color,
  Size:           size,
  Owner:          owner,
  AppraisedValue: appraisedValue,
 }
 assetJSON, err := json.Marshal(asset)
 if err != nil {
  return err
 }
​
 return ctx.GetStub().PutState(id, assetJSON)
}

您可以学习更多关于 Go 语言的合约 API,请参阅API documentationsmart contract processing topic

为了安装智能合约依赖,请在asset-transfer-basic/chaincode-go文件夹下运行以下命令:

GO111MODULE=on go mod vendor

如果命令生效,go 的依赖包将会被安装到vendor文件夹下。

现在,我们有了自己的依赖,我们可以创建链码包。回到test-network的工作目录下,然后将链码连同网络的其他构件一同打包。

cd ../../test-network

您可以使用peer CLI 在创建链码包时指定所需格式。peer的二进制文件在bin目录下的fabric-samples仓库中。使用以下命令将这些二进制文件添加到您的 CLI 路径:

export PATH=${PWD}/../bin:$PATH

您也需通过设置FABRIC_CFG_PATHfabric-samples 仓库中指定core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

为了确保您已经可以使用peer CLI,请检查二进制文件的版本。版本需为2.0.0或者更新的版本,以便能够运行本教程。

peer version

现在,您可使用peer lifecycle chaincode package 的命令创建链码包:

peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1
2.安装链码
docker exec -it cli-org0 bash
​
cd /tmp/hyperledger/org0/peer1/assets/chaincode
export CORE_PEER_ADDRESS=peer1-org0:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/admin/msp
​
peer lifecycle chaincode install basic.tar.gz
3.查询链码
export COMPOSE_PROJECT_NAME=fabric-ca
peer lifecycle chaincode queryinstalled
​
Package ID: basic_1.0:4ec191e793b27e953ff2ede5a8bcc63152cecb1e4c3f301a26e22692c61967ad, Label: basic_1.0
4.授权校验链码
export VERSION=1
export PACKAGE_ID=basic_1.0:4ec191e793b27e953ff2ede5a8bcc63152cecb1e4c3f301a26e22692c61967ad
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CHANNEL_NAME=mychannel
​
peer lifecycle chaincode approveformyorg -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 --tls --cafile ${ORDERER_CA} --channelID ${CHANNEL_NAME} --name basic --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION}
​
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name basic --version ${VERSION} --sequence ${VERSION} --output json --init-required
5.提交链码定义
export CHANNEL_NAME=mychannel
export VERSION=1
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/admin/msp
​
​
peer lifecycle chaincode commit -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name basic --peerAddresses peer1-org0:7051 --tlsRootCertFiles /tmp/hyperledger/org0/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem  --version ${VERSION} --sequence ${VERSION} --init-required
6.查询提交内容
export CHANNEL_NAME=mychannel
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name basic
7.初始化链码
export CHANNEL_NAME=mychannel
export VERSION=1
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org0/admin/msp
​
peer chaincode invoke -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n basic --peerAddresses peer1-org0:7051 --tlsRootCertFiles /tmp/hyperledger/org0/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --isInit -c '{"function":"InitLedger","Args":[]}'
​
​
peer chaincode invoke -o orderer0.consortiums.com:7050 --ordererTLSHostnameOverride orderer0.consortiums.com --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n basic --peerAddresses peer0.org1.com:7051 --tlsRootCertFiles /hyperledger/opt/peer/crypto-config/peerOrganizations/org1.com/peers/peer0.org1.com/msp/tlscacerts/tlsca.org1.com-cert.pem --isInit -c '{"function":"InitLedger","Args":[]}'
8.查询
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

image-20240328001941602.png

image-20240328001958868.png

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值