hyperledger-fabric 手动部署最小网络架构

hyperledger-fabric 区块链手动部署最小网络架构(1组织、1 peer、1 orderer)

环境准备

  1. DockerDocker-compose

  2. hyperledger-fabric 镜像,可参考 hyperledger-fabric 环境安装与源码编译 自己编译镜像,或者在 DockerHub 上拉取相关镜像

  3. 链码,完整的区块链中至少包含一个安装有链码的节点,可参考 hyperledger-fabric 区块链链码打包与安装 编译链码

  4. DNS 服务,提供区块链域名解析功能,也可直接配置 hosts 文件及启动 Docker 容器时指定IP:域名映射。DNS服务可参考 使用 docker 快速搭建 dnsmasq 服务

区块链部署

当前文档以 hyperledger fabric 区块链最小化网络架构来说明如何手动部署 fabric 区块链

区块链相关术语参考:术语表


以下内容参考自 fabric-samplestest-network 目录下脚本


  • 新建区块链部署目录 /opt/product/blockchain

    shell
    1
    2
    mkdir -p /opt/product/blockchain
    cd /opt/product/blockchain

    以下所有非容器内操作均在此目录下进行

  • 创建区块链部署 docker network

    shell
    1
    2
    export BC_NET=blockchain
    docker network ls | grep ${BC_NET} || docker network create ${BC_NET}
  • 通过 .env 文件,指定后面 fabric 区块链使用的 docker 镜像版本

    shell
    1
    echo "IMAGE_TAG=2.2" > .env

启动 fabric-cli

使用 hyperledger/fabric-tools 作为 hyperledger-fabric 区块链的命令行工具镜像。

根据 fabric 仓库中 images/tools/Dockerfile 内容可知该镜像包含了 fabric 编译的各个命令行工具,位于镜像内 /usr/local/bin 目录下。

  1. 创建 docker-compose 脚本存放路径

    shell
    1
    mkdir docker
  2. 使用 docker-compose作为编排工具,添加名为 compose-cli.yml 的 compose 编排脚本,使用 hyperledger/fabric-tools 作为镜像

    示例如下:

    docker/compose-cli.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    version: "3"

    networks:
    default:
    external:
    name: blockchain

    services:
    fabric-cli:
    image: hyperledger/fabric-tools:${IMAGE_TAG}
    container_name: fabric-cli
    restart: always
    tty: true
    stdin_open: true
    command: /bin/bash
    environment:
    - TZ=Asia/Shanghai
    - FABRIC_LOGGING_SPEC=INFO
    - CORE_PEER_TLS_ENABLED=true
    working_dir: /opt/blockchain/
    volumes:
    - $PWD/:/opt/blockchain/
  3. 启动 fabric-cli

    shell
    1
    docker-compose -p fabric-cli -f docker/compose-cli.yml up -d

MSP 证书

  1. 进入 fabric-cli 容器

    sehll
    1
    docker exec -it fabric-cli bash
  2. 创建生成证书的配置文件存放目录

    shell
    1
    mkdir -p organizations/cryptogen

cryptogen 配置模板

具体配置项目可参考模板配置,生成默认配置文件命令

shell
1
cryptogen showtemplate > organizations/cryptogen/crypto-config.yaml

说明:

crypto-config.yaml 是 MSP 和 TLS 相关文件的依赖配置文件。它将 Orderer 和 Peer 两种节点的 MSP 都定义到了同一个文件中。

该文件的主要作用:

  • 指定网络的拓扑结构

  • 通过配置模板信息,来定义组织成员对应的结构。

  • cryptogen 工具可以快速根据该配置文件自动批量生成所需要的密钥和证书文件。

crypto-config.yaml 指定了网络的拓扑结构,主要包括 OrdererOrgs 以及 PeerOrgs 两部分。

可参考该文件中各个配置项注释按需求修改

生成证书

