zoukankan      html  css  js  c++  java
  • HyperLedger Fabric 多机部署(二)

    启动各个节点:

    ./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
  • 相关阅读:
    [原译]Lambda高手之路第一部分
    阿里巴巴5月5日综合算法题详解
    [原译]Lambda高手之路第三部分
    [原译]多线程揭秘
    Leadtools控件变组件问题的解决方法
    写派生控件时不要随便override!
    关于foreach使用限制的一点误解
    WinForm中使用GDI+实现滚动动画
    注意:在SQL SERVER中使用NChar、NVarchar和NText
    局域网中禁止客户端用户直接访问服务器共享文件夹的简单解决方案
  • 原文地址:https://www.cnblogs.com/gzhlt/p/9599653.html
Copyright © 2011-2022 走看看