Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Fabric 2.x 智能合约开发记录

Fabric 2.x 智能合约开发记录

原创
作者头像
孟斯特
发布于 2023-11-04 00:41:20
发布于 2023-11-04 00:41:20
2970
举报
文章被收录于专栏:code人生code人生

表象:Return schema invalid. required items must be unique recovered

虽然 Fabric v2.2 已经发布了很久了,但之前因为项目历史问题,一直使用的都是 Fabric v1.4.8,所以智能合约也一直使用的都是 github.com/hyperledger/fabric/core/chaincode/shim 包。

在合约开发过程中,我一般都是使用下面的接口格式来定义合约的业务逻辑:

代码语言:go
AI代码解释
复制
func create(stub shim.ChaincodeStubInterface, payload string) ([]byte, error)

在开发 Fabric v2.2 的智能合约时, 使用 github.com/hyperledger/fabric-contract-api-go/contractapi 替换 github.com/hyperledger/fabric/core/chaincode/shim,接口格式如下:

代码语言:go
AI代码解释
复制
func create(ctx contractapi.TransactionContextInterface, payload string) ([]byte, error)

然而这样的接口在合约示例化的时候翻车了:

代码语言:shell
AI代码解释
复制
Error compiling schema for SmartContract [create]. Return schema invalid. required items must be unique [recovered]

翻阅 github.com/hyperledger/fabric-contract-api-go 时,在其使用教程发现一些限制:

  • 合同的函数只能接受以下类型的参数:
    • string
    • bool
    • int(包括 int8、int16、int32 和 int64)
    • uint(包括 uint8、uint16、uint32 和 uint64)
    • float32
    • float64
    • time.Time
    • 任何允许类型的数组/切片
    • 结构体(其公共字段全部属于允许类型或另一个结构体)
    • 指向结构体的指针
    • 具有键类型为 string 和值为任何允许类型的映射
    • interface{}(仅当直接传入时才允许,在通过事务调用时将接收一个 string 类型)
  • 合同的函数还可以接受事务上下文,前提是:
    • 它作为第一个参数传入
    • 二选一:
      • 它要么是类型为 *contractapi.TransactionContext 的对象,要么是在链码中定义的自定义事务上下文,用于合同的使用
      • 它是一个接口,用于合同的事务上下文类型符合该接口,例如 contractapi.TransactionContextInterface
  • 合同的函数只能返回零、一个或两个值:
    • 如果函数被定义为返回零值,那么对该合同函数的所有调用将返回成功响应
    • 如果函数被定义为返回一个值,那么该值可以是参数列表中列出的任何允许类型之一(除了 interface{}),或者是错误。
    • 如果函数被定义为返回两个值,那么第一个值可以是参数列表中列出的任何允许类型之一(除了 interface{}),第二个值必须是错误。

仔细阅读会发现 func create(ctx contractapi.TransactionContextInterface, payload string) ([]byte, error) 并没有违法上面的规则,但示例化的时候就是无法通过。

上面的报错信息也明确说了是返回值不对,那就改下接口的返回值:

代码语言:go
AI代码解释
复制
func create(ctx contractapi.TransactionContextInterface, payload string) (string, error)
func create(ctx contractapi.TransactionContextInterface, payload string) (*Company, error)
func create(ctx contractapi.TransactionContextInterface, payload string) (int, error)

修改后在进行实例化,这次不再报错了。

但是明明之前的也没有违反规则,为什么会报错呢?想不通为什么,所以准备给官方提个Issue,万一真是个bug呢?

结果就在issues里发现了这个Possible issues with byte[] as return type,一看日期Oct 20, 2021,快两年了也没官方的回应......

结论

最后搜了一圈也没找到原因,查看源码,感觉问题可能是出在 contractFunctionReturns,具体还得等研究完源码之后才能有答案

代码语言:go
AI代码解释
复制
type contractChaincodeContract struct {
	info                      metadata.InfoMetadata
	functions                 map[string]*internal.ContractFunction
	unknownTransaction        *internal.TransactionHandler
	beforeTransaction         *internal.TransactionHandler
	afterTransaction          *internal.TransactionHandler
	transactionContextHandler reflect.Type
}

// ContractChaincode a struct to meet the chaincode interface and provide routing of calls to contracts
type ContractChaincode struct {
	DefaultContract       string
	contracts             map[string]contractChaincodeContract
	metadata              metadata.ContractChaincodeMetadata
	Info                  metadata.InfoMetadata
	TransactionSerializer serializer.TransactionSerializer
}

// ContractFunction contains a description of a function so that it can be called by a chaincode
type ContractFunction struct {
	function reflect.Value
	callType CallType
	params   contractFunctionParams
	returns  contractFunctionReturns
}

