Fabric-sdk-go操作Chaincode
1.Gossip in Hyperledger Fabric2.Ubuntu18.04安装Fabric
3.Fabric-sdk-go操作Chaincode
4.[比特币]比特币中的密码学原理5.一文读懂区块链(二)6.一文读懂区块链(一)7.chaincode中使用第三方库8.[比特币]比特币中的匿名性9.[比特币]比特币引发的思考10.[比特币]比特币中的分叉11.[比特币]比特币中的挖矿难度12.[比特币]比特币中的网络13.[比特币]比特币的实现14.[比特币]比特币中的共识协议15.[比特币]比特币中的数据结构16.Merkle Tree 简介17.Fabric 2.x 智能合约开发记录18.Fabric区块链浏览器(3)19.基于密码学的身份混淆系统 -- idmix20.Fabric区块链浏览器(2)21.Fabric区块链浏览器(1)22.Hyperledger Fabric系统链码介绍23.跟着文档学Fabric:获取通道配置24.从源码中解析fabric区块数据结构(一)25.Fabric升级示例26.Fabric网络升级(四)27.Fabric网络升级(三)28.Fabric网络升级(二)29.Fabric网络升级(一)30.Fabric网络升级(总)31.根据TxID获取上链数据32.PoW、PoS、DPoS和PBFT简介33.RPC连接btcd网络34.BTC交易流程35.MerkleTree in BTC36.BTC 地址因为工作的需要,最近了解了下如何通过sdk来操作Chaincode,本文是sdk使用时的一些操作总结。
在fabric网络启动过程中,一般分为“启动网络 -> 创建通道 -> 加入通道 -> 安装链码 -> 实例化链码 -> 调用链码”。本文以fabric-sdk-go项目中的end_to_end.go
为例,介绍如何通过fabric-sdk-go来使用链码。
创建sdk实例
使用sdk的第一步是创建sdk实例:
sdk, err := fabsdk.New(configOpt, sdkOpts...) if err != nil { t.Fatalf("Failed to create new SDK: %s", err) } defer sdk.Close()
创建通道并安装链码
在end_to_end.go
中,这一步是通过createChannelAndCC()
来实现的。
首先是使用提供的身份凭证来创建事务用于之后的操作:
clientContext := sdk.Context(fabsdk.WithUser(orgAdmin), fabsdk.WithOrg(ordererOrgName))
接着使用上一步创建的事务来创建一个资源管理客户端(resmgmt.Client):
resMgmtClient, err := resmgmt.New(clientContext)
接着createChannel()
创建通道。在创建通道时,需要使用该组织的管理员用户创建,主要用到GetSigningIdentity()
和SaveChannel()
方法:
func createChannel(t *testing.T, sdk *fabsdk.FabricSDK, resMgmtClient *resmgmt.Client) { mspClient, err := mspclient.New(sdk.Context(), mspclient.WithOrg(orgName)) if err != nil { t.Fatal(err) } adminIdentity, err := mspClient.GetSigningIdentity(orgAdmin) if err != nil { t.Fatal(err) } req := resmgmt.SaveChannelRequest{ChannelID: channelID, ChannelConfigPath: integration.GetChannelConfigTxPath(channelID + ".tx"), SigningIdentities: []msp.SigningIdentity{adminIdentity}} txID, err := resMgmtClient.SaveChannel(req, resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")) require.Nil(t, err, "error should be nil") require.NotEmpty(t, txID, "transaction ID should be populated") }
加入通道
通道创建成功后,需要将将组织添加到通道中,主要用到JoinChannel()
:
adminContext := sdk.Context(fabsdk.WithUser(orgAdmin), fabsdk.WithOrg(orgName)) // Org resource management client orgResMgmt, err := resmgmt.New(adminContext) ...... // Org peers join channel err = orgResMgmt.JoinChannel(channelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")) ......
创建链码
完成上述的操作,接下来就是链码相关的操作了。
与命令行下的链码操作不同,sdk安装链码时并不需要事先将链码程序放到背书节点,而是在调用InstallCCRequest()
时再将本地的链码打包安装到背书节点:
func createCC(t *testing.T, orgResMgmt *resmgmt.Client) { // Packing the example cc from local // argv[0]: cc path in local // argv[1]: GOPATH ccPkg, err := packager.NewCCPackage("github.com/example_cc", integration.GetDeployPath()) ...... // Install example cc to org peers installCCReq := resmgmt.InstallCCRequest{Name: ccID, Path: "github.com/example_cc", Version: "0", Package: ccPkg} _, err = orgResMgmt.InstallCC(installCCReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts)) ...... // Set up chaincode policy ccPolicy := cauthdsl.SignedByAnyMember([]string{"Org1MSP"}) // Org resource manager will instantiate 'example_cc' on channel resp, err := orgResMgmt.InstantiateCC( channelID, resmgmt.InstantiateCCRequest{Name: ccID, Path: "github.com/example_cc", Version: "0", Args: integration.ExampleCCInitArgs(), Policy: ccPolicy}, resmgmt.WithRetry(retry.DefaultResMgmtOpts), ) ...... }
链码调用
链码调用,这里推荐使用Execute()
:
func executeCC(t *testing.T, client *channel.Client) { _, err := client.Execute(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: integration.ExampleCCDefaultTxArgs()}, channel.WithRetry(retry.DefaultChannelOpts)) if err != nil { t.Fatalf("Failed to move funds: %s", err) } }
示例
这个例子是使用sdk操作fabric-samples
中的fabcar
链码,其中省略了创建和加入通道的操作。
执行go run main.go
后,输出结果如下:
合集:
区块链
分类:
Blockchain
, fabric
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-06-14 添砖加瓦:MySQL分布式部署