组织(Org)和通道(Channel)的名称是fabric网络比较重要的两个配置参数,在fabric提供的示例中都已经设置好了这两个参数,一般组织名为"Org1"和"Org2",通道名为"mychannel"。而在实际应用开发中通常需要自定义组织和通道的名称,这里以最接近实际应用的balance-transfer为例说明如何自定义设置组织和通道名称。 

前言

Fabric网络在启动前会通过二进制工具cryptogenconfigtxgen生成成员的证书目录排序创世区块以及通道配置交易,组织和通道名称会在此时被写入配置信息中去。

所以如果想自定义设置这两个参数,需要重新生成这些配置信息,以及修改其他有关的配置文件以及应用程序代码。

balance-transfer是fabric-samples中的一个示例,基于fabric Node SDK实现了一个较为完整的应用程序,这里选择的是v1.0.0版本。

一、获取工具cryptogen和configtxgen

下载cryptogenconfigtxgen这两个工具的方法在first-network示例中已经介绍,除了这种从网络直接下载的方法,还可以在fabric项目中手动编译获得。

cd ~/go/src/github/hyperledger/fabric     // 进入fabric目录
make cryptogen && make configtxgen        // 编译生成工具

工具生成于fabric/build/bin目录下,移动至.../fabric-samples/balance-transfer/artifacts/channel目录下供后续使用。

二、修改cryptogen.yaml和configtx.yaml配置文件

这两个文件存放在bartifacts/channel目录下的,作用是配合上述工具生成网络初始化的配置信息。
改动很简单,将文件中的"Org1"和"Org2"分别替换成想要设置的组织名称即可。

三、生成证书目录,创世区块和通道配置交易

artifacts/channel目录下执行以下命令生成配置信息。

rm -rf crypto-config genesis.block mychannel.tx      //删除原有配置
./cryptogen generate --config=./cryptogen.yaml 
./configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesis.block 
./configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./newchannel.tx -channelID newchannel

注:如果需要修改通道名称,只需要在此步的--channelID参数后指定channel名称(默认是mychannel),然后修改balance-transfer目录下的config.json文件,替换channelName参数即可完成通道名称的修改。

完成后会在channel目录下生成新组织名的crypto-config目录,genesis.block以及newchannel.tx

四、修改网络配置文件network-config.json

该文件路径为app/network-config.json,文件中主要设置了网络各节点的ip和port信息,以及所属的组织。
同样,需要把这个文件中所有与组织名称有关的参数进行替换,注意不要遗漏了其中相关证书路径的修改。

五、修改CA服务器配置文件

这个文件的改动过程比较复杂,因为它是在CA节点启动时在内部自动生成的,想要修改只能够先将内容复制到外部进行改动,再映射到内部达到覆盖的效果。
该文件位于CA节点的文件系统中,需要在启动CA节点后进入容器内部:

docker exec -it ca_peerOrg1            // 假设此时还未修改组织名称
cat /etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml

打开该文件找到affiliations部分如下:

affiliations:
org1:
    - department1
    - department2
org2:
    - department1

发现这里把组织名称固定了,如果不修改,则会在用户注册时报错。首先需要在宿主机的artifacts目录下新建一个fabric-ca-server-config.yaml文件,然后将节点内部通过cat打印的整个文件内容复制上去,并且将affiliations部分的组织名修改成想要设置的名称。
这样,新的ca配置文件就在容器外部生成了,在下一步骤会将其映射到容器内部,这样可以覆盖自动生成的配置文件,从而达到修改的目的。

六、修改容器配置文件docker-compose.yaml

1.首先将docker-compose.yaml中所有需要修改的组织名称进行批量替换。

2.将CA节点配置的environment部分的CA KEYFILETLS KEYFILE值最后的私钥文件名(以_sk结尾)改成crypto-config/peerOrganizations/orgname.example.com/ca目录下的私钥文件名称,其中orgname是设置的新组织名称。

这一步是因为我们重新生成了msp目录crypto-config,所以私钥路径也发生了改变,不重新设置的话CA节点会因为找不到对应文件而启动失败。

3.设置CA服务器配置文件。将上一步重新生成的CA配置文件映射到容器内部,需要在volumes部分添加一行:

- ./fabric-ca-server-config.yaml:/etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml

七、修改应用程序代码

1.修改app/helper.js
helper.js最开始的一段全局代码中有如下语句:

for (let key in ORGS) {
    if (key.indexOf('org') === 0) {
        ...
    }
}

ORGS对象是从network-config.json中读取的所有组织信息,键分别为"orderer", "org1"和"org2"(未修改前),这一段循环的意思是对orderer除外的其他组织进行操作,但是很显然这里的if语句默认针对的是org1和org2,而我们修改了组织名称之后直接就失效了。
所以应该将if语句改为

if (key != 'orderer') {...}

2.修改启动及测试脚本
最后需要把启动脚本runApp.sh和testApp.sh中和组织名、通道名有关的变量进行修改,改完后分别启动这两个脚本就可以完成新网络的启动及测试,这时候就可以发现组织和通道的名称已经改成了我们自定义设置的内容啦!

脚本一键配置

没想到修改两个小小的参数竟然需要如此多繁琐的步骤,牵扯到这么多的配置文件,属实有点抽象。关于这个问题我写了一个能够一键执行完成以上操作的脚本,地址为https://github.com/zhayujie/fabric-tools。执行如下命令就可以设置整个项目的组织和通道名称:

./set_config.sh <orgName> <channelName>

主要的操作是去自动生成证书等初始配置,以及对需要修改的配置文件进行批量替换。目前这个脚本只适用于单机单组织,稍作修改就可以应用于多机和多组织场景下。

标签: fabric

已有 8 条评论

  1. yyy yyy

    请问下:我只是用 generate.sh 重新生成了一下配置文件,然后也改了docker-compose.yml里的keyfile,网络是可以启动,但marbles实例没法再正常运行了(报找不到链码)要怎么解决啊?是还有别的东西要改吗?

    1. zyj zyj

      可以看下启动脚本中链码安装和实例化的命令,是否有涉及到组织或通道名称。

      1. 哦哦,可是我没有改过名称(什么东西都没有动过),就只是重新生成了一下配置文件。

        1. zyj zyj

          需要看下generate.sh脚本的具体内容和报错详情,加我qq吧420536405

  2. 我现在用的是fabric2.1,没有balance-transfer,我想自己建一个这个,但是新版本.yaml很多配置项有添加,真的是束手无策。大神,救救我

    1. zyj zyj

      fabric 1.1版本后我就没有太关注了。2.1版本的fabric-samples里面有fabcar以及一系列其它的例子,可以参考它们的配置文件,开发模式都是类似的。

  3. YUX YUX

    方便加下QQ质询一下那个fabric-tools的东西吗

    1. zyj zyj

      可以,先email我一下吧 yjzha1996@163.com

添加新评论