Fabric 搭建测试网络并部署智能合约

这篇具有很好参考价值的文章主要介绍了Fabric 搭建测试网络并部署智能合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.搭建网络: 详见博客
2.对Test Network的创建和关闭
cd ${HOME}/fabric-samples/test-network
创建网络:
./network.sh up

关闭网络:
./network.sh down

创建通道:
./network.sh createChannel  -c xxx :创建名为xxx的通道
3.Starting a chaincode on the channel:

智能合约(Smart Contract): 包含管理区块链账本上assets的逻辑。在Fabric上智能合约就是链码的形式存在. 当网络运行后,链码会被部署到网络中节点和通道上.

应用(Application): 由区块链系统的成员执行,通过应用来触发智能合约,然后实现链上的操作,比如对账本的增删改查.

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

Explanation:将asset-transfer(basic)链码安装在 peer0.org1.example.com andpeer0.org2.example.com 两个节点上

Note: -ccn:链码命名 -ccp:链码路径 -ccl:如果第一次部署链码,需要安装链码的依赖即语言类型,此处选择的是Go .下面将会解释如何手动部署自己写的智能合约(链码),即5. 在测试网络上部署自己的智能合约其实是在解释./network.sh 脚本中deployCC函数执行的步骤
因此如果在测试环境中部署自己的智能合约,只要指定-ccn:链码名;-ccp:链码路径 -ccl:链码编写语言即可用./network.sh deployCC来完成“链码打包、链码安装、链码批准、链码提交以及触发链码这些步骤”自动部署

4. Interacting with the network:

当测试网络开启后,我们可以用peer CLI和你的测试网络交互.即用peer CLI充当客户端
peer CLI作用: 通过peer CLI可以调用已经部署的智能合约、更新通道或安装与部署新的智能合约
requirement:

  1. 先设置环境变量PATH
export PATH=${HOME}/fabric-samples/bin:$PATH
  1. 设置变量FABRIC_CFG_PATH
export FABRIC_CFG_PATH=${HOME}/fabric-samples/config
  1. 先进入test-network文件夹中,然后按照下面的命令行设置环境变量(目的: operate the peer CLI as the Org1 and Org2 admin user)
# Environment variables for Org1

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

# Environment variables for Org2

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

CORE_PEER_TLS_ROOTCERT_FILECORE_PEER_MSPCONFIGPATH这两个环境变量都是指向/test-network/organizations文件夹的Org1的加密材料

Peer CLI的使用:
1.调用初始化账本的链码

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 basic --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":"InitLedger","Args":[]}'

Fabric 搭建测试网络并部署智能合约
2.实现的是查询链上的所有资产信息

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

Explanation:-C:通道名 -n:链码名 -c:用json格式写参数
3. 调用转移asset6资产的链码

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 basic --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":"TransferAsset","Args":["asset6","Christopher"]}'

Explanation:本测试网络中背书策略是需要both peer0.org1.example.com and peer0.org2.example.com背书,因此需要用 两个**–peerAddresses分别指定Org1和Org2的背书节点的IP地址和端口号**

-C:通道名 -n:链码名 --peerAddress:指明背书节点的IP地址和端口号, --tlsRootCertFiles:由于本测试网络中开启了TLS(Transport Layer Security)安全传输层协议 因此需要用–tlsRootCertFiles标签为每个peer指定TLS的证书位置. -c :为链码参数的json格式

5. 在测试网络上部署自己的智能合约

require: 创建网络并创建通道

Optional: 日志输出(Logsout)功能:This step is not required but is extremely useful for troubleshooting chaincode.作用:检测智能合约的日志,管理员可以看到多个节点容器集成的日志输出(by logspout tool.).
安装步骤:

cd fabric-samples/test-network
# 把安装Logsout tool的脚本复制到当前目录下
cp ../commercial-paper/organization/digibank/configuration/cli/monitordocker.sh .

运行步骤:

./monitordocker.sh fabric_test

接下来就进入正题

5.1.Package the smart contract: 将链码安装到各个节点上前需要对我们的合约进行打包