使用 cryptogen 工具生成组织证书,可以如同 cryptogen 配置模板多个组织、节点写在同一文件中直接一次生成所需的 MSP 证书文件。不过我们先把 PeerOrderer 组织拆分为如下两部分来生成,便于理解。

  • Orderer 节点

    参考模板配置文件,编写 Orderer 节点证书配置文件 crypto-orderer0.yml,并存放于 organizations/cryptogen/ 目录下

    organizations/cryptogen/crypto-orderer0.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    OrdererOrgs:
    - Name: Orderer
    Domain: example.com # orderer 节点域名
    EnableNodeOUs: true
    CA:
    Country: CN
    Province: SiChuan
    Locality: Chengdu
    Specs:
    - Hostname: orderer0 # 生成证书为 hostname.Domain
  • Peer 节点

    参考模板配置文件,编写 Peer 组织节点证书配置文件 crypto-org1.yml,并存放于 organizations/cryptogen/ 目录下

    organizations/cryptogen/crypto-org1.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PeerOrgs:
    - Name: Org1
    Domain: org1.example.com # peer 节点域名
    EnableNodeOUs: false
    CA:
    Country: CN
    Province: SiChuan
    Locality: Chengdu
    Template:
    Count: 1 # 根据 Count 有多少生成当前组织下多少个 peer 节点证书,例:peer*.Domain
    Users:
    Count: 1 # 除管理员外的用户数

fabric-cli 容器中使用 cryptogen 工具生成组织证书,生成的证书文件默认存放在 crypto-config 目录下,我们使用 --output 选项输出到 organizations 目录下:

shell
1
2
3
cryptogen generate --config=organizations/cryptogen/crypto-orderer0.yml --output=organizations
# 生成 peer 组织证书时会打印出 peer 组织域名
cryptogen generate --config=organizations/cryptogen/crypto-org1.yml --output=organizations

生成证书后 organizations 目录如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
organizations/
├── cryptogen # 生成证书使用的配置文件存放目录
│   ├── crypto-config.yaml
│   ├── crypto-orderer0.yml
│   └── crypto-org1.yml
├── ordererOrganizations # Orderer 组织 MSP 目录
│   └── example.com
│   ├── ca
│   │   ├── ca.example.com-cert.pem
│   │   └── priv_sk
│   ├── msp
│   │   ├── admincerts
│   │   ├── cacerts
│   │   ├── config.yaml
│   │   └── tlscacerts
│   ├── orderers
│   │   └── orderer0.example.com # crypto-orderer0.yml 配置生成的节点证书目录 hostname.Domain
│   ├── tlsca
│   │   ├── priv_sk
│   │   └── tlsca.example.com-cert.pem
│   └── users
│   └── Admin@example.com
└── peerOrganizations # 当前组织域名下的节点文件存放目录
└── org1.example.com # Peer 组织 org1,crypto-org1.yml 配置中 Domain
├── ca
│   ├── ca.org1.example.com-cert.pem
│   └── priv_sk
├── msp
│   ├── admincerts
│   ├── cacerts
│   └── tlscacerts
├── peers # 当前组织域名下的节点文件存放目录
│   └── peer0.org1.example.com # crypto-org1.ym 配置中根据 Count 生成对应个节点
├── tlsca
│   ├── priv_sk
│   └── tlsca.org1.example.com-cert.pem
└── users
├── Admin@org1.example.com
└── User1@org1.example.com

通道配置文件

准备配置文件

  1. 进入 fabric-cli 容器
sehll
1
docker exec -it fabric-cli bash
  1. 新建 fabric 文件夹用于存放区块链相关配置,并复制一份生成通道配置文件需要的配置文件 configtx.yaml 到该文件夹下
shell
1
2
mkdir fabric
cp /etc/hyperledger/fabric/configtx.yaml fabric/

说明:

configtx.yaml 包含网络的定义,并给出了网络组件的拓扑结构还指出每个网络实体的加密材料的存储位置。用来编写、配置系统通道初始区块文件,新建应用通道配置文件,锚节点配置更新交易文件等。

该文件的主要作用:

  • 配置一系列通道配置模板,包括 Orderer 系统通道模板和应用通道类型模板

  • 一系列组织结构定义,被其他部分引用。这里的组织结构,要和 crypto-config.yaml 中定义的组织结构一致。因为每一个组织都要靠前者生成一套证书和密钥文件

  • 定义 Orderer 系统通道相关配置,包括 Orderer 服务配置和参与 Ordering 服务的组织信息

  • 定义应用通道相关配置,主要包括参与应用网络的可用组织信息

