Hyperledger Fabric原理详解与实战11

1,081 阅读10分钟

本文主要内容如下,爱看不看~

好了,理论知识已经聊得差不多了。至此,我想你对Fabric的运作原理已经十分熟悉了。

继续我们的实操吧!

启动peer节点

准备材料

  1. 按之前的规划,每个组织准备linux服务2台:

    组织 内网IP 内网端口 访问域名 外网端口
    M 172.16.0.10 7051 peer0.m.com 7051
    M 172.16.0.11 8051 peer1.m.com 8051
    Rate 192.168.10.10 7051 peer0.rate.com 7051
    Rate 192.168.10.11 8051 peer1.rate.com 8051
    DB 10.1.1.10 7051 peer0.db.com 7051
    DB 10.1.1.11 8051 peer1.db.com 8051
  2. 将msp和创世块文件拷贝到对应的服务器上:

    msp文件
    源文件:
    organizations/peerOrganizations/m.com/peers/peerN.m.com
    目标路径:
    /etc/hyperledger/fabric/msp

    注意:每个节点的源文件不同

    tls文件
    源文件:
    organizations/peerOrganizations/m.com/peers/peerN.m.com/tls
    目标路径:
    /etc/hyperledger/fabric/tls

    注意:每个节点的源文件不同

  3. peer可执行程序文件 参考《操作指南》

配置文件

同orderer节点一样,启动peer节点也需要有配置文件。默认会去读取当前目录或者FABRIC_CFG_PATH指定目录下的core.yaml。

同orderer节点一样,我们用环境变量来配置,以peer1.m.com为例:

CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
# 容器引擎的socket地址(使用容器时配置,但不适用于K8S等管理软件)

CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_mcorp
# 链码节点连接的网络(使用容器时配置)

CORE_PEER_PROFILE_ENABLED=true  
# 是否打开Go profile,生产环境应关闭

FABRIC_LOGGING_SPEC=INFO
# 输出日志级别

CORE_PEER_TLS_ENABLED=true
# 是否开启TLS

CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
# 本节点TLS证书

CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
# 本节点TLS私钥

CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
# TLS CA根证书

CORE_PEER_GOSSIP_USELEADERELECTION=false
# 是否采用选举产生leader节点

CORE_PEER_GOSSIP_ORGLEADER=true
# 本节点是否作为leader节点(与CORE_PEER_GOSSIP_USELEADERELECTION不能同时为true)

CORE_CHAINCODE_EXECUTETIMEOUT=300s  
# 调用链码超时时间。如果链码镜像被删除时,需留足够时间来重建镜像

CORE_PEER_ID=peer1.m.com
# 本节点唯一ID

CORE_PEER_ADDRESS=peer1.m.com:7051
# 本节点访问地址

CORE_PEER_LISTENADDRESS=0.0.0.0:7051
# 程序监听地址

CORE_PEER_CHAINCODEADDRESS=peer1.m.com:7052
# 链码服务访问地址

CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
# 链码服务监听地址

CORE_PEER_GOSSIP_BOOTSTRAP=peer0.m.com:7051
# GOSSIP协议种子地址,指定为本组织内的其他节点或本节点

CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.m.com:7051
# 发布到外网地址,供其他组织访问本节点的地址和端口,不设置则其他组织无法直接访问到本节点

CORE_PEER_LOCALMSPID=McorpMSP
# 组织唯一MSP ID,需与通道设置中的保持一致

CORE_LEDGER_STATE_STATEDATABASE=CouchDB
# 状态数据库类型,默认为goleveldb

CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
# 状态数据库地址和端口

CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
# 状态数据库用户名

CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
# 状态数据库密码

启动程序

去服务器上执行如下命令:

peer node start

然后,观察输出日志信息是否有报错。

到此,所有节点都启动好了。但要让网络真正运作,还需要有Channel

创建应用通道

对Fabric来说,Channel的增删改操作也是通过交易来完成的。这种属于系统配置交易。

无论什么交易,对它的处理逻辑是一以贯之的,除了在打包交易的时候,系统配置交易和普通交易有点区别。

系统配置交易和普通交易不会同时打包在一个块中。也就是说,一个块中只会包含普通交易,或者只包含系统配置交易。

这其实也很好理解,系统配置保存在系统区块链中,而系统区块链保存在orderer中。普通交易的块是要发给peer的。而系统配置交易则不需要。

