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

Hyperledger Fabric: How to keep chaincode-calling application and deployed chaincode in sync ? Any ABI equivalent feature?

Hyperledger 结构中没有 ABI(应用程序二进制接口)的概念,因为它存在于 Ethereum/Quorum。

在编译智能合约(链码)时会在Quorum中生成一个ABI文件,客户端应用程序进一步将其用作对函数定义的引用部署智能合约。

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

所以,简而言之,ABI 服务于 已部署智能合约 接口的目的,并且也与客户端应用程序作为已部署智能合约的函数定义的参考,它排除了应用程序与已部署合约不同步并调用智能合约函数的可能性不正确的参数。

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

我正在浏览 asset-transfer-basic(javascript 应用程序),在那里我可以看到一个名为 CreateAsset[=42= 的方法] 接受 (assetId, color, owner, size, appraisedValue) 但它们被显式传递。

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

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

链码(至少是使用合约 API 实现的链码)有一个 org.hyperledger.fabric:GetMetadata 交易功能,returns 一个 JSON 有效负载描述所有可用的交易功能及其参数.

使用客户端 SDK,您可以通过使用链代码名称和 org.hyperledger.fabric 作为合约标识符创建 client-side 合约对象来调用它。然后使用该 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

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