首页 > 编程语言 >部署hyperledger fabric的简单生产网络

部署hyperledger fabric的简单生产网络

时间:2024-06-17 19:57:47浏览次数:25  
标签:tls tmp fabric 部署 ca hyperledger CA org0

步骤一:搭建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:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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

标签:tls,tmp,fabric,部署,ca,hyperledger,CA,org0
From: https://blog.csdn.net/qq_28641579/article/details/139738759

相关文章

  • 建立fabric-ca-serve集群
    步骤1:安装Docker如果你还没有安装Docker,请先安装它。sudoyumupdate-ysudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2sudoyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.reposudoyuminstall-ydocker-......
  • AI模型-模型部署和推理
    模型部署模型部署是将训练好的模型部署到运行环境中进行推理的过程,模型部署的过程中需要解决训练模型到推理模型的转换,硬件资源对模型的限制,模型推理的时延、功耗、内存占用等指标对整个系统的影响以及模型的安全等一系列的问题模型部署到运行环境以后,保护模型......
  • 部署、安装和测试minio
    部署MinIO在server01部署MinIO,安装方式采用rpm离线安装,具体步骤可参考官方文档。获取MinIO安装包下载地址如下:https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm,通过以下命令可直接将安装包下载至服务器wgethttps://dl.min......
  • UML_结构类_部署图
    部署图描述的是硬件拓扑以及在此结构上执行的软件,说白了就是软件是怎么部署到硬件设备上的,是物理层面的模型包含的元素节点表示服务器主机,用立体长矩形表示,命名方式可以直接写节点类型,也可以是实例名:节点类型物件(构件,组件)表示需要部署的软件服务,用矩形框加合适的图......
  • Prometheus+grafana部署
    分类出所需的监控项种类一般可分为︰业务级别监控/系统级别监控/网络监控/程序代码监控/日志监控/用户行为分析监控/其他种类监控大的分类还有更多的细小分类,这里给出几个例子,例如:业务监控可以包含用户访问QPS,DAU日活,访问状态,业务接口,产品转化率,充值额度,用户投诉等等这些很宏观......
  • [转]使用acme.sh自动申请、续期、部署免费的SSL证书
    原文地址:使用acme.sh自动申请、续期、部署免费的SSL证书-RidingWind-博客园参考文档:https://github.com/acmesh-official/acme.sh一个使用纯shell操作的免费SSL证书申请部署工具。免费的SSL证书由以下CA机构提供:ZeroSSL.comCA(default)Letsencrypt.orgCABuyPass.comCASSL......
  • 4、docker-部署Nginx、tomcat
    1、搜索镜像:docker searchnginx·可以去官网搜索查看https://hub.docker.com/2、下载镜像:docker pullnginx3、查看镜像:dockerimages4、启动镜像:dockerrun-d--namenginx01-p3344:80nginx5、查看容器docker ps6、测试......
  • 5、docker-部署ES(elasticsearch)+kibana
    #es暴露的端口多#es十分消耗内存#es的数据一般需要放置到安全目录、挂载=========================================安装es=========================1、下载启动es(建议启动前把其它容器停止,不然会很卡)·dockerrun-d--nameelasticsearch-p9200:9200-p9300:9300......
  • 【Nginx】Nginx部署前端静态资源
    打包部署我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步:前端工程打包通过nginx服务器(点击下载Nginx)发布前端工程1前端工程打包接下来我们先来对前端工程进行打包我们直接通过VSCode的NPM脚本中提供的build按钮来完整,如下图所示,直接点击即可:然后会......
  • Redis主从模式部署
    Redis主从模式部署主从模式是Redis三种集群模式中最简单的,主数据库(master)和从数据库(slave)。其中,主从复制有如下特点:主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库;从数据库一般是只读的,并且接收主数据库同步过来的数据;一个master可以拥有......