步骤一:搭建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..._sk
、560adb4..._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
公共参数解释
register
:fabric-ca-client
的注册操作,用于在CA中创建新的用户身份。-d
:启用调试模式,提供更多的输出信息,有助于调试和问题解析。--id.name
:注册的新用户身份的名称。--id.secret
:为新用户身份分配的密码,用于之后的登记操作。--id.type
:新用户身份的类型,如peer
、orderer
、admin
等。-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 documentation和smart 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_PATH
在fabric-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"]}'
标签:tls,tmp,fabric,部署,ca,hyperledger,CA,org0
From: https://blog.csdn.net/qq_28641579/article/details/139738759