interface - Hyperledger Fabric:如何使调用链码的应用程序和部署的链码保持同步?任何 ABI 等效功能?
问题描述
Hyperledger 结构中没有ABI(应用程序二进制接口)的概念,因为它存在于 Ethereum/Quorum 中。
Quorum 中的ABI文件是在编译智能合约(链码)时生成的,客户端应用程序进一步将其用作对已部署智能合约的函数定义的引用。
例如:如果有一个名为getAsset(assetId: string )的函数返回一个Asset对象,那么这个完整的信息将在ABI文件中定义。
所以,简而言之,ABI服务于已部署智能合约的接口的目的,并且还保留在客户端应用程序中,作为已部署智能合约的功能定义的参考,这省略了应用程序被与已部署的合约不同步,并使用不正确的参数调用智能合约的函数。
现在,我想知道如何在Hyperledger Fabric中解决这个问题。
我正在通过asset-transfer-basic(javascript应用程序),在那里我可以看到一个名为CreateAsset的方法,它接受(assetId,color,owner,size,appraisedValue)但它们被明确传递。
我的意思是,如果不手动查看智能合约中函数的实现,就没有其他方法可以知道CreateAsset接受哪些参数。
有没有办法解决这个问题?
解决方案
链码(至少是使用合约 API 实现的)有一个org.hyperledger.fabric:GetMetadata
事务函数,它返回一个 JSON 有效负载,描述所有可用的事务函数及其参数。
org.hyperledger.fabric
使用客户端 SDK,您可以通过使用链代码名称和合约标识符创建客户端合约对象来调用它。然后GetMetaData
使用该 Contract 对象调用事务。在 JavaScript 中,是这样的:
contract = network.getContract('mychaincode', 'org.hyperledger.fabric');
result = await contract.evaluateTransaction('GetMetadata');
metadata = JSON.parse(result.toString('utf8'));
我不确定这个事务函数的存在记录得如何,但元数据的结构记录在这里: