Hyperledger Fabric中的多个互连对象类型

问题描述 投票:1回答:1

我正在基于Hyperledger Fabric构建一个系统,该系统需要存储与以下内容有关的信息:

  1. 资金清单
  2. 投资这些基金的合伙人(投资者)名单,和
  3. 订阅列表,代表基金与合作伙伴之间的关系

每个对象都是一种单独的对象,具有自己的字段集,需要独立存储和查询。基金对象和合作伙伴对象都应包括其相关订阅的数组。

但是,我发现很难找到具有这种结构的链码示例。所有对象都是高度互连的(对一个对象的数据进行修改直接意味着对其他对象的修改),因此我希望将它们存储在单个链码上,但是对它们使用的操作却大不相同。是否打算以这种方式使用名称空间?

我尝试将它们作为单独的合约存储在同一链码上(使用this问题的最高答案):

papercontract.js

class FundContext extends Context {
    constructor() {
        super();
        this.subList = new SubList(this);
        this.fundList = new FundList(this);
        this.partnerList = new PartnerList(this);
    }
}

class PartnerContext extends Context...
class SubContext extends Context...


class FundContract extends Contract {
    constructor() {
        super('fund');
    }
    async createFund(ctx, id, name, amount_committed, amount_raised) {
        ...
    }
}
...
class SubContract extends Contract...
class PartnerContract extends Contract...
...
module.exports.FundContract = FundContract;
module.exports.PartnerContract = PartnerContract;
module.exports.SubContract = SubContract;

index.js

const SubContract = require('./lib/papercontract').SubContract;
const FundContract = require('./lib/papercontract').FundContract;
const PartnerContract = require('./lib/papercontract').PartnerContract;
module.exports.SubContract = SubContract;
module.exports.FundContract = FundContract;
module.exports.PartnerContract = PartnerContract;
module.exports.contracts = [ SubContract, FundContract, PartnerContract ];

issue.js

const contract = await network.getContract('papercontract','FundContract');
await contract.submitTransaction('createFund', data._id, data.name, data.amount_committed, data.amount_raised);

但是返回错误:

Error: Contract name is not known: FundContract

我可以通过将对象类型(以字符串形式)存储为“ class”字段,并通过搜索id和class来查找对象,来解决这个问题,这很有效,但是感觉非常混乱,无法在一个数组中存储一堆完全不同的对象类型。我怀疑这是打算使用的方式。

我不确定为什么会出现上述错误,或者那是否甚至是处理核心问题的最佳方法。任何帮助将不胜感激。

hyperledger-fabric hyperledger
1个回答
0
投票
我建议您在不同的文件中实现不同的智能合约,这有助于组织代码:

const SubContract = require('./lib/SubContract.js'); const FundContract = require('./lib/FundContract.js'); const PartnerContract = require('./lib/PartnerContract.js'); module.exports.contracts = [SubContract,FundContract,PartnerContract];

关于组织问题,如果您对要在合同中操作的对象(状态和状态列表)实施抽象,如图here所示,则可以将不同的对象保存在不同的数组中。以这种方式,查询您的世界状态将更加简单。 

清楚吗?

© www.soinside.com 2019 - 2024. All rights reserved.