首页 > 其他分享 >Fabric 2.x 智能合约开发记录

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

时间:2023-09-10 14:45:14浏览次数:53  
标签:Fabric create 智能 func error contractapi 合约 payload string

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

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

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

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,接口格式如下:

func create(ctx contractapi.TransactionContextInterface, payload string) ([]byte, error)

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

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) 并没有违法上面的规则,但示例化的时候就是无法通过。

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

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,具体还得等研究完源码之后才能有答案

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
}

孟斯特

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


标签:Fabric,create,智能,func,error,contractapi,合约,payload,string
From: https://www.cnblogs.com/lianshuiwuyi/p/17691195.html

相关文章

  • 百度“AI智障”到AI智能体验之旅
    目录前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻二、文心一言1.设计测试用例2.随意发问3.手机端约会神器三、体验总结:四、千帆大模型前言最近收到了文心一言3.5大模型的内测资格,正巧之前也体验过它的前身"百度PLATO",这下子真的让我觉得不是......
  • 小程序网络性能优化:合并请求与智能缓存提升用户体验
    在小程序开发中,网络性能优化是提升用户体验的重要一环。通过合并请求和合理的缓存策略,我们可以有效减少网络请求次数和提升页面加载速度。本文将探讨在小程序中如何优化网络性能,包括合并请求和智能缓存,同时提供代码演示。合并请求合并多个请求可以减少网络延迟,提高加载速度。小程......
  • 基于物联网技术的开源工业固体废物一体化智能监控平台
    ​ 一、项目背景    “十四五”时期,我国将开启全面建设社会主义现代化国家新征程,围绕推动高质量发展主题,全面提高资源利用效率的任务更加迫切。受资源禀赋、能源结构、发展阶段等因素影响,未来我国大宗固废仍面临产生强度高、利用不充分、综合利用产品附加值低的严峻形势......
  • 【触想智能】工业触摸显示器使用需要注意的事项分享
    工业触摸显示器顾名思义就是带有触摸功能的工业显示器。工业触摸显示器主要是应用在工业环境上的显示器,他们对环境的要求比较高,一般需要具备宽温宽压、防尘防水、抗电磁干扰等功能。目前工业触摸显示器已经被广泛应用在智能制造生产线、安防、城市交通、商业、金融、医疗、教......
  • 如何让网站智能客服准确理解用户问题并高效回答?
    ChatGPT自从年初爆火之后,就迅速地入侵了我们生活的方方面面。但是在很多时候ChatGPT 都不能完全遵循我们的命令。所以我们在使用的时候必须明确告诉智能机器客服您希望它做什么,并且当它出现问题时,要明确和它说明。所以今天就来聊一聊如何让网站智能客服准确理解用户问题并高效回答......
  • 浅析TSINGSEE视频AI智能分析网关车辆检测/车牌识别算法及应用
    在数字化时代,随着大众对出行要求的提升,汽车数量也成与日俱增,为城市与交通管理带来了许多困扰。旭帆科技为给交通管理和车辆安全提供高效的解决方案,特此研发了AI智能车辆检测与车牌识别算法。旭帆科技TSINGSEE青犀视频AI车辆检测、车牌识别算法融合了ORC识别、云计算等多种技术,可将......
  • TSINGSEE青犀视频AI智能分析网关森林防火智慧监管平台方案
    一、方案背景森林是地球上最重要的生态系统之一,对环境、气候、水循环和空气质量具有重要影响。森林火灾会造成巨大的经济损失,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。保护森林资源和减少火灾刻不......
  • 带您了解智能视频监控系统EasyCVR的工作原理和广泛应用场景。
    EasyCVR国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、智能AI分析以及平台级......
  • 智能视频与分析技术构建可视化消防风险预警视频监控平台EasyCVR
    TSINGSEE青犀视频提出了智慧消防解决方案,以多维感知、数据共享和业务联动为理念,旨在改善消防安全管理。通过整合消防与安防资源,利用视频监控和智能分析技术实时监测火灾风险,并提供火灾报警和现场视频资料供消防人员快速响应和处置。该方案还支持数据可视化,以直观方式展示火灾风险状......
  • 监控汇聚平台EasyCVR可智能分析抽烟/打电话行为
    随着人工智能技术的不断发展,其已经广泛应用于视频监控领域。我们最近推出的基于AI智能视频云存储/安防监控视频AI智能分析平台,具备多项新功能。该平台内置了多种AI算法,可以实时对视频中的人脸、人体、物体等进行检测、跟踪和抓拍。这个平台支持口罩佩戴检测,可以识别出口罩是否被佩......