configtx.yaml 文件,主要以下个部分组成:

  • Organizationtions:定义了不同的组织标志,这些标志将在 Profile 部分被引用。

  • Capabilities:该部分用于定义区块链网络的功能。

  • Application:该部分定义了交易配置相关的值,以及包含和创世区块相关的值。

  • Orderer:定义了排序服务的相关参数,这些参数将用于创建创世区块。

  • Channel:该部分定义了交易配置相关的值,以及包含和创世区块相关的值。

  • Profile:不同配置的概要文件可以在这里进行编码,将 Profile 参数指定为 configtxgen 工具的参数。指定联盟的配置文件用于生成 orderer 创世块。

生成通道配置文件

configtx.yaml 中使用到的 yaml 语法如下:

符号 含义
<< 合并到当前数据
- 数组
* 别名
& 锚点
  1. 修改 configtx.yaml 配置文件,示例如下:

    备注:详细内容请参考配置文件中注释进行修改,以下内容仅供参考

    fabric/configtx.yaml >folded
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    ---

    # Organizations配置段用来定义组织机构实体,以便在后续配置中引用
    Organizations:
    - &OrdererOrg
    # 组织名称
    Name: OrdererOrg
    # 组织ID,ID是引用组织的关键
    ID: OrdererMSP
    # 组织的MSP证书路径,对应 crypto-config.yaml 中 orderer 组织生成的 MSP 证书路径。按实际域名修改
    MSPDir: ../organizations/ordererOrganizations/example.com/msp/
    # 定义本层级的组织策略,保持默认即可
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('OrdererMSP.member')"
    Writers:
    Type: Signature
    Rule: "OR('OrdererMSP.member')"
    Admins:
    Type: Signature
    Rule: "OR('OrdererMSP.admin')"
    Endorsement:
    Type: Signature
    Rule: "OR('OrdererMSP.peer')"
    # 设置为 orderer,域名加访问端口
    OrdererEndpoints:
    - orderer0.example.com:7050

    #### NAME 和 ID要保持一致, 创建通道配置时, 使用的是NAME字段, 在使用API时用的mspId, 也就是ID字段
    #### 通过 configtxgen -inspectChannelCreateTx ./channel-artifacts/sample-channel.tx | jq
    #### 命令可以查看通道配置
    - &SampleOrg1
    Name: SampleMSP
    ID: SampleMSP
    # 组织的MSP证书路径,对应 crypto-config.yaml 中 peer 组织生成的 MSP 证书路径。按实际域名修改
    MSPDir: ../organizations/peerOrganizations/org1.example.com/msp/
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('SampleMSP.admin', 'SampleMSP.peer', 'SampleMSP.client')"
    Writers:
    Type: Signature
    Rule: "OR('SampleMSP.admin', 'SampleMSP.client')"
    Admins:
    Type: Signature
    Rule: "OR('SampleMSP.admin')"
    Endorsement:
    Type: Signature
    Rule: "OR('SampleMSP.peer')"
    # 定义组织的主节点
    AnchorPeers:
    # 主节点的host地址
    - Host: peer0.org1.example.com
    # 主节点开放的端口号
    Port: 7051

    # Capabilities 段用来定义区块链网络的能力
    Capabilities:
    # Channel配置同时应用于orderer节点与peer节点,并且必须被两种节点同时支持
    # 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
    Channel: &ChannelCapabilities
    V2_0: true
    # Orderer功能仅适用于orderers,可以安全地操作,而无需担心升级peers
    # 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
    Orderer: &OrdererCapabilities
    V2_0: true
    # 应用程序功能仅适用于Peer网络,可以安全地操作,而无需担心升级或更新orderers
    # 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
    Application: &ApplicationCapabilities
    V2_0: true

    # Application配置段用来定义要写入创世区块或配置交易的应用参数
    # 自定义被引用的地址
    Application: &ApplicationDefaults
    # Organizations配置列出参与到网络中的机构清单
    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配置描述应用层级的能力需求,这里直接引用
    # 前面Capabilities配置段中的ApplicationCapabilities配置项
    Capabilities:
    <<: *ApplicationCapabilities

    # Orderer配置段用来定义要编码写入创世区块或通道交易的排序节点参数
    Orderer: &OrdererDefaults
    # 排序节点类型用来指定要启用的排序节点实现,不同的实现对应不同的共识算法。
    OrdererType: etcdraft
    # 定义了EtcdRaft排序类型被选择时的配置
    EtcdRaft:
    Consenters:
    - Host: orderer0.example.com
    Port: 7050
    ClientTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
    ServerTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
    BatchTimeout: 2s
    BatchSize:
    # 将多少个消息打包成一个区块
    MaxMessageCount: 200
    AbsoluteMaxBytes: 99 MB
    PreferredMaxBytes: 2048 KB
    # 参与维护Orderer的组织,默认为空
    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"
    # Writes策略定义了调用Broadcast API提交交易的许可规则
    Writers:
    Type: ImplicitMeta
    Rule: "ANY Writers"
    # Admin策略定义了修改本层级配置的许可规则
    Admins:
    Type: ImplicitMeta
    Rule: "MAJORITY Admins"
    # Capabilities配置描通道层级的能力需求,这里直接引用
    # 前面Capabilities配置段中的ChannelCapabilities配置项
    Capabilities:
    <<: *ChannelCapabilities

    Profiles:
    # 用来生成orderer启动时所需的block,用于生成创世区块,名字可以任意
    # 需要包含Orderer和Consortiums两部分
    SampleOrdererGenesis:
    # 通道为默认配置,这里直接引用上面channel配置段中的ChannelDefaults
    <<: *ChannelDefaults
    Orderer:
    # Orderer为默认配置,这里直接引用上面orderer配置段中的OrdererDefaults
    <<: *OrdererDefaults
    Organizations:
    # 这里直接引用上面Organizations配置段中的OrdererOrg
    - *OrdererOrg
    Capabilities:
    # 这里直接引用上面Capabilities配置段中的OrdererCapabilities
    <<: *OrdererCapabilities
    # 联盟为默认的 sampleBC 联盟,添加了一个组织,表示orderer所服务的联盟列表
    Consortiums:
    # 创建更多应用通道时的联盟引用 SampleChannel 所示
    sampleBC:
    Organizations:
    - *SampleOrg1 # 上面 Organizations 中 peer
    # 用来生成channel配置信息,名字可以任意
    # 需要包含Consortium和Applicatioon两部分
    SampleChannel:
    # 通道所关联的联盟名称
    Consortium: sampleBC
    # 通道为默认配置,这里直接引用上面channel配置段中的ChannelDefaults
    <<: *ChannelDefaults
    Application:
    # 这里直接引用上面Application配置段中的ApplicationDefaults
    <<: *ApplicationDefaults
    Organizations:
    - *SampleOrg1 # 上面 Organizations 中 peer
    Capabilities:
    # 这里直接引用上面Capabilities配置段中的ApplicationCapabilities
    <<: *ApplicationCapabilities
  2. 设置 FABRIC_CFG_PATH 环境变量,configtxgen 工具需要这个变量才能找到 configtx.yaml

    shell
    1
    export FABRIC_CFG_PATH=$PWD/fabric
  3. 生成创世区块

    其中 SampleOrdererGenesis 可在 configtx.yaml 配置文件中 Profiles 下找到

    shell
    1
    2
    configtxgen -profile SampleOrdererGenesis -channelID system-channel \
    -outputBlock channel-artifacts/genesis.block
  4. 创建业务通道配置

    其中 SampleChannel 可在 configtx.yaml 配置文件中 Profiles 下找到

    shell
    1
    2
    3
    4
    5
    6
    export MSP_CHANNEL_PROFILE=SampleChannel
    # 业务通道名
    export CHANNEL_NAME=sample-channel
    # 创建业务通道
    configtxgen -profile ${MSP_CHANNEL_PROFILE} -outputCreateChannelTx channel-artifacts/${CHANNEL_NAME}.tx \
    -channelID ${CHANNEL_NAME}
  5. 根据 configtx.yaml 配置文件中 peer 组织生成该组织锚节点配置

    其中 SampleMSPconfigtx.yamlOrganizations 下组织

    shell
    1
    2
    3
    4
    5
    # peer MSP_NAME
    export ORG_MSP=SampleMSP
    # 生成锚节点配置
    configtxgen -profile ${MSP_CHANNEL_PROFILE} -outputAnchorPeersUpdate channel-artifacts/${ORG_MSP}anchors.tx \
    -channelID ${CHANNEL_NAME} -asOrg ${ORG_MSP}