创建应用通道包含如下两步:

  1. 生成创建Channel的交易文件
  2. 生成应用Channel的创世块文件

生成创建Channel的交易文件

找到生成创世块时我们用到的configtx.yaml文件。

还记得里面有两个Profiles配置吗?前面已经用过一个了,剩下的一个在这里用。

配置里每一项我们都已经讲解过了,这里不再啰嗦。

要注意的一点是,Application.Organizations里的组织必须包含在Consortium指定的联盟里。

Consortium是生成创世块的时候配置的。忘记了的话,翻翻Consortiums配置那一章节。

配置文件准备好了以后,执行如下命令:

configtxgen -profile ForCreateChannel -outputCreateChannelTx ./channel-artifacts/bondnet.tx -channelID bondnet

# -profile 指定使用配置文件中Profiles的哪段配置
# -outputCreateChannelTx 指定生成交易信息的文件名称
# -channelID 指定通道名称

完成后,会产生文件:./channel-artifacts/bondnet.tx。里面包含了创建Channel的交易请求和相关读写集信息,用于向orderer发起创建Channel的请求。

生成应用Channel的创世块文件

还记得交易流程吗?

要生成块,就要有交易请求,发起交易请求需要有客户端。

客户端软件可以是用户自己编写的。如果没有的话,像创建Channel这种系统维护操作,也可以用peer。

我们可以任选一个Channel中的组织,用它的管理员和peer节点来完成生成应用Channel的创世块文件操作。

但一般的做法是找一台能运行peer的主机或容器作为客户端,通过设置环境变量的方式来运行。

另外,操作客户端还需要一个用户,创建Channel需要以管理员的身份来执行。所以,用户必须是管理员。

假设客户端主机名称为client-host。

操作步骤如下:

  1. 拷贝 organizations/peerOrganizations/m.com/users/Admin@m.comclient-host:/tmp目录下。

  2. 拷贝organizations/ordererOrganizations/mid.org/orderers/order0.mid.org/tls/ca.crtclient-host:/tmp/order0.mid.org/tls/ 目录下。

  3. 拷贝 channel-artifacts/bondnet.txclient-host:/tmp 目录下。

  4. 新起一个shell连接。

  5. 配置以下环境变量:

export CORE_PEER_LOCALMSPID=McorpMSP
# 使用M公司的MSP

export CORE_PEER_TLS_ENABLED=true
# 启用TLS

export CORE_PEER_MSPCONFIGPATH=/tmp/Admin@m.com/msp
# 指定admin的msp目录
  1. 执行命令:
peer channel create -o order0.mid.org:7050 -c bondnet -f /tmp/bondnet.tx --outputBlock /tmp/bondnet.block --tls true --cafile /tmp/order0.mid.org/tls/ca.crt
# -o: 指定order服务地址,如果采用IP地址,可以使用--ordererTLSHostnameOverride 指定order证书中设置的域名。
# -c: 指定channel名称。
# -f: 指定创建Channel的交易文件路径。
# --tls: 是否开启tls,如果Order开启了tls,则设置为true。
# --cafile: 指定order证书的根ca。
# --outputBlock:指定生成块文件的路径。

/tmp/bondnet.block这个文件就是bondnet这个Channel对应区块链的创世块文件。

NOTE
以上我们只是讨论的默认情况,如果相关策略和ACL有变化,则应根据新的策略或ACL做相应调整。

将peer加入Channel

这一步是将新Channel相关的peer节点加入到Channel中来。

注意,是相关的peer,如果你有一个peer不想参与到该Channel中来,可以不执行加入操作。

可以在每个组织中选一台peer节点来执行,也可以在上一节的client-host上来执行。

这里我在peer0.m.com节点上执行,步骤如下:

  1. 将上一节生成的bondnet.block文件拷贝到peer节点的/tmp/目录下。

  2. 同样需要管理员身份来操作,拷贝 organizations/peerOrganizations/m.com/users/Admin@m.compeer0.m.com:/tmp目录下。

  3. 新起一个shell连接。

  4. 配置以下环境变量:

export CORE_PEER_MSPCONFIGPATH=/tmp/Admin@m.com/msp
  1. 执行如下命令,将peer0.m.com加入通道:
peer channel join -b /tmp/bondnet.block
  1. 如果有其他要加入的peer,设置如下环境变量,切换连接的peer节点:
export CORE_PEER_ADDRESS=peer1.m.com:8051
  1. 然后执行如下命令,将peer1.m.com加入通道:
