手动搭建一个fabric网络一

手动搭建一个fabric网络一

准备工作

1.启动节点之前要生成账号

  • 客户端
  • peer节点
  • orderer节点

2.将创始区块和通道信息写入配置文件,生成创世区块和通道需要的文件

3.docker-compose配置文件

节点的操作
  • 创建通道, 根据之前生成的通道文件
  • 将所有的peer节点加入到通道中
  • 将编写好的智能合约安装到peer节点上
  • 对链码初始化
  • 测试 - > 通过客户端
    • 读账本
    • 写账本

生成证书文件

创建一个目录,用于工作目录

将配置文件重定向到指定文件中

$ 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

生成创始区块文件和通道文件

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

docker-compose文件的编写

客户端角色需要使用的环境变量

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环境变量的方式切换操作的节点

orderer节点需要使用的环境变量
# 日志级别,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中去找路径

peer节点需要使用的环境变量
- 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

注意环境变量等号后边不要有空格

你可能感兴趣的:(fabric)