启动各个节点:

./orderer   order节点启动方式
./peer node start peer节点启动方式

Admin@org1.example.com

使用hyperledger fabric可以通过SDK,也可以使用peer命令。

这里直接演示peer命令的用法。

在fabric-deploy中创建目录Admin@org1.example.com,在其中存放该用户的所有资料。

mkdir Admin@org1.example.com

将用户证书复制到其中:

cp -rf certs/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/* Admin\@org1.example.com/

还需要将core.yaml复制到用户目录下:

cp peer0.org1.example.com/core.yaml  Admin\@org1.example.com/

为了方便使用,创建一个脚本Admin@org1.example.com/peer.sh

#!/bin/bash
PATH=`pwd`/../bin:$PATH export FABRIC_CFG_PATH=`pwd` export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_CERT_FILE=./tls/client.crt
export CORE_PEER_TLS_KEY_FILE=./tls/client.key export CORE_PEER_MSPCONFIGPATH=./msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=./tls/ca.crt
export CORE_PEER_ID=cli
export CORE_LOGGING_LEVEL=INFO peer $*

然后直接通过这个脚本访问peer0.org1.example.com:

$ ./peer.sh node status
status:STARTED
2018-04-29 14:32:03.517 CST [main] main -> INFO 001 Exiting.....
$ cd ..

可以看到peer0.org1.example.com:7051的状态是启动的。

为了减少演示过程中的重复操作,下面使用复制、替换的方式,准备另外两个用户的目录。

User1@org1.example.com

User1与Admin1使用相同的peer,因此只需要替换用户证书即可:

cp -rf  Admin\@org1.example.com/ User1\@org1.example.com/
rm -rf User1\@org1.example.com/msp
rm -rf User1\@org1.example.com/tls
cp -rf certs/peerOrganizations/org1.example.com/users/User1\@org1.example.com/* User1\@org1.example.com/

注意上面的过程,就是把msp和tls目录替换了。

执行peer.sh检验:

$ cd User1\@org1.example.com
$ ./peer.sh node status
status:STARTED
2018-04-29 14:37:48.251 CST [main] main -> INFO 001 Exiting.....
$ cd ..

Admin@org2.example.com

同样在Admin\@org1.example.com/的基础上修改,替换掉msp和tls目录:

cp -rf  Admin\@org1.example.com/ Admin\@org2.example.com/
rm -rf Admin\@org2.example.com/msp/
rm -rf Admin\@org2.example.com/tls/
cp -rf certs/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/* Admin\@org2.example.com/

对于Admin@org2.example.com另一个组织的用户,core.yaml需要替换成它自己组织(org2)的core.yaml:

cp peer0.org2.example.com/core.yaml Admin\@org2.example.com/

还需要将Admin\@org2.example.com/peer.sh中peer地址修改为org2的peer地址:

export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP 修改为: export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP

注意peer.sh中需要修改的地方有两个: org1->org2,Org1->Org2。

验证:

$ cd Admin\@org2.example.com
$ ./peer.sh node status
status:STARTED
2018-04-29 14:44:22.395 CST [main] main -> INFO 001 Exiting.....
$ cd ..

创建channel与peer的设置

准备channel文件

这里用命令行演示channel的创建与peer的设置。(也可以通过SDK,SDK将单独讨论)

需要再次回到fabric-deploy目录中,用configtxgen生成channel文件:

./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx mychannel.tx -channelID mychannel

channel名字为mychannel,生成的mychannel.tx备用。

还需要为每个组织的peer生成一个anchor文件,每个组织只需要一个:

./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

生成的Org1MSPanchors.tx和Org2MSPanchors.tx备用。

这里生成的三个文件的含义与内容,见超级账本HyperLedger Fabric中Channel配置的读取转换

下一步操作中要访问orderer.example.com,需要将验证orderer.example.com的根证书复制到用户目录中:

cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem  Admin\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem User1\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem Admin\@org2.example.com/

创建channel

在Admin@org1.exampl.com目录中执行下面的命令,:

cd  Admin\@org1.exampl.com
./peer.sh channel create -o orderer.example.com:7050 -c mychannel -f ../mychannel.tx --tls true --cafile tlsca.example.com-cert.pem

执行完成后,会生成一个mychannel.block文件:

$ ls
core.yaml msp mychannel.block peer.sh tls tlsca.example.com-cert.pem

将mychannel.block复制一份到Admin\@org2.example.com/中备用:

cp mychannel.block ../Admin\@org2.example.com/
cd ..

将peer加入channel

分别在Admin\@org1.example.com/Admin\@org2.example.com/执行下面的命令:

cd Admin\@org1.example.com/
./peer.sh channel join -b mychannel.block
cd ..

因为org1有两个peer,因此需要将peer.sh中peer修改为peer1.org1.example.com后,再添加一次:

./peer.sh channel join -b mychannel.block

在Admin\@org2.example.com/中执行一次:

cd Admin\@org2.example.com/
./peer.sh channel join -b mychannel.block
cd ..

可以用channel list查看peer所在channel

$ ./peer.sh channel list
2018-04-29 16:37:47.016 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychannel
2018-04-29 16:37:47.018 CST [main] main -> INFO 002 Exiting.....

最后需要每个组织指定一个anchor peer,anchor peer是组织用来接收orderer下发的区块的peer:

cd Admin\@org1.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org1MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem
cd .. cd Admin\@org2.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org2MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem
cd ..

安装合约(chaincode)

在hyperledger fabric中,合约被称为chaincode。

需要安装一个go语言的开发环境,安装方法这里就不介绍了。

这里将go的开发环境安装在fabric-deploy所在的机器上。

直接用go get获取一份合约代码:

go get github.com/lijiaocn/fabric-chaincode-example/demo

注意代码的查看地址是:https://github.com/lijiaocn/fabric-chaincode-example

Admin@org1.example.com/目录下,以Admin@org1.example.com的身份打包合约:

cd Admin\@org1.example.com/

执行下面命令进行合约打包与签署:

./peer.sh chaincode package demo-pack.out -n demo -v 0.0.1 -s -S -p github.com/lijiaocn/fabric-chaincode-example/demo
./peer.sh chaincode signpackage demo-pack.out signed-demo-pack.out

然后安装合约:

./peer.sh chaincode install ./signed-demo-pack.out

安装之后,可以用chaincode list查看peer上已经安装的合约。

$ ./peer.sh chaincode list   --installed
Get installed chaincodes on peer:
Name: demo, Version: 0.0.1, Path: github.com/lijiaocn/fabric-chaincode-example/demo, Id: 3d733bd28accf77b06b2bec065d8ce7315bd7c5441c51beea4650982f79eab46
2018-04-29 18:57:54.327 CST [main] main -> INFO 001 Exiting....

chaincode只能用Admin安装,并且需要在每个peer上都安装一次。

将peer0.org1.example.com切换为peer1.org1.example.com后(修改peer.sh中的地址),再次安装一次:

./peer.sh chaincode install ./signed-demo-pack.out  (不需要重新打包签署)
cd ..

将signed-demo-pack.out复制到Admin@org2.exmaple.com中安装一次

cp Admin\@org1.example.com/signed-demo-pack.out  Admin\@org2.example.com/
cd Admin\@org2.example.com/
./peer.sh chaincode install ./signed-demo-pack.out

合约初始化

合约安装之后,需要且只需要进行一次初始化,只能由签署合约的用户进行初始化:

cd Admin\@org1.example.com/
./peer.sh chaincode instantiate -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -v 0.0.1 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')"

第一进行合约初始化的时候的会比较慢,因为需要需要创建、启动容器。

合约调用

可以在任意一个peer上调用合约,例如以admin@org2.example.com的进行写操作:

cd Admin\@org2.example.com/
./peer.sh chaincode invoke -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -c '{"Args":["write","key1","key1valueisabc"]}'

如果是第一次在一个peer访问一个合约,这个peer需要先启动容器,响应会比较慢。进行写操作(invoke命令)时,需要指定orderer(-o orderer.example.com:7050)。

进行查询操作时,不需要指定orderer,例如:

cd User1\@org1.example.com/
./peer.sh chaincode query -C mychannel -n demo -c '{"Args":["query","key1"]}'

更新合约

将更改后的合约重新打包,使用一个新的版本号:

cd Admin\@org1.example.com/

执行下面命令进行合约打包与签署:

./peer.sh chaincode package demo-pack-2.out -n demo -v 0.0.2 -s -S -p github.com/lijiaocn/fabric-chaincode-example/demo
./peer.sh chaincode signpackage demo-pack-2.out signed-demo-pack-2.out

然后安装合约:

./peer.sh chaincode install ./signed-demo-pack-2.out

更新的合约不需要初始化,需要进行更新操作:

./peer.sh chaincode upgrade -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -v 0.0.2 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')"

新的合约也需要在每个peer上单独安装。

因此需要将peer0.org1.example.com切换为peer1.org1.example.com后,再次安装一次:

./peer.sh chaincode install ./signed-demo-pack-2.out  (不需要重新打包签署)

将signed-demo-pack.out复制到Admin@org2.exmaple.com中安装一次

cp Admin\@org1.example.com/signed-demo-pack-2.out  Admin\@org2.example.com/
cd Admin\@org2.example.com/
./peer.sh chaincode install ./signed-demo-pack-2.out

HyperLedger Fabric 多机部署(二)的更多相关文章

  1. HyperLedger Fabric 多机部署(一)

    本文参考:http://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2018/04/26/hyperledger-fabric-deploy.html  学习. 1.准备工 ...

  2. 基于docker的 Hyperledger Fabric 多机环境搭建(上)

    环境:ubuntu 16.04 Docker  17.04.0-ce go 1.7.4 consoul v0.8.0.4 ======================================= ...

  3. 基于docker的 Hyperledger Fabric 多机环境搭建(下)

    Docker环境部署见上一篇博客:http://www.cnblogs.com/cnblogs-wangzhipeng/p/6994541.html. 我们部署分布式容器服务后就要在上面部署Fabri ...

  4. Hyperledger Fabric——balance transfer(二)注册用户

    详细分析blance transfer示例的用户注册(register)与登录(enroll)功能. 源码分析 1.首先分析项目根目录的app.js文件中关于用户注册和登录的路由函数.注意这里的tok ...

  5. Fabric 1.0的多机部署

    Fabric1.0已经正式发布一段时间了,官方给出的单机部署的脚本也很完备,基本上傻瓜式的一键部署,直接运行官方的network_setup.sh up即可.但是在实际生产环境,我们不可能把所有的节点 ...

  6. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  7. Hyperledger Fabric基础知识

    文章目录 什么是Hyperledger Fabric? Hyperledger架构是怎么工作的? Hyperledger交易如何执行 总结 Hyperledger Fabric基础知识 本文我们会介绍 ...

  8. 联盟链 Hyperledger Fabric 应用场景

    一.说明 本文主要通过一个例子分享以 Hyperledger Fabric 为代表的联盟链应用场景. 关于 Fabric 的相关概念请先参考文章 <Hyperledger Fabric 核心概念 ...

  9. HyperLedger Fabric 1.4 多机多节点部署(10.3)

    多机多节点指在多台电脑上部署多个组织和节点,本案例部署一个排序(orderer)服务,两个组织(org1,org2)和四个节点(peer),每个组织包括两个节点,需要五台计算机,计算机配置如下: 多机 ...

随机推荐

  1. SAP 增强表MODSAP 和TFDIR

    2.第二代增强(基于函数模块的增强),用于SMOD和CMOD 维护 在SAP发布的版本中,使用Call customer-function 'xxx'调用函数模块的, 所以你可以通过在程序中搜索 cu ...

  2. angularJs-HelloWorld

    AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷.AngularJS通过使用我们称为标识符(directives)的结构,让浏览器能够识别新的语法. 1使用双大括号{{ ...

  3. EASYARM-IMX283 nfs启动内核和根文件系统

    EASYARM-IMX283(以下简称IMX283)默认采用从nand flash启动,但是在开发过程中因为要频繁的替换内核,我们更倾向于从nfs启动. 先看看IMX283中uboot中默认采用的启动 ...

  4. Word怎么在方框里打勾

    插入--->符号--->其他符号--->在“子集”中选择“数学运算符”.第三行就可以找到“勾”符号,选中后点击“插入”即可. 或插入-->符号-->其他符号-->在 ...

  5. ffmpeg去水印

    1.用potplayer打开有水印的视频文件,截图一张待用.2.用IrfanView打开保存的图片,调整到100%大小,按住鼠标左键框选水印位置,记下标题“Selection:”右边的4组数字.3.f ...

  6. css中字体大小在不同浏览器兼容性问题

    css中使用font-size设定字体大小,不同浏览器的字体height一样,但是width不同,比如在火狐和谷歌中,font-size:20px,字体的高度变为20px,但是谷歌的字体宽度比火狐长 ...

  7. 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些

    加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...

  8. 为什么修改头文件make不重新编译

    make是根据依赖文件的时间戳来决定要不要重新编译的.在: object: deplist # actions 中,可以把头文件加进deplist,这样修改头文件后,make就会重新编译了. 单纯地修 ...

  9. 运算符-----------instanceof

  10. [POI 2000] 公共串

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2946 [算法] 建立多串后缀树 对于后缀树上的每个点 , 判断该节点所代表的等价类是 ...