peer channel join -b /tmp/bondnet.block

同样的,组织内,想让哪个peer加入Channel,就将CORE_PEER_ADDRESS改为那个peer的服务地址。

其他组织也是同样的操作。

最后别忘了清理掉之前拷贝到/tmp目录下的文件,用户的私钥可不能泄露了。

如果在client-host上操作,环境变量需要多设置几个,例如:

export CORE_PEER_LOCALMSPID=McorpMSP
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_MSPCONFIGPATH=./organizations/peerOrganizations/m.com/users/Admin@m.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=./organizations/peerOrganizations/m.com/peers/peer0.m.com/tls/ca.crt 
# ca.crt用于加入通道时校验peer给的证书
export CORE_PEER_ADDRESS=peer0.m.com:7051

设置锚节点

设置锚节点本质上是对应用Channel配置的修改。

生成修改锚节点配置的交易文件

锚节点的配置依然在configtx.yaml文件中

执行以下命令,生成修改锚节点配置的交易文件:

configtxgen -profile ForCreateChannel -outputAnchorPeersUpdate ./channel-artifacts/McorpMSPanchors.tx -channelID bondnet -asOrg McorpMSP
# -profile 指定使用配置文件中Profiles的哪段配置
# -outputAnchorPeersUpdate 指定生成配置锚节点交易的文件名称
# -channelID 指定通道名称
# -asOrg 每个组织需要单独配置,该参数指定组织的MSP名称(非MSP ID)。

其他组织修改-asOrg后,做同样的操作。

发起修改锚节点配置交易请求

以下以配置m.com组织的锚节点为例,其他组织做同样的操作。

在客户端机client-host上操作,步骤如下:

  1. 拷贝 organizations/peerOrganizations/m.com/users/Admin@m.comclient-host:/tmp目录下。

  2. 拷贝organizations/ordererOrganizations/mid.org/orderers/order0.mid.org/tls/ca.crtclient-host:/tmp/order0.mid.org/tls/ 目录下。

  3. 拷贝 channel-artifacts/McorpMSPanchors.txclient-host:/tmp 目录下。

  4. 新起一个shell连接。

  5. 配置以下环境变量:

export CORE_PEER_LOCALMSPID=McorpMSP
# 使用M公司的MSP

export CORE_PEER_TLS_ENABLED=true
# 启用TLS

export CORE_PEER_MSPCONFIGPATH=/tmp/Admin@m.com/msp
# 指定admin的msp目录

export CORE_PEER_ADDRESS=peer1.m.com:7051
# 指定要连接的peer节点
  1. 执行命令:
peer channel update -o order0.mid.org:7050 -c bondnet -f /tmp/McorpMSPanchors.tx --tls true --cafile /tmp/order0.mid.org/tls/ca.crt
# -o: 指定order服务地址,如果采用IP地址,可以使用--ordererTLSHostnameOverride 指定order证书中设置的域名。
# -c: 指定channel名称。
# -f: 指定修改锚节点的交易文件路径。
# --tls: 是否开启tls,如果Order开启了tls,则设置为true。
# --cafile: 指定order证书的根ca。

问:创建和修改通道这些交易中,谁充当客户端、背书节点的角色?调用了什么样的链码?

答:发起请求的peer程序充当客户端,CORE_PEER_ADDRESS指定的peer节点充当背书节点,调用了系统链码。

结语

至此,我们的基础网络就全部搭建完了。下一篇,我们就要正式开始编写和使用Fabric的应用了。

不知道你看完基础网络搭建过程是什么感受?

我的感受主要有两点:

  1. Fabric将区块链系统的各个环节拆分成了一个个单独的模块,虽然对初学者来说这很不友好,学习曲线太陡。
    但学完后,再去看其他的区块链系统,好像只是Fabric中模块或者过程的重新组合(当然,深入去看,各个系统还是有很大差异的)。
    退一步讲,学习和探索的过程本身不也很有意思吗?

  2. 控制感。和玩公有链相比,私有链和联盟链有更多的自主权,不需要遵守很多公有链制定好的规则。Fabric的模块化更让程序员觉得“世界尽在掌握”。
    可能程序员给人的刻板印象是:少言寡语,木讷难沟通。那是因为你感受不到我们身处的是一个怎样的世界。

或许你现在还没有感受到Fabric模块化的程度。别急,还有一堆新的概念等着我们去理解呢!

我是2流程序员,我们下次再贱!

本文使用 mdnice 排版