上述三步均没报错的情况,则表明通道配置创建成功,可以看到 channel-artifacts 目录下有对应生成的三个文件

channel-artifacts
1
2
3
4
channel-artifacts/
├── genesis.block
├── sample-channel.tx
└── SampleMSPanchors.tx

启动区块链节点服务

  • DNS 服务器上添加 OrdererPeer 节点的域名与部署所在宿主机的 IP 映射

  • 保留当前操作容器的终端,并新开一个终端进入部署区块链的目录 /opt/product/blockchain

Orderer

  1. docker 目录下创建 Orderer 节点的 docker-compose 编排文件,参考如下:

    docker/compose-orderer0.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    version: "3"

    networks:
    default:
    external:
    name: blockchain

    volumes:
    orderer0.example.com: {}

    services:
    orderer0.example.com:
    image: hyperledger/fabric-orderer:${IMAGE_TAG}
    container_name: orderer0.example.com
    restart: always
    working_dir: /opt/orderer
    command: orderer
    environment:
    - TZ=Asia/Shanghai
    - FABRIC_LOGGING_SPEC=INFO
    - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
    - ORDERER_GENERAL_LISTENPORT=7050
    - ORDERER_GENERAL_GENESISMETHOD=file
    - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/genesis.block
    - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
    - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/orderer/msp
    - ORDERER_GENERAL_TLS_ENABLED=true
    - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/orderer/tls/server.key
    - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/orderer/tls/server.crt
    - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/orderer/tls/ca.crt]
    - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
    - ORDERER_KAFKA_VERBOSE=true
    - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/etc/hyperledger/orderer/tls/server.crt
    - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/etc/hyperledger/orderer/tls/server.key
    volumes:
    # 创世块文件路径
    - $PWD/channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block
    # orderer 节点证书路径
    - $PWD/organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/:/etc/hyperledger/orderer
    # orderer 数据持久化存储
    - orderer0.example.com:/var/hyperledger/production/
    ports:
    - "7050:7050"
    logging:
    driver: json-file
    options:
    max-size: "1024m"
  2. 启动 Orderer 节点

    shell
    1
    docker-compose -p orderer -f docker/compose-orderer0.yml up -d
  3. 开放 Orderer 节点防火墙端口

    shell
    1
    2
    firewall-cmd --zone=public --permanent --add-port=7050/tcp
    firewall-cmd --reload

