fabric框架学习

二、手动搭建Fabric网络

2.1 生成fabric证书

cryptogen模块主要用来生成组织结构和账号相关的文件,任何fabric系统的开发通常都是从cryptogen模板开始的。

2.1.1 生成配置文件模板

编写配置文件前,首先先获取一个配置文件的模板,方便编写,可使用命令:

cryptogen showtemplate > crypto-config.yaml

cryptogen showtemplate:输出配置文件的模板

>:表示重定向

合起来表示输出配置文件的模板,并重定向到crypto-config.yaml文件中,即把内容输出到crypto-config.yaml文件中,若该文件不存在,则自动创建该文件,若已存在,则该文件的内容会被覆盖。

若出现该错误:cryptogen: 未找到命令

则表示未配置环境变量,在系统配置文件中加入

export cryptogen_HOME=/root/hyperledger-fabric/fabric-samples

export PATH=$PATH:$cryptogen_HOME/bin

并对配置文件进行更新

 2.1.2 修改配置文件模板

OrdererOrgs:                                  #排序节点的组织信息
  - Name: Orderer                           #排序节点的组织名字,可修改
    Domain: example.com              #根域名,排序节点组织的根域名,可修改
    Specs:
      - Hostname: orderer                #要想访问这台orderer,访问域名为orderer.example.com 

                                                         #可添加多个


PeerOrgs:                                       #peer组织,进行数据存储
  - Name: Org1                                #第一个组织的名字,可以修改
    Domain: org1.example.com     #访问第一个组织用到的根域名
    EnableNodeOUs: true               #是否支持Node.js

    Template:                                    #模板,生成存储数据peer节点的个数
      Count: 2                                    #对第一个组织进行访问,访问域名peer0.org1.example.com
    Users:                                         #普通用户的个数
      Count: 3                                    #peer组织,进行数据存储


  - Name: Org2                                #与上面一样
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

其中,Specs和Template的区别:Specs可以指定子域名的名字,而Template使用默认名,如peer0、peer1,根据自身需要,自行调节。

 2.1.2 生成证书

根据配置文件生成对应的证书,输入命令: 

cryptogen generate --config=crypto-config.yaml
--config=crypto-config.yaml表示根据crypto-config.yaml来生成证书,若不加上,则使用默认的配置文件

2.2 创始块文件和通道文件的生成

2.2.1 编写配置文件

将官网文件中的configtx.yaml复制到自己的demo中 

打开文件,内容如下

Organizations:                        #组织,固定格式,不能更改
    - &OrdererOrg                        #排序节点组织,可以修改
        Name: OrdererOrg                #排序节点组织名 
        ID: OrdererMSP                        #排序节点的组织ID
        MSPDir: crypto-config/ordererOrganizations/example.com/msp       

                                                      #MSPDir为组织的msp账号信息,需替换为自己排序节点的路径

    - &Org1                        #第一个组织,可以修改名字
        Name: Org1MSP        #第一个组织的名字
        ID: Org1MSP                #第一个组织的ID

        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

                                                   #MSPDir为组织的msp账号信息,需替换为自己第一个节点的路径

        AnchorPeers:                #锚节点
            - Host: peer0.org1.example.com        #指定一个peer节点的域名

              Port: 7051                                        #固定端口号,不要修改

    - &Org2
        Name: Org2MSP
        ID: Org2MSP

        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Capabilities:             #在fabric1.1之前是没有的,为了兼容旧版本,全部设置为true就行
    Global: &ChannelCapabilities
        V1_1: true
    Orderer: &OrdererCapabilities
        V1_1: true
    Application: &ApplicationCapabilities
        V1_2: true

################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults
    Organizations:

Orderer: &OrdererDefaults        #排序算法,也就是共识机制
    OrdererType: solo           #两种类型的排序算法,solo和kafka,测试的时候一般使用solo

                                           #做项目的时候使用kafka,可以处理大量数据,以及处理高并发的情况

    Addresses:                        #orderer节点的地址
        - orderer.example.com:7050        #修改为自己orderer节点的地址,后面的端口号不要修改

#产生区块的三个条件,分别是BatchTimeout、MaxMessageCount、AbsoluteMaxBytes,只要其#中有一个满足条件就会产生一个区块
    BatchTimeout: 2s                                #多长时间产生一个区块
    BatchSize:
        MaxMessageCount: 10        #交易的最大数量,达到该数量就会产生一个区块,建议100左右
        AbsoluteMaxBytes: 99 MB      #交易的数据量达到这个值也会产生一个区块,建议32或64MB
        PreferredMaxBytes: 512 KB        

    Kafka:        #如果使用solo,无需修改这部分
        Brokers:
            - 127.0.0.1:9092
    Organizations:

Profiles:                #不能修改

    TwoOrgsOrdererGenesis:        #区块名字,可以修改
        Capabilities:        
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:        #可以修改名字
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:        #通道名字,可以修改
        Consortium: SampleConsortium        #如果上面5行的名字改了,这里也要对应做修改
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities

2.2.2 生成创始块

输入命令:

configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesis.block

TwoOrgsOrdererGenesi:之前配置文件中Profiles下的区块名字

-outputBlock:生成创始块

./genesis.block:可以自定义一个名字,文件后缀为block

 2.2.3 生成通道文件

 输入命令:

configtxgen -profile TwoOrgsChannel -outputCreateChannelTx channel.tx - channelID casechannel

TwoOrgsChannel :之前配置文件中Profiles下的通道名字

-outputCreateChannelTx :生成通道文件

channel.tx:生成的通道文件名,可以自定义,后缀固定为tx

-channelID:后面跟着通道名字,可以自定义一个通道名字,与配置文件里的通道名无关,文件后缀为block

 2.2.4 生成锚节点更新文件

输入命令:

configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate org2MSPanchors.tx -channelID itcastchannel -asOrg Org2MSP

TwoOrgsChannel :之前配置文件中Profiles下的通道名字

-outputAnchorPeersUpdate:输出更新文件

org2MSPanchors.tx:生成的更新文件的名字,后缀为tx

-channelID itcastchannel:指定通道名,输入刚刚所创建的通道名字

-asOrg Org2MSP:指定锚节点所属的组织名,可以在configtx.yaml文件中查找

 然后为剩余排序组织的锚节点生成更新文件

最后创建一个目录 channel-artifacts,将.tx和.block后缀的文件都放入到该文件中

2.3 docker-compose文件的编写

将官方文件下的docker-compose-cli.yaml文件拷贝到自己的demo中

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

打开docker-compose-cli.yaml文件,滑动到cli部分,可以看到环境变量,讲解在备注中:

environment:
      - GOPATH=/opt/gopath        #客户端docker容器启动后,go的工作目录,无需修改
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock       #docker容器启动后对应守护                                                                                                             #进程的本地套接字,无需修改
      #- CORE_LOGGING_LEVEL=DEBUG
      - CORE_LOGGING_LEVEL=INFO        #日志级别,进程启动之后可能会出错,可以通过日志                                                                       #级别来排错
      - CORE_PEER_ID=cli                        #当前客户端节点的ID,自己指定                                     #客户端连接的peer节点,只要与客户端同属一个组织,就可以连接。需修改成自己的peer节点
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051                                                      
      - CORE_PEER_LOCALMSPID=Org1MSP        #peer节点所属的组织ID
      - CORE_PEER_TLS_ENABLED=true                #通信是否使用tls加密
      -     #证书文件,可以根据下面的地址,找到peer节点对应证书文件的地址,并替换下面的地址 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
      -        #根证书文件,步骤与上面一样 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
      -       #指定当前客户端的身份(通过该路径可以看到Admin,代表着客户端是一个管理员身份)  CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

在当前路径下创建一个chaincode目录,并在docker-compose-cli.yaml文件,滑动到cli部分,找到里面的volumes,修改chaincode的挂载路径,如下: 

保证这个路径与实际路径一致,然后删除./scripts部分。

下面的depends_on部分代表启动的顺序,改成自己各个peer节点的域名。

2.3.2 orderer节点需要使用的环境变量

将路径hyperledger-fabric/fabric-samples/first-network/base下的base目录拷贝到自己的demo中

打开docker-compose-base.yaml文件,可以看到方框中的内容

environment:
      - ORDERER_GENERAL_LOGLEVEL=INFO        #日志级别
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0        #orderer节点监听的地址
      - ORDERER_GENERAL_GENESISMETHOD=file           #创始块的来源,file代表创始块来源                                                                                                   #于文件                                               #上面文件的来源地址,即创始块文件的路径,无需修改
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP        #orderer节点所属的组ID              #当前节点的msp账号路径
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp 
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true        #通信是否使用tls加密                                #证书文件
      - 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] 

2.3.3 peer节点需要使用的环境变量 

打开base目录下的peer-base.yaml

environment:                                                                                                                                       #docker的本地套接字地址,无需修改
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock   
      # the following setting starts chaincode containers on the same
      # bridge network as the peers
      # https://docs.docker.com/compose/networking/                                                                          #当前节点属于哪个网络,修改为[docker-compose-cli.yaml所在的目录名]_[网络名]
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=case_bfyn       
      - CORE_LOGGING_LEVEL=INFO
      #- CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true  #是否释放自动选举leader节点         #当前是否是leader节点,若上面的值为true,则这里的值都设置为false
      - CORE_PEER_GOSSIP_ORGLEADER=false       
      - CORE_PEER_PROFILE_ENABLED=true        #peer节点中有一个profile服务,是否打开
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt 

打开base目录下的docker-compose-base.yaml

