1.启动节点之前要生成账号
2.将创始区块和通道信息写入配置文件,生成创世区块和通道需要的文件
3.docker-compose配置文件
创建一个目录,用于工作目录
将配置文件重定向到指定文件中
$ cryptogen showtemplate > crypto-config.yaml
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs: # 关键字, orderer组织信息
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer # 随便起名, 不要和其他组织名重复
Domain: example.com # 组织的访问域名, 如果是本地测试域名随便写, 无需绑定
Specs:
# 访问这个orderer节点的地址: orderer.example.com
- Hostname: orderer # 在orderer组织中有一个节点, 这个节点叫orderer
# 访问这个orderer节点: Hostname.Domain
# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1
# ---------------------------------------------------------------------------
- Name: Org1 # 组织名, 可以随便改
# 一般这样命名: Name.orderer组织的Domain
Domain: org1.example.com # 访问当前组织的域名
EnableNodeOUs: false # 控制在节点目录中是否生成一个配置文件config.yaml
Template: # 模板
Count: 3 # 根据模板生成三个peer节点的账号
# 三个peer节点的名字: peer0, peer1 peer2
# 三个peer节点的访问地址: peer0/1/2.当前组织的Domain
Users:
Count: 10 # 生成多少个客户端账号
# 客户端用户的名字: user0, user1, user2
# 这10个账号是普通用户的账号
# 隐藏的会默认生成管理员账号: admin
# ---------------------------------------------------------------------------
# Org2: See "Org1" for full specification
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: false
Template:
Count: 1
Users:
Count: 1
# cryptogen generate --config 配置文件名
$ cryptogen generate --config crypto-config.yaml
定义
- &OrdererOrg #定义一个变量
使用
*OrdererOrg
一个普通peer
节点,代表当前组织与其他组织进行通信,peer
组织都是有锚节点,锚节点具有普通节点的所有功能,而且多了与其他组织进行通信的功能。
配置创始区块和通道的配置文件需要从示例文件中拷贝出来
# 设置组织的账号信息
Organizations: # 关键字, 不能修改
# 定义了变量 OrdererOrg
- &OrdererOrg
# Name和ID的值可以相同
Name: OrdererOrg # orderer组织的名字, 随便起名, 不要和别的组织重名即可
ID: OrdererMSP # orderer组织的ID, 随便写, 不能和其他组织ID重复
# 当前orderer组织的账号目录
# 账号信息是通过cryptogen命令生成的, 默认在crypto-config目录中
# 这个路径一般使用相对路径 == 相对于当前的配置文件目录
# 账号目录特点: 目录名: msp
MSPDir: crypto-config/ordererOrganizations/itcast.com/msp
# go组织的信息
- &OrgGo
Name: OrgGoMSP # 随便起名, 不与别的组织名冲突
ID: OrgGoMSP
# 组织的账号目录
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
# 组织的锚节点
AnchorPeers:
# 作为锚节点的peer节点的访问地址
- Host: peer1.orggo.itcast.com
# 这个值是固定的, 不需要修改
# peer节点运行在docker容器中, 对外开放的通信端口为7051
Port: 7051
- &OrgCpp
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
AnchorPeers:
- Host: peer0.org2.example.com
Port: 7051
################################################################################
#
# SECTION: Capabilities, 在fabric1.1之前没有, 设置的时候全部设置为true
#
################################################################################
Capabilities:
Global: &ChannelCapabilities
V1_1: true
Orderer: &OrdererCapabilities
V1_1: true
Application: &ApplicationCapabilities
V1_2: true
################################################################################
#
# SECTION: Application
#
################################################################################
Application: &ApplicationDefaults
Organizations:
################################################################################
#
# SECTION: Orderer
#
################################################################################
Orderer: &OrdererDefaults
# Available types are "solo" and "kafka"
# 使用什么样的排序算法
OrdererType: solo
Addresses: # orderer节点的地址
# orderer节点运行在docker容器中, 开放的对外通信端口7050
- orderer.itcast.com:7050
# 以下三种情况只要有一个条件满足, 就会打包生成区块
# 每隔多长时间打包一个区块
BatchTimeout: 2s
BatchSize:
# 提交的交易的条数 >=100, 打包一个区块
MaxMessageCount: 100
# 消息的总大小>=99M的时候, 打包一个区块
AbsoluteMaxBytes: 99 MB ==> 32M, 64M
# 建议的区块大小
PreferredMaxBytes: 512 KB
# 如果排序算法使用是solo, 这个设置是不会生效的
Kafka:
Brokers:
- 127.0.0.1:9092
Organizations:
################################################################################
#
# Profile
#
################################################################################
Profiles:
# 设置创始区块中写入的信息
Genesis: # 这个关键字随便改, 这个名字在执行命令生成文件的时候被使用
Capabilities:
<<: *ChannelCapabilities
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Consortiums: # 关键字, 不能改
SampleConsortium: # 联盟的名字, 随便起
Organizations: # 联盟中的peer组织, 关键字, 不能改
- *OrgGo
- *OrgCpp
# 设置通道中写入的信息
Channel: # 这个关键字随便改, 这个名字在执行命令生成文件的时候被使用
Consortium: SampleConsortium # 和102行的名字对应
Application:
<<: *ApplicationDefaults
Organizations:
- *OrgGo
- *OrgCpp
Capabilities:
<<: *ApplicationCapabilities
-profile 后边的参数从configtx.yaml中的Profiles 里边的配置项
# -outputBlock: 指定生成的创始区块文件
# Genesis是从configtx.yaml中的profiles中找的
configtxgen -profile Genesis -outputBlock genesis.block
# Channel是从configtx.yaml中的profiles中找的
# outputCreateChannelTx: 指定生成的通道文件的名字
# channelID: 指定创建的通道的名字, 名字是唯一的, 如果忘记指定默认叫: testchainid
configtxgen -profile Channel -outputCreateChannelTx channel.tx -channelID itcastchannel
# 默认情况下锚节点是不需要更新的, 这个文件是为更新锚节点做准备的
# 真正的更新操作是在peer节点加入到通道之后, 进行操作的
# 当某个组织的锚节点需要更换, 这时候才需要更新
# -outputAnchorPeersUpdate: 指定锚节点文件的名字
# -asOrg: 要更新的锚节点所属的组织的组织名
# 更新go组织的锚节点
configtxgen -profile Channel -outputAnchorPeersUpdate goAnchor.tx -channelID itcastchannel -asOrg OrgGoMSP
# 更新cpp组织的锚节点
configtxgen -profile Channel -outputAnchorPeersUpdate cppAnchor.tx -channelID itcastchannel -asOrg OrgCppMSP
cli中tty
如果写true的话就是关联一个终端,stdin_open
如果写true的话就是标准输入打开
- GOPATH=/opt/gopath # 官方配置go环境设置的gopath目录
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock # docker的本地套接字文件, 进程间通信的
- CORE_LOGGING_LEVEL=INFO # 客户端容器日志级别, 级别高写的日志越少, 默认是info
- CORE_PEER_ID=cli # 客户端节点的名字, 随便起名
# 这个项是需要设置的 -> 重要
- CORE_PEER_ADDRESS=peer0.orggo.itcast.com:7051 # 客户端节点要连接的peer节点的地址
# configtx.yaml -> Organizations -> 对应的组织的组织ID
- CORE_PEER_LOCALMSPID=OrgGoMSP # 连接的peer节点所属的组织的组织ID
- CORE_PEER_TLS_ENABLED=true # 节点直接通信是否需要加密, true: 加密, false: 不加密
# 证书路径查找方法:
# crypto-config/peerOrganizations/连接的peer节点属于哪个组织(组织目录)/peers/要节点的peer节点的节点目录/tls
# tls证书的路径
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
# 私钥文件
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
# ca根证书
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
# 客户端的账号目录, 每个组织都有自己的用户账号
# crypto-config/peerOrganizations/连接的peer节点属于哪个组织(组织目录)/users/各个用户账号目录/msp
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/users/[email protected]/msp
注意搭载数据卷的时候,要按照自己的目录位置来进行挂载,其中有一项是
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scrip ts/
这项是搭载脚本文件,这里是手动搭建,所以这项可以删除
有一项是channel-artifacts
,自己创建一个目录,将创始区块文件、通道文件、锚节点更新文件放入此目录,保证数据卷挂载可以成功。
depends_on 是依赖关系,依赖的节点启动后进行启动
注意这里只是生成了orggo
的cli,还没有orgcpp的,以后用更改cli环境变量的方式切换操作的节点
# 日志级别,critical | error | warning | notice | info | debug, 这是从高到底的顺序
# docker logs 容器名/容器ID
- ORDERER_GENERAL_LOGLEVEL=INFO # orderer容器日志级别
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 # orderer容器绑定的地址
# 生成创始区块的时候, 数据来源 == file, 数据来自于某一个文件
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP # 当前orderer节点所属的组的组ID-> configtx.yaml
# 当前orderer节点的账号目录
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
- ORDERER_GENERAL_TLS_ENABLED=true # 通信时候是否需要加密
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
数据卷加载的时候也是要去生成的crypto-config
中去找路径
- CORE_PEER_ID=peer1.org1.example.com # peer节点的名字, 随便起名, 不要和其他节点冲突
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051 # 当前peer节点的地址
# 流言->绯闻
# 设置是否被外部节点感知, 值就是当前节点的地址
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
# 数据传播给那个节点, 这个地址是当前组织中的节点的地址, 写自己的地址也可以
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP # 当前peer所属的组的组织ID -> configtx.yaml
注意环境变量等号后边不要有空格