Peer

  1. docker 目录下创建 Peer 节点的 docker-compose 编排文件,参考如下:

    docker/compose-org1-peer0.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    version: '3'

    networks:
    default:
    external:
    name: blockchain

    volumes:
    peer0.org1.example.com: {}
    # 数据库存储文件
    couch.peer0.org1.example.com: {}

    services:
    couchdb:
    image: couchdb:3.1
    container_name: couch.peer0.org1.example.com
    restart: always
    environment:
    - TZ=Asia/Shanghai
    - COUCHDB_USER=admin
    - COUCHDB_PASSWORD=adminpw
    volumes:
    - couch.peer0.org1.example.com:/opt/couchdb/data
    # 如需外部访问数据库,映射如下端口即可
    # ports:
    # - "5984:5984"
    peer0.org1.example.com:
    image: hyperledger/fabric-peer:${IMAGE_TAG}
    container_name: peer0.org1.example.com
    restart: always
    working_dir: /opt/peer
    command: peer node start
    environment:
    - TZ=Asia/Shanghai
    - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
    - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host
    - FABRIC_LOGGING_SPEC=INFO
    - CORE_PEER_TLS_ENABLED=true
    - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/peer/tls/server.crt
    - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/peer/tls/server.key
    - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/peer/tls/ca.crt
    - CORE_PEER_TLS_CLIENTROOTCAS_FILE=/etc/hyperledger/peer/tls/ca.crt
    - CORE_PEER_GOSSIP_USELEADERELECTION=true
    - CORE_PEER_GOSSIP_ORGLEADER=false
    - CORE_PEER_PROFILE_ENABLED=true
    # 填写当前 peer 节点对应的域名
    - CORE_PEER_ID=peer0.org1.example.com
    - CORE_PEER_ADDRESS=0.0.0.0:7051
    # 填写当前 peer 节点对应的域名
    - CORE_PEER_LISTENADDRESS=peer0.org1.example.com:7051
    - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
    - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp
    # 与 configtx.yaml 中一致
    - CORE_PEER_LOCALMSPID=SampleMSP
    - CORE_PEER_GOSSIP_BOOTSTRAP=127.0.0.1:7051
    - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
    # couchDB 数据库容器
    - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
    - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couch.peer0.org1.example.com:5984
    - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin
    - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw
    # 构建链码的镜像
    - CORE_CHAINCODE_BULDER=hyperledger/fabric-ccenv:${IMAGE_TAG}
    # GO 链码基础镜像
    - CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:${IMAGE_TAG}
    volumes:
    # 为 peer 节点提供宿主机 docker api 构建并启动链码
    - /var/run/docker.sock:/host/var/run/docker.sock
    # 当前 peer 节点证书路径
    - $PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/peer/
    # peer 节点数据持久化存储
    - peer0.org1.example.com:/var/hyperledger/production
    ports:
    - "7051:7051"
    logging:
    driver: json-file
    options:
    max-size: "1024m"
    depends_on:
    - couchdb
  2. 启动 Peer 节点

    shell
    1
    docker-compose -p peer -f docker/compose-org1-peer0.yml up -d
  3. 开放 Peer 节点防火墙端口

    shell
    1
    2
    firewall-cmd --zone=public --permanent --add-port=7051-7052/tcp
    firewall-cmd --reload

