热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

fabric1.0动态加入组织

fabric的组织配置信息一般是提前写在configtx.yaml文件中的,通过configtx.yaml生成系统创世区块和通道文件。而系统启动和通道创建是通过创世区

fabric的组织配置信息一般是提前写在configtx.yaml文件中的,通过configtx.yaml生成系统创世区块和通道文件。而系统启动和通道创建是通过创世区块和通道文件进行的,因此要在fabric系统运行时添加组织则是非常困难的。

还好,fabric-1.0提供了configtxlator工具,为动态修改fabric通道信息提供可能。本文将介绍如何利用configtxlator为fabric-1.0网络动态添加组织。

运行fabric网络

本文利用fabric-sample项目中的first-network作为测试的示例。文档参考

下载fabric-sample

从github上克隆fabric-sample项目

$ git clone https://github.com/hyperledger/fabric-samples.git
$ cd fabric-samples

下载镜像和binary包

$ curl -sSL https://goo.gl/eYdRbX | bash

这一步可能需要翻墙,可以从这里下载,然后运行,或者

$ curl -sSL http://oui195df4.bkt.clouddn.com/download-bin.sh | bash

这一步会拉取fabric-1.0的镜像和binary包

生成证书和通道文件

为了测试添加组织,先利用cryptogen工具生成三个组织的证书。
修改first-network,添加org3

crypto-org3

生成证书和通道文件

$ ./byfn.sh -m generate

证书文件在crypto-config文件夹里,通道文件在channel-artifacts文件夹中

启动两个组织的fabric网络

执行

$ ./byfn.sh -m up

启动包括两个组织的fabric网络,cli容器会执行scripts/script.sh脚本进行创建mychannel通道,加入通道,部署chaincode,调用和查询chaincode等。

在系统channel中添加org

参考configtxlator工具的文档。

启动configtxlator服务

$ configtxlator start

获取系统通道的配置

设置MSP为Orderer


$ export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin\@example.com/msp/
$ export CORE_PEER_LOCALMSPID=OrdererMSP

获取通道

# peer channel fetch config config_block.pb -o orderer.example.com:7050 -c testchainid

生成添加组织的增量文件


  • 将配置信息区块转换为可读的json文件

$ curl -X POST --data-binary @config_block.pb http://127.0.0.1:7059/protolator/decode/common.Block > config_block.json

  • 获取config区域

$ jq .data.data[0].payload.data.config config_block.json > config.json

  • 修改config.json,添加org3信息

这一步可以利用configtxgen工具生成org3的配置信息,并将配置信息添加到config.json文件中,修改后的文件保存为updated_config.json,部分内容如图:

updated-config

  • 将original config和updated config打包成proto文件

$ curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb

$ curl -X POST --data-binary @updated_config.json http://127.0.0.1:7059/protolator/encode/common.Config > updated_config.pb

  • 生成增量文件

$ curl -X POST -F original=@config.pb -F updated=@updated_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=testchainid > config_update.pb

至此,更新通道的数据已经准备好了。利用SDK可以签名和打包此消息,发送更新通道交易。值得注意的是,这个交易需要所有通道中已存在的org进行签名。

由于系统channel中只有一个组织——OrdererMSP,因此也可以直接通过命令行发送交易。

更新通道


  • 将增量文件转换为pb格式

$ curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json

  • 打包数据

$ echo '{"payload":{"header":{"channel_header":{"channel_id":"testchainid", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_as_envelope.json

  • 转换为pb文件

$ curl -X POST --data-binary @config_update_as_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_as_envelope.pb

  • 进入cli,更新通道

root@d96f70c3b3ab:/#
root@d96f70c3b3ab:/# peer channel update -f config_update_as_envelope.pb -c testchainid -o 127.0.0.1:7050

此时系统channel——testchainid中则拥有了org3的信息。启动org3,则其可以进入fabric网络。但是org3无法加入mychannel通道,只能新建通道。

向mychannel添加org

向mychannel中添加org和向系统channel中添加org流程上是相同的,不同的是需要用所有PeerOrg进行签名。

生成增量pb文件

通过上述流程,生成增量pb文件,步骤省略。

发送更新通道交易

由于mychannel中有两个org,发送更新通道交易需要两个组织进行对更新交易进行多重签名,而通过执行peer channel update命令无法实现多重签名,因此需要通过SDK发送交易。

本文采用nodejs-sdk,创建更新交易js脚本,部分内容为

var signatures = [];
//读取增量pb文件
var config_proto = fs.readFileSync(path.join(__dirname, 'mychannel_config_update.pb'));return Client.newDefaultKeyValueStore({path: 'kvs_' + org}).then((store) => {client.setStateStore(store);client._userContext = null;return getPeerAdmin(client, 'org1');}).then((admin) => {logger.info('Successfully enrolled user \'admin\' for org1');the_user = admin;//org1对config_proto进行签名var signature = client.signChannelConfig(config_proto);logger.info('Successfully signed config update by org1');signatures.push(signature);client._userContext = null;return getPeerAdmin(client, 'org2');}).then((admin) => {logger.info('Successfully enrolled user \'admin\' for org2');the_user = admin;//org2对config_proto进行签名var signature = client.signChannelConfig(config_proto); logger.info('Successfully signed config update by org2');signatures.push(signature);client._userContext = null;return getOrdererAdmin(client);}).then((admin) => {logger.info('Successfully enrolled user \'admin\' for orderer');the_user = admin;//orderer对config_proto进行签名var signature = client.signChannelConfig(config_proto);logger.info('Successfully signed config update by org2');signatures.push(signature);let tx_id = client.newTransactionID();request = {config: config_proto,signatures : signatures,name : channelName,orderer : orderer,txId : tx_id};//更新通道return client.updateChannel(request);}).then((result) => {if(result.status && result.status === 'SUCCESS') {logger.info('Successfully updated the channel.');return sleep(5000);} else {logger.error('Failed to update the channel. ');Promise.reject('Failed to update the channel');}}).then((nothing) => {logger.info('Successfully waited to make sure new channel was updated.');

执行js脚本文件,更新通道。

此时org3则能成功加入mychannel通道。

总结

从流程来看,动态添加组织过程还是比较复杂的,涉及到文件的多次转换,多重签名等步骤。

更重要的是,更新交易需要多个组织进行签名,而在实际运用过程中,一个组织不可能获取所有组织的私钥,因此需要增量数据在各个组织间进行审核、流转,这个过程也是非常繁琐的。因此,未来需要开发在线审核流转工具,协助对数据签名。


by. xuyuzhuang
date. 2017-08-22


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
author-avatar
罗罗罗罗罗棋辉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有