Hyperledger Fabric:如何保持链代码调用应用程序和已部署链代码同步?有任何ABI等效功能吗?

问题描述

在Hyperledger架构中没有以太坊/法定人数中存在 ABI (应用程序二进制接口)的概念。

在Quorum中,在编译智能合约(链码)时会生成一个 ABI 文件,客户端应用程序会进一步使用该文件作为已部署智能合约功能定义的参考。

例如:如果有一个名为 getAsset(assetId: string 函数,该函数将返回一个 Asset 对象,此完整信息将在 ABI 文件中定义。

因此,简而言之, ABI 用于已部署智能合约的界面,并且还与客户端应用程序一起作为已部署智能合约的功能定义,它消除了应用程序与已部署合约不同步并使用错误参数调用智能合约功能的可能性。

现在,我想知道如何在 Hyperledger Fabric 解决此问题。

我正在经历 asset-transfer-basic (JavaScript应用程序),在那里可以看到名为 CreateAsset 方法,该方法接受 (assetId,颜色,所有者,大小,评估值) ,但它们已明确传递。

我的意思是,没有其他方法可以知道 CreateAsset 接受什么参数,而无需手动查看智能合约中该功能的实现。

有什么办法解决这个问题?

解决方法

Chaincode(至少使用Contract API实现的)具有org.hyperledger.fabric:GetMetadata事务处理函数,该函数返回描述所有可用事务处理函数及其参数的JSON有效负载。

使用客户端SDK,您可以通过创建一个客户端Contract对象(链代码名称和org.hyperledger.fabric作为合同标识符)来调用它。然后使用该Contract对象调用GetMetaData事务。在JavaScript中,如下所示:

contract = network.getContract('mychaincode','org.hyperledger.fabric');
result = await contract.evaluateTransaction('GetMetadata');
metadata = JSON.parse(result.toString('utf8'));

我不确定该事务功能的存在情况如何记录下来,但是此处记录了元数据的结构:

https://hyperledger.github.io/fabric-chaincode-node/release-2.2/api/tutorial-annotated-contract-metadata.html

,
sqlite3.OperationalError: no such column: name1