本文主要内容如下,爱看不看~
好了,理论知识已经聊得差不多了。至此,我想你对Fabric的运作原理已经十分熟悉了。
继续我们的实操吧!
按之前的规划,每个组织准备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 |
将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
注意:每个节点的源文件不同
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的。而系统配置交易则不需要。
创建应用通道包含如下两步:
生成创建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这种系统维护操作,也可以用peer。
我们可以任选一个Channel中的组织,用它的管理员和peer节点来完成生成应用Channel的创世块文件操作。
但一般的做法是找一台能运行peer的主机或容器作为客户端,通过设置环境变量的方式来运行。
另外,操作客户端还需要一个用户,创建Channel需要以管理员的身份来执行。所以,用户必须是管理员。
假设客户端主机名称为client-host。
操作步骤如下:
拷贝 organizations/peerOrganizations/m.com/users/Admin@m.com
到 client-host:/tmp
目录下。
拷贝 organizations/ordererOrganizations/mid.org/orderers/order0.mid.org/tls/ca.crt
到 client-host:/tmp/order0.mid.org/tls/
目录下。
拷贝 channel-artifacts/bondnet.tx
到 client-host:/tmp
目录下。
新起一个shell连接。
配置以下环境变量:
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目录 复制代码
执行命令:
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做相应调整。
❞这一步是将新Channel相关的peer节点加入到Channel中来。
注意,是相关的peer,如果你有一个peer不想参与到该Channel中来,可以不执行加入操作。
可以在每个组织中选一台peer节点来执行,也可以在上一节的client-host上来执行。
这里我在peer0.m.com节点上执行,步骤如下:
将上一节生成的 bondnet.block
文件拷贝到peer节点的 /tmp/
目录下。
同样需要管理员身份来操作,拷贝 organizations/peerOrganizations/m.com/users/Admin@m.com
到 peer0.m.com:/tmp
目录下。
新起一个shell连接。
配置以下环境变量:
export CORE_PEER_MSPCONFIGPATH=/tmp/Admin@m.com/msp 复制代码
执行如下命令,将peer0.m.com加入通道:
peer channel join -b /tmp/bondnet.block 复制代码
如果有其他要加入的peer,设置如下环境变量,切换连接的peer节点:
export CORE_PEER_ADDRESS=peer1.m.com:8051 复制代码
然后执行如下命令,将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上操作,步骤如下:
拷贝 organizations/peerOrganizations/m.com/users/Admin@m.com
到 client-host:/tmp
目录下。
拷贝 organizations/ordererOrganizations/mid.org/orderers/order0.mid.org/tls/ca.crt
到 client-host:/tmp/order0.mid.org/tls/
目录下。
拷贝 channel-artifacts/McorpMSPanchors.tx
到 client-host:/tmp
目录下。
新起一个shell连接。
配置以下环境变量:
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节点 复制代码
执行命令:
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的应用了。
不知道你看完基础网络搭建过程是什么感受?
我的感受主要有两点:
Fabric将区块链系统的各个环节拆分成了一个个单独的模块,虽然对初学者来说这很不友好,学习曲线太陡。
但学完后,再去看其他的区块链系统,好像只是Fabric中模块或者过程的重新组合(当然,深入去看,各个系统还是有很大差异的)。
退一步讲,学习和探索的过程本身不也很有意思吗?
控制感。和玩公有链相比,私有链和联盟链有更多的自主权,不需要遵守很多公有链制定好的规则。Fabric的模块化更让程序员觉得“世界尽在掌握”。
可能程序员给人的刻板印象是:少言寡语,木讷难沟通。那是因为你感受不到我们身处的是一个怎样的世界。
或许你现在还没有感受到Fabric模块化的程度。别急,还有一堆新的概念等着我们去理解呢!
本文使用 mdnice 排版
我来评几句
登录后评论已发表评论数()