Fabric链码调用实践

随手记录下Fabric的链码部署调用,

仓库地址:

fabric-samples/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go at main · hyperledger/fabric-samples (github.com)​github.com/hyperledger/fabric-samples/blob/main/asset-transfer-basic/chaincode-go/chaincode/smartcontract.goicon-default.png?t=N7T8https://link.zhihu.com/?target=https%3A//github.com/hyperledger/fabric-samples/blob/main/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go

参考将智能合约部署到通道 — hyperledger-fabricdocs master 文档

1.启动网络并创建通道

./network.sh up 
./network.sh creatChannel

2.使用peer创建链码包,命令参考peer lifecycle chaincode — hyperledger-fabricdocs master 文档

确保链码包已经被打包(go mod vendor),并检查可以使用peer cli(peer version)

peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0

此时目录下会生成一个basic.tar.gz文件

3.安装链码

因为测试网络中有两个组织,所以此后的所有操作都需要指定不同组织的管理员操作,即通过设置环境变量保证当前有足够的权限和身份操作命令。

例如设置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

再安装,此操作将在Org1上安装链码

peer lifecycle chaincode install basic.tar.gz

Org2同理,操作如图

4.批准链码定义

首先查询此时的包ID,类似合约地址

peer lifecycle chaincode queryinstalled

将获取的包ID设置为环境变量,根据实际包ID替换

export CC_PACKAGE_ID=basic_1.0:3cfcf67978d6b3f7c5e0375660c995b21db19c4330946079afc3925ad7306881

此时的组织环境变量仍是Org2,所以直接运行此命令

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,再批准一次,操作如图

此时可以检查该链码的批准定义,显示两个组织

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

5.提交链码定义到通道

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"

可以通过此部署命令部署,本质是对以上五步的封装操作,通过脚本封装了以上手动命令

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

例如,此图是运行过程的部分截图,绿色部分它分别完成了链码的打包,链码在两个组织的安装,和组织1批准

6.调用链码

本质就是使用peer chaincode,写就是invoke,读就是query

(1)使用peer chaincode invoke命令调用链码中的InitLedger函数,此函数将向账本写入预先定义的资产列表,返回状态码200,invoke成功

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":[]}'

(2) 使用peer chaincode query命令调用链码通过GetAllAssets函数查询账本中所有资产的信息,命令如下:

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

(3)使用peer chaincode invoke命令调用链码的TransferAsset函数将资产asset6转移给Johney,命令如下:

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","Johney"]}'

(4)执行peer chaincode query命令调用链码的ReadAsset函数查看资产asset6的详细信息,命令如下:

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

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Hyperledger Fabric 是一种基于区块链技术的分布式账本框架,它可以用于构建企业级的区块链应用。链码是 Hyperledger Fabric 中的智能合约,它是在账本上执行的一种程序。链码可以用来验证交易、存储和检索数据、执行业务逻辑等。 Hyperledger Fabric 支持多种编程语言编写链码,如 Go、JavaScript 和 Node.js。 ### 回答2: Hyperledger Fabric链码是一种用于构建和执行智能合约的代码。它是Hyperledger Fabric区块链平台的核心组件之一,用于管理和处理区块链网络中的业务逻辑和数据操作。 Hyperledger Fabric链码可以以多种编程语言编写,如Go、Java和JavaScript等。链码运行在容器环境中,并在区块链网络中的对等节点上执行链码可以被实例化为链码容器,通过交易来调用执行链码提供了一种机制,使得合约的逻辑可以被安全地部署和执行链码可以访问和操作区块链网络中的数据和状态,并定义了与网络中其他链码和节点的交互方式。链码可以处理交易请求,对状态进行查询,并生成一个或多个交易响应。 链码可以被安装、实例化和升级。具体来说,链码的安装是将链码背书器安装到对等节点上的过程。链码实例化是将链码在网络中实例化为可供调用的合约的过程。链码升级是更新链码的代码和逻辑的过程。 链码是在Hyperledger Fabric区块链网络中执行智能合约的基础。它提供了一个灵活的机制,使得开发者能够根据具体的业务需求来编写和执行智能合约。通过链码,业务逻辑可以被封装成可执行的代码,并与区块链网络进行交互,从而实现安全、透明和可追溯的业务操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃哧哧·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值