Hyperledger Fabric教程--部署Fabric智能合约

Posted 星川皆无恙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hyperledger Fabric教程--部署Fabric智能合约相关的知识,希望对你有一定的参考价值。

为通道部署智能合约Hyperledger Fabric教程–部署Fabric智能合约

在HyperledgerFabric中,智能合约部署在称为链码的包中。想要验证交易或查询分类账的组织需要在其peer节点上安装链码。在加入通道的peer节点上安装链码后,通道成员可以将链码部署到通道,并使用链码中的智能合约在通道分类账上创建或更新资产。

链码使用一个称为Fabric chaincode lifecycle的过程部署到通道。Fabric链码生命周期允许多个组织在链码可用之前就其操作方式达成一致。本教程学习如何使用peer lifecycle chaincode命令将链码部署到Fabric测试网络的通道上。一旦理解了这些命令,就可以使用本教程中的步骤将自己的链码部署到测试网络,或将链码部署到生产网络。

(1)启动网络
~/github.com/hyperledger/fabric-samples/test-network目录下执行命令:

./network.sh up createChannel

(2)打包智能合约(javascript)

我们需要对链码进行打包,然后才能将其安装到我们的peer节点上。如果要安装用Go、Java或JavaScript编写的智能合约,则步骤不同。
在打包链码之前,我们需要安装链码依赖项,另打开一个终端,进入:

~/github.com/hyperledger/fabric-samples/chaincode/fabcar/javascript/

执行:

source /etc/profile  #这一步骤将node命令放入环境变量中

依赖项列在package.json文件中,可以找到下面显示的依赖项部分:

package.json文件将Fabric Contract类导入。你可以打开lib/fabcar,在文本编辑器中查看fabcar.js文件。

要安装智能合约依赖项,请从fabcar/javascript目录运行以下命令:

npm install

如果命令成功执行,JavaScript包将安装在node_modules文件夹中。

有了依赖项,就可以创建chaincode包了,回到另一个终端,执行:

export PATH=$PWD/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/   #这个环境变量指定配置文件的位置
peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/javascript/ --lang node --label fabcar_1

-lang标志用于指定链码语言,-path标志提供智能合约代码的位置。–label标志用于指定链码标签,该标签将在安装链码后标识链码。

(3)安装链码包
链码需要安装在每个将背书交易的peer上。因为我们将设置背书策略,要求Org1和Org2都进行背书,所以我们需要在这两个组织运营的peer上安装链码。

先在Org1 peer上安装链码。设置以下环境变量将作为Org1 admin用户操作peer CLI,CORE_PEER_ADDRESS将设置为指向peer0.org1.example.com。

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

发出“peer lifecycle chaincode install”命令,在peer上安装链码:

peer lifecycle chaincode install fabcar.tar.gz

在Org2 peer上安装链码:

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

发出“peer lifecycle chaincode install”命令,在peer上安装链码

peer lifecycle chaincode install fabcar.tar.gz


(4)批准链码定义
安装chaincode包后,需要组织批准chaincode定义。该定义包括链码的参数,如名称、版本和链码背书策略。

默认情况下,大多数通道成员批准的链码才能在通道上使用。因为我们在通道上只有两个组织,因此Org1和Org2都需要批准Fabcar的链码定义。
查询已安装的链码:

peer lifecycle chaincode queryinstalled

Package ID是链码标签和链码二进制文件哈希的组合。每个peer将生成相同的Package ID,不同机器的Package ID不同。
把Package ID放进环境变量里:

export CC_PACKAGE_ID=fabcar_1:2d275418cc7415743770ab319d81af4e0055feaa7b5a92334d53ee14df2220b0

注意:这里的CC_PACKAGE_ID,以你实际ID为准

批准链码定义:

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

–package id标志将包标识符包含在链码定义中。–sequence参数是一个整数,用于跟踪定义或更新链码的次数。因为链码是第一次部署到通道,所以序列号是1,升级Fabcar链码时,序列号将增加到2。

转变为Org1用户:

export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=$PWD/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=$PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

(5)将链码定义提交到通道

在部署链码之前需要批准链码的通道成员集受策略控制。默认情况下,此策略要求大多数通道成员需要先批准链码,然后才能在通道上使用链码。因为我们在频道上只有两个组织,而 2 个组织中的大多数是 2 个,所以我们需要批准 Fabcar 的链码定义为 Org1 和 Org2。

使用“peer lifecycle chaincode checkcommitreadiness”命令来检查通道成员是否批准了相同的链码定义。

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json

使用“对等生命周期链码提交”命令将链码定义提交到通道。

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles $PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles $PWD/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

使用“peer lifecycle chaincode querycommitted”命令确认链码定义已提交到通道。

peer lifecycle chaincode querycommitted --channelID mychannel --name fabmakeup--cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

(6)调用链码

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $PWD/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabmakeup --peerAddresses localhost:7051 --tlsRootCertFiles $PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles $PWD/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '"function":"queryMakeup","Args":[]'
peer chaincode query -C mychannel -n fabcar -c '"Args":["queryAllCars"]'

这次的Hyperledger Fabric教程–部署Fabric智能合约分享就到此结束了,后面也会继续更新。
欢迎各位小伙伴讨论,如有问题请在评论区评论或发私聊消息,欢迎各位的留言!

实战:安装部署hyperledger fabric - 1

环境

ubuntu 16.04 4.4.0-104-generic

Docker version 17.03.0-ce, build 60ccb22

docker-compose version 1.14.0, build c7bdf9e

git version 2.7.4

fabric-peer:x86_64-1.0.5

安装部署

1、从 DockerHub上拉取镜像 

docker pull hyperledger/fabric-peer:x86_64-1.0.5

docker pull hyperledger/fabric-membersrvc:x86_64-0.6.1-preview

docker pull hyperledger/fabric-baseimage:x86_64-0.4.2

docker pull hyperledger/fabric-tools:x86_64-1.0.5

docker pull hyperledger/fabric-orderer:x86_64-1.0.5

技术分享图片

2、使用Git下载Docker-compose模板

git clone https://github.com/yeasy/docker-compose-files

3、启动Fabric

修改base.yaml 注释掉#image: yeasy/hyperledger-fabric-orderer:1.0.5。不修改,执行下面命令时会自动pull 并使用yeasy/hyperledger-fabric-orderer:1.0.5

技术分享图片

这里选择建立一个4 peer (belonging to 2 organizations) fabric network.

cd docker-compose-files/hyperledger_fabric/v1.0.5

docker-compose -f docker-compose-2orgs-4peers-solo.yaml up -d

4、至此搭建完毕,检查结果

docker-compose -f docker-compose-2orgs-4peers-solo.yaml ps

docker ps

技术分享图片

未完续待:测试fabric ......


以上是关于Hyperledger Fabric教程--部署Fabric智能合约的主要内容,如果未能解决你的问题,请参考以下文章

基于hyperledger fabric 联盟链 + vue cli的项目搭建完整教程

万字解析——区块链hyperledger fabric2.2部署实战教程

万字解析——区块链hyperledger fabric2.2部署实战教程

Hyperledger Fabric 1.1安装部署-chaincode测试

Hyperledger Fabric 1.1安装部署-Fabric Samples

hyperledger fabric 2.3.3 搭建教程