智能合约可以用Go、JavaScript和TypeScript三种语言写,下面介绍Go的智能合约部署

  1. 写完智能合约(Go 的Fabric智能合约API文档后,对Go采用Go module包管理器(go mod init),然后在module目录下执行命名(go mod vendor),下载依赖至module的目录下其中Module和Vendor部分我写在Go Module一篇就够

  2. 需要用Peer CLI与测试网络进行交互所以

cd ${HOME}/fabric-samples/test-network
#然后设置环境变量,
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
  1. 利用Peer CLI创建Go package
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0

–path路径下的智能合约源码打包成名为basic.tar.gz的包,指定语言(–lang) golang,并将这个智能合约记为(–label)basic_1.0

5.2. Install the chaincode package

After we package the asset-transfer (basic) smart contract, we can install the chaincode on our peers.

本测试网络中有两个组织Org1和Org2,因此需要分别对这两个组织部署链码,现在以Org1为例

  1. 设置环境变量
# 设置环境变量,使得以Org1 admin user的身份操作Peer CLI
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

# 设置环境变量,使得以Org2 admin user的身份操作Peer CLI
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
  1. 在Org1上安装链码
peer lifecycle chaincode install basic.tar.gz

basic.tar.gz是已经打包后的链码名

对于Org2的安装重复以上两个步骤.

5.3. Approve a chaincode definition

定义了链码治理的重要参数,比如名字、版本以及链码的背书策略.链码在一个通道中使用之前要求足够的通道成员批准链码. Because we have only two organizations on the channel, and a majority of 2 is 2, we need approve a chaincode definition of asset-transfer (basic) as Org1 and Org2.

具体过程:

  1. 查询链码的包ID(Package ID):由链码label和二进制标识组成

    peer lifecycle chaincode queryinstalled
    

Fabric 搭建测试网络并部署智能合约

  1. 把package id存放在环境变量中(注意:下面的命令中package ID需要自行修改)
 export CC_PACKAGE_ID=basic_1.0:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3
  1. 批准链码
  peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --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"

注意的是我们需要对Org1和Org2分别批准链码,切换至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 basic --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.4. Committing the chaincode definition to the channel

当链码被网络中的绝大多数组织认可批准后,只需要其中一个组织提交链码定义至通道上即可.(one organization can commit the chaincode definition to the channel.)

如何查看组织对某链码的批准情况呢? 利用peer lifecycle chaincode checkcommitreadiness

peer lifecycle chaincode checkcommitreadiness  --channelID mychannel --name basic --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

Fabric 搭建测试网络并部署智能合约

上面的都是True,因此可以Committing the chaincode defination to the channel

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --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"

以上这笔Transaction使用了--peerAddressed flag即发向peer0.org1.example.com from Org1和peer0.org2.example.comfrom Org2.

Fabric 搭建测试网络并部署智能合约

查询链码提交情况?

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

Fabric 搭建测试网络并部署智能合约

提交成功!

5.Invoking the chaincode

The asset-transfer (basic) chaincode is now ready to be invoked by client applications

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 basic --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":"InitLedger","Args":[]}'
6. Upgrading a smart contract
7.Clean Up

如果完成了网络的相关操作,需要停止logspout tool和关闭网络文章来源地址https://www.toymoban.com/news/detail-438573.html

docker stop logsout
docker rm logsout

# 进入test-network文件夹然后关闭网络
cd ${HOME}/fabric-samples/test-network
./network.sh down

到了这里,关于Fabric 搭建测试网络并部署智能合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • fabric智能合约开发步骤

    在fabric中,智能合约使用Go语言编写。以下是一些编写智能合约的步骤: 例如: mychaincode 。在终端中输入以下命令: shim 包提供了与fabric交互的API, pb 包提供了用于定义chaincode的protobuf消息。 Init 方法在chaincode实例化时调用, Invoke 方法在chaincode被调用时调用。在上面的例子

    2024年02月15日
    浏览(35)
  • fabric智能合约

    fabric架构分为两个部分, 应用层 和 区块链底层 。 对于 应用层 来说,fabric提供了基于GRPC协议的API来于区块链进行通讯,并且在API的基础上封装了支持go语言、Java语言、node.js等SDK,方便客户端的调用。由于区块链是分布式的账本,并且交易需要进行共识之后才能够进行上链

    2023年04月23日
    浏览(67)
  • Fabric智能合约——Chaincode(一)简介

    Fabric智能合约整体介绍,首先看一下 Fabric交易流程  在这张图中,5、6步是public数据的步骤,7、8、9是private数据的步骤,除了这一部分外,其他步骤均相同。         Fabric中智能合约称为链码(Chaincode),使用计算机语言描述合约条款、交易的条件、交易的业务逻辑等,

    2024年02月07日
    浏览(35)
  • truffle 创建测试合约并部署到测试网络

    1、npm 安装truffle 2、创建truffle项目 3、初始化truffle目录,会生成如下几个目录 contracts 存放.sol合约文件 migrations 部署脚本目录 test 测试文件目录 truffle-config.js truffle配置文件 4、编译合约 编译合约以后会生成build目录,存放编译好生成的合约的json文件 5、修改合约 如果要部署

    2024年02月08日
    浏览(25)
  • ganache私链部署智能合约+本地网络Dapp

    参考自(3条消息) 区块链投票应用:使用solidity+truffle+metamsk开发Dapp应用_一袋芋头的博客-CSDN博客下载了项目示例webpack之后   我们需要将里面的其他合约都删除,也可以直接删除这两个文件夹里的内容  然后就可以开始正片了(当然,你得先前就安装好环境) 开启ganache私链,

    2024年02月08日
    浏览(30)
  • Hyperledger Fabric 使用 CouchDB 和复杂智能合约开发

    在上个实验中,我们已经实现了简单智能合约实现及客户端开发,但该实验中智能合约只有基础的增删改查功能,且其中的数据管理功能与传统 MySQL 比相差甚远。本文将在前面实验的基础上,将 Hyperledger Fabric 的默认数据库支持 LevelDB 改为 CouchDB 模式,以实现更复杂的数据检

    2023年04月15日
    浏览(37)
  • Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方法(尽管这确实是重难点),而没有考虑具体的应用开发。本文将在前面实验的基础上

    2024年01月20日
    浏览(43)
  • Web3 处理智能合约部署到本地区块链,并在本地进行测试

    上文 Web3 在Truffle项目中编写出自己的第一个solidity智能合约我们演示了 在Truffle环境下写一个智能合约并编译的功能 编译出的文件夹中的这个JSON就非常重要了 我们就可以通过 它这个ABI链接到需要的智能合约程序上去 但这也仅仅是编译完了 我们的智能合约还没有部署到我们

    2024年02月13日
    浏览(31)
  • 如果Fabric的智能合约函数陷入死循环会怎么样

    大家好,我是 powervip !今天和大家一起探讨一下:如果Fabric的智能合约函数陷入死循环会怎么样 先看一段合约函数代码: func (t *SimpleChaincode) Test(stub shim.ChaincodeStubInterface, args []string) pb.Response { // 选择商品价格在1元到100元之间的商品名称和数量 s := \\\"{\\\"fields\\\": [\\\"GoodsName\\\",

    2023年04月21日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包