Hyperledger Fabric 链码(3) 生命周期和API

2024-03-28 09:32

本文主要是介绍Hyperledger Fabric 链码(3) 生命周期和API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Chaincode的5个生命周期命令

  • 链码打包
  • 链码安装
    eg.peer chaincode install ccpack.out
  • 链码实例化
    eg. peer.sh chaincode instantiate -n mycc -v 0 -c ‘{“Args”:[“init”,“a”,“100”,“b”,“200”]}’ -C mychannel
  • 链码升级(当链码的代码发生改变时,就需要升级链码)
  • 链码签名

2. peer命令提供了8个子命令管理链码

  • Install
  • instantiate
  • invoke
  • list
  • package
  • query
  • signpackage
  • upgrade

3.链码API(主要是shim包提供,分为5类)

3.1 参数解析API:用来获取参数的账本数据状态

  • GetStringArgs() []string
    返回调用链码时指定提供的参数列表(以字符串数组形式返回)

  • GetFunctionAndParameters() (function string, params []string)
    返回调用链码时在交易提案中指定提供的被调用的函数名称及函数的参数列表(以字符串数组形式返回)

  • GetArgsSlice() ([]byte, error)
    返回提交交易提案时提供的参数列表(以字节串数组形式返回)

  • GetArgs() [][]byte
    返回调用链码时在交易提案中指定提供的被调用的函数名称及函数的参数列表(以字符串数组形式返回)

3.2 操作API:对账本数据查询、更新等

  • GetState(key string) ([]byte, error)
    查询账本,返回指定键对应的值

  • PutState(key string, value []byte) error
    尝试添加/更新账本中的一对键值。 这一对键值会被添加到写集合中,等待 Committer 进一步确认,验证通过后才会真正写入到账本

  • DelState(key string) error
    尝试删除账本中的一对键值。 同样,对该对键值删除会添加到写集合中,等待 Committer 进一步确认,验证通过后才会真正写入到账本

  • GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error)
    查询指定范围的键值,startKey 和 endkey 分别指定开始(包括)和终止(不包括),当为空时默认是最大范围。 返回结果是一个迭代器结构,可以按照字典序迭代每个键值对,最后需要调用 Close() 方法关闭

  • GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)
    返回指定键的所有历史值。该方法的使用需要节点配置中打开历史数据库特性(ledger.history.enableHistoryDatabase=true)

  • CreateCompositeKey(objectType string, attributes []string) (string, error)
    给定一组属性(attributes),将这些属性组合起来构造返回一个复合键。eg.CreateComositeKey(“name-age”,[]string{“Alice”, “12”});

  • SplitCompositeKey(compositeKey string) (string, []string, error)
    将指定的复合键进行分割,拆分成构造复合键时所用的属性

  • GetStateByPartialCompositeKey(objectType string, keys []string)
    根据局部的复合键(前缀)返回所有匹配的键值,即与账本中的键进行前缀匹配。返回结果是一个迭代器结构,可以按照字典序迭代每个键值对,最后需要调用 Close() 方法关闭
    (StateQueryIteratorInterface, error)

  • GetQueryResult(query string) (StateQueryIteratorInterface, error)
    对(支持富查询功能的)状态数据库进行富查询,返回结果是一个迭代器结构,目前只支持 CouchDB。注意该方法不会被 Committer 重新执行进行验证,所以不能用于更新账本状态的交易中

注意: 通过 put 写入的数据状态不能立刻 get 到,因为 put 只是链码执行的模拟交易(防止重复提交攻击),并不会真正将状态保存到账本中,必须经过 Orderer 达成共识之后,将数据状态保存在区块中,然后保存在各 peer 节点的账本中。

3.3 交易信息获取API:获取提交的交易信息

  • GetTxID() string
    返回交易提案中指定的交易 ID。一般情况下,交易 ID 是客户端提交提案时由 Nonce 随机串和签名者身份信息哈希产生的数字摘要

  • GetChannelID() string
    返回交易提案中指定的 Channel ID

  • GetTxTimestamp() (*timestamp.Timestamp, error)
    返回交易被创建时的客户端打上的的时间戳。这个时间戳是直接从交易 ChannnelHeader 中提取的,所以在所以背书节点处看到的值都相同

  • GetBinding() ([]byte, error)
    返回交易的 binding 信息。交易的 binding 信息是将交提案的 nonse、Creator、epoch 等信息组合起来哈希得到数字摘要

  • GetSignedProposal() (*pb.SignedProposal, error)
    返回该 stub 的 SignedProposal 结构,包括了跟交易提案相关的所有数据

  • GetCreator() ([]byte, error)
    返回该交易提交者的身份信息(用户证书)。 从 SignedProposal 中的 SignatureHeader.Creator 提取

  • GetTransient() (map[string][]byte, error)
    返回交易中带有的一些临时信息。从 ChaincodeProposalPayload.transient 提取,可以存放与应用相关的保密信息,该信息不会被写入到账本

3.4 事件处理API:与事件处理相关

  • GetPrivateData(collection, key string) ([]byte, error)
    根据指定的 key,从指定的私有数据集中查询对应的私有数据

  • PutPrivateData(collection string, key string, value []byte) error
    将指定的 key 与 value 保存到私有数据集中

  • DelPrivateData(collection, key string) error
    根据指定的 key 从私有数据集中删除相应的数据

  • GetPrivateDataByRange(collection, startKey, endKey string) (StateQueryIteratorInterface, error)
    根据指定的开始与结束 key 查询范围(不包含结束key)内的私有数据

  • GetPrivateDataByPartialCompositeKey(collection, objectType string, keys []string) (StateQueryIteratorInterface, error)
    根据给定的部分组合键的集合,查询给定的私有状态

  • GetPrivateDataQueryResult(collection, query string) (StateQueryIteratorInterface, error)
    根据指定的查询字符串执行富查询 (只支持支持富查询的 CouchDB)

3.5 对私有数据操作的API:专门对私有数据操作

  • SetEvent(name string, payload []byte) error
    设定当这个交易在 Committer 处被认证通过,写入到区块时发送的事件(event),一般由 Client 监听

  • InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response
    调用另外一个链码的 Invoke 方法。 如果被调用链码在同一个通道内,则添加其读写集合信息到调用交易;否则执行调用但不影响读写集合信息// 如果 channel 为空,则默认为当前通道。目前仅限读操作,同时不会生成新的交易

这篇关于Hyperledger Fabric 链码(3) 生命周期和API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855212

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现