type contractFunctionReturns struct {
	success reflect.Type
	error   bool
}

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
hyperledger fabric 开发第一个智能合约
一、编写智能合约代码HelloWorld.go,go语言实现,代码很简单,每个合约包含两个方法,Init、Invoke。
Tiny熊
2020/08/27
8730
hyperledger fabric 开发第一个智能合约
Hyperledger Fabric 2.x 自定义智能合约
为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制;智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑。
陶陶技术笔记
2022/02/25
1K0
Hyperledger Fabric 2.x 自定义智能合约
fabric区块链(五)—解析basic智能合约(java)
这段代码是一个基于Hyperledger Fabric框架的资产转移合约。让我逐行解释它的功能和结构。
酒楼
2023/05/29
6830
fabric区块链(五)—解析basic智能合约(java)
fabric区块链(三)—发布智能合约
您需要使用支持的编程语言(如Go、Java、JavaScript等)编写智能合约代码。您可以使用Hyperledger Fabric提供的示例智能合约作为参考,了解智能合约的结构和编写方式。示例智能合约可在Hyperledger Fabric的官方文档中找到。
酒楼
2023/05/30
9630
区块链平台的比较和选择:Ethereum、Hyperledger和Corda的优缺点和适用场景
随着区块链技术的发展,越来越多的区块链平台涌现出来,其中包括Ethereum、Hyperledger和Corda等。本文将对它们的优缺点进行比较,并探讨它们的适用场景,以帮助开发者和企业选择最适合自己需求的区块链平台。
Echo_Wish
2024/02/07
7310
Hyperledger Fabric 1.3正式版新特性
https://github.com/hyperledger/fabric/releases
Zeal
2020/11/11
7980
Hyperledger Fabric 1.3正式版新特性
fabric区块链(十一)—fabric中使用CouchDB
酒楼
2023/07/20
4760
深入解析fabric的peer命令(三)chaincodeInvokeOrQuery方法
fabric-protos-go是Hyperledger Fabric项目中的一个Go语言包,用于定义和生成与Fabric网络通信相关的协议缓冲区(Protocol Buffers)消息。
酒楼
2023/06/04
1970
用Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之编写链代码程序
在上一节中,您已经熟悉了如何构建、运行、部署和调用链代码,但尚未编写任何 Java 代码。
笔阁
2018/09/04
1.4K0
用Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之编写链代码程序
Hyperledger fabric Chaincode 开发详解
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/03/16
5.1K0
fabric区块链(七)—发布自己的智能合约(go)
├── CreateContract.go(应用程序的主要入口文件或资产转移的核心逻辑实现文件。)
酒楼
2023/05/29
8810
fabric区块链(七)—发布自己的智能合约(go)
BitXHub 跨链插件(Fabric)源码解读
之前提到过趣链科技的 BitXHub 跨链平台是业界较为完善的跨链开源解决方案,主要通过中继链、网关和插件机制对跨链流程中的功能、安全性和灵活性等进行了优化。
pseudoyu
2023/04/11
5780
BitXHub 跨链插件(Fabric)源码解读
fabric区块链(六)—解析basic智能合约(go)
├── assetTransfer.go(应用程序的主要入口文件或资产转移的核心逻辑实现文件。)
酒楼
2023/05/29
6350
fabric区块链(六)—解析basic智能合约(go)
HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法
深蓝前几篇博客讲了Fabric的环境搭建,在环境搭建好后,我们就可以进行Fabric的开发工作了。Fabric的开发主要分成2部分,ChainCode链上代码开发和基于SDK的Application开发。我们这里先讲ChainCode的开发。Fabric的链上代码支持Java或者Go语言进行开发,因为Fabric本身是Go开发的,所以深蓝建议还是用Go进行ChainCode的开发。
深蓝studyzy
2022/06/16
5040
Hyperledger Fabric 系统架构详解
因为毕业 Case Study 的项目主要是基于Ethereum公链,也没有面向企业的应用场景,所以之前对Hyperledger Fabric的了解大多只是停留在它的权限管理机制、通道、灵活的智能合约编写等几个特色的概念,对它的架构、各个节点的角色、运行机制等都是一知半解。最近在上 HKU 的<FITE3011 Distributed Ledger and Blockchain>课程,教授对Hyperledger Fabric的工作原理、网络搭建及链码相关的知识做了很详细的讲解,受益匪浅,通过本文来梳理一下,如有错漏,欢迎交流指正。
pseudoyu
2023/04/11
2.8K1
Hyperledger Fabric 系统架构详解
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
程序那些事
2020/07/08
1.4K0
Hyperledger Fabric 2.x 动态更新智能合约
在上一篇文章中分享了智能合约的安装与使用,如果业务有变更代码需要修改怎么办呢?本文分享如何对已安装的合约进行版本更新。
陶陶技术笔记
2022/02/25
4630
Hyperledger Fabric 2.x 动态更新智能合约
快速带你上手Hyperledger Fabric环境搭建+开发测试
本文采用virtualbox+vagrant方式搭建Hyperledger Fabric环境,采用VSCode远程开发模式开发调试链码和客户端程序。
jasonruan
2020/08/12
4.5K0
Fabric基础架构原理(4):链码 | 赠书活动
智能合约能够部署和运行在区块链环境中,由一段代码来描述相关的业务逻辑。部署后的智能合约在区块链中无法修改,智能合约的执行完全由代码决定,不受人为因素的干扰。一般来说,参与方通过智能合约规定各自权利和义务、触发合约的条件以及结果,一旦该智能合约在区块链环境中运行就可以得出客观、准确的结果。
Henry Zhang
2019/04/12
5650
Fabric基础架构原理(4):链码 | 赠书活动
fabric区块链(五)—解析basic智能合约(java)
这段代码是一个基于Hyperledger Fabric框架的资产转移合约。让我逐行解释它的功能和结构。
酒楼
2023/05/30
8690
fabric区块链(五)—解析basic智能合约(java)
推荐阅读
相关推荐
hyperledger fabric 开发第一个智能合约
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档