environment:
      - CORE_PEER_ID=peer0.org1.example.com        #当前peer节点的名字,可以自己取              #当前节点的地址信息,格式为peer节点的域名:端口号,只需修改为正确的peer节点域名
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051                                                       #启动的时候默认连接谁,写同一组的peer节点,一般写自己,GOSSIP机制大致是一个节点与另外的节点相连,然后被#连接的节点继续连接其他未连接的节点,直到所有能感应到的节点都连接上,类似流言,一个传 #一个,直到最后每个人都知道。
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051

#为了能被其他节点感应到,需设置这一项,设置为该节点的ID;如果不设置,就不会被其他节点 #感应到,不知道该节点的存在
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP         #peer节点的组织ID

 2.3.4 docker-compose的启动

将demo根目录下的docker-compose-cli.yaml改成docker-compose.yaml,然后输入命令:             docker-compose up -d

验证是否启动成功,输入命令:                                                                                                         docker-compose ps

 当六个服务都启动时,代表成功了

2.4 peer操作命令

2.4.1 创建通道

先进入cli容器,输入命令:docker exec -it cli bash

创建一个通道,输入命令peer channel create -o orderer节点域名:端口  -c 通道名  -f 通道文件 --tls  true -cafile orderer节点pem格式的证书文件

其中的通道文件和通道名是之前生成的,通过查找之前的步骤可以看到

peer channel create -o orderer.example.com:7050 -c casechannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem

命令执行完毕后,会在当前目录生成一个文件:通道名.block 

2.4.2 加入通道

输入命令:                                                                                                                                          peer channel join -b 生成的通道block文件

 看到成功信息代表当前节点已经成功加入到这个通道中

2.4.3 切换客户端指向的节点

之前cli绑定的是org1的peer0节点,说明只是让这个节点加入到通道中,我们还需要让其他节点也加入到该通道中,所以需要对cli的环境变量做修改。

其中cli环境变量需要做修改的部分为:CORE_PEER_ADDRESS、CORE_PEER_LOCALMSPID、CORE_PEER_TLS_CERT_FILE、CORE_PEER_TLS_KEY_FILE、CORE_PEER_TLS_ROOTCERT_FILE、CORE_PEER_MSPCONFIGPATH;

在命令行中输入:                                                                                                                                  export CORE_PEER_ADDRESS=换绑的peer节点的域名:7051                                                      export CORE_PEER_LOCALMSPID=换绑的peer节点所属的组织ID                                              export CORE_PEER_TLS_CERT_FILE=换绑的peer节点的证书文件地址                                      export CORE_PEER_TLS_KEY_FILE=换绑的peer节点的私钥文件地址                                        export CORE_PEER_TLS_ROOTCERT_FILE=换绑的peer节点的根证书文件地址                        export CORE_PEER_MSPCONFIGPATH=换绑的peer节点指定身份的文件地址   

 可以通过命令来查看环境变量有没有修改成功                                                                                  输入命令:echo $CORE_PEER_ADDRESS,可以看到已经被修改成功了

然后让该节点加入到通道中,继续用命令:peer channel join -b 生成的通道block文件最后让每一个节点都加入到通道中,步骤和上面的一样

2.4.4 链码的安装

 将官方文档路径hyperledger-fabric/fabric-samples/chaincode/chaincode_example02/go中的chaincode_example02.go文件拷贝到自己demo中的chaincode文件。

链码安装的命令为:                                                                                                                          peer chaincode install -n 链码的名字 -v 链码的版本 -l 链码的语言 -p 链码的位置                        其中:链码的名字自己取一个;链码的版本可以当作自己项目的版本,按照实际情况来取值;链码的语言默认为go语言;链码的位置是从$GOPATH/src开始的,而$GOPATH/src的值可以通过cli环境变量gopath的值来查看。

2.4.5 链码的初始化

peer chaincode instantiate -o orderer节点的域名:端口号 --tls true  --cafile orderer节点pem格式的证书文件 -C 通道名称 -n Chaincode的名字  -l 链码语言 -v 链码的版本 -c 链码init函数调用 -P 背书策略

-c -P的例子:                                                                                                                                      -c '{"Args":["init","a","100","b","200"]}' #调用init函数,为a用户账户分配100,为b账户分配200        -P "AND ('Org1MSP.member', 'Org2MSP.member')"           #Org1.member代表Org1组织内的任意#一个peer节点,AND代表Org1任意一个peer节点和Org2任意一个peer节点在模拟交易中都通过才#算交易成功,若是换OR,代表两个组织的其中一个peer节点在模拟交易中通过,就认定交易成功

 最后让每一个节点都安装一次链码,在命令行中先修改cli的环境变量,然后执行链码安装的命令即可,不需要再次初始化,这是因为fabric提供同步服务,只需初始化一次就可以了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值