如何检查当前链代码执行上下文是否通过调用或查询调用

How to check if current chaincode execution context is called via invoke or query

场景

Hyperledger Fabric 2.4 版
Golang

我正在开发一个用于汽车登记记录管理的链代码。

我的链代码 getCarRegistrationDetails(...) 中有一个函数可以根据输入数据和 returns 结果搜索汽车。 除了汽车登记记录外,我还为每个用户维护信用值(使用客户身份)。当用户请求查询汽车登记详情时,从用户余额中扣除一定的信用额度,并将汽车登记记录返回给用户。

问题

因为我正在更新 getCarRegistrationDetails(...) 中的状态,所以应该调用它。但问题是,当我使用查询调用相同的函数时,它 returns 所需的详细信息但不从用户的余额中扣除。

如何在链码中处理这个问题。更具体地说,有没有办法阻止 getCarRegistrationDetails(...) 上的查询请求,只允许调用?

不幸的是,链码无法做出该决定。从根本上说,客户端使用调用与查询(在网关 api 术语中,这将是提交与评估)之间的根本区别在于,提案响应(和相关签名)是随后发送给排序者(调用)还是仅发送有效负载返回给调用者(查询),但是调用和查询都会向对等点发送相同的背书请求,然后由链码执行。

您处理此问题的方式是在您的客户端应用程序中。您的客户端应用程序知道哪些方法应该是 invoked/submitted 哪些应该是 queried/evaluated