通道设置

  1. 切换到 fabric-cli 容器终端,并设置 FABRIC_CFG_PATH 环境变量,peer 工具需要这个变量才能找到 core.yaml

    shell
    1
    export FABRIC_CFG_PATH=/etc/hyperledger/fabric/
  2. 设置创建通道需要的环境变量

    shell
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    export ORDERER_ORG_NODE=orderer0
    export ORDERER_ORG_DOMAIN=example.com
    export PEER_ORG_NODE=peer0
    export PEER_ORG_DOMAIN=org1.example.com
    # 业务通道名
    export CHANNEL_NAME=sample-channel
    # peer MSPID,与 configtx.conf 中配置一致
    export CORE_PEER_LOCALMSPID=SampleMSP
    # orderer 节点访问地址
    export ORDERER_ENDPOINT=${ORDERER_ORG_NODE}.${ORDERER_ORG_DOMAIN}:7050
    # orderer CA 证书
    export ORDERER_CA=${PWD}/organizations/ordererOrganizations/${ORDERER_ORG_DOMAIN}/tlsca/tlsca.${ORDERER_ORG_DOMAIN}-cert.pem
    # 当前 peer 节点根证书
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/ca.crt
    # peer 节点管理员 MSP 配置路径
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/users/Admin@${PEER_ORG_DOMAIN}/msp/
    # 当前 peer 节点访问地址
    export CORE_PEER_ADDRESS=${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}:7051
    export CORE_PEER_TLS_CERT_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/server.crt
    export CORE_PEER_TLS_KEY_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/server.key
    export CORE_PEER_TLS_CLIENTROOTCAS_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/ca.crt
  3. 创建通道

    shell
    1
    2
    3
    peer channel create -o ${ORDERER_ENDPOINT} -c ${CHANNEL_NAME} \
    -f channel-artifacts/${CHANNEL_NAME}.tx \
    --outputBlock channel-artifacts/${CHANNEL_NAME}.block --tls --cafile ${ORDERER_CA}
  4. 当前 peer 节点加入通道

    shell
    1
    peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block
  5. 验证 peer 节点是否加入通道中

    shell
    1
    peer channel getinfo -c ${CHANNEL_NAME}
  6. 更新主节点信息

    shell
    1
    2
    peer channel update -o ${ORDERER_ENDPOINT} -c ${CHANNEL_NAME} \
    -f channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA

至此,Hyperledger Fabric 区块链最小化网络架构(单一组织、1 peer、1 Orderer)部署完毕。不过仅部署完节点还无法使用区块链,要想能够使数据上下链还得部署链码(chaincode)才行。

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...