Несколько взаимосвязанных типов объектов в Hyperledger Fabric - PullRequest
2 голосов
/ 23 января 2020

Я строю систему на основе Hyperledger Fabri c, в которой необходимо хранить информацию, касающуюся:

  1. списка фондов
  2. списка партнеров (инвесторов) инвестирование в эти фонды и
  3. список подписок, представляющих отношения между фондом и партнером

Каждый из них представляет собой отдельный тип объекта со своим собственным набором поля, и должны храниться и запрашиваться независимо. И объект фонда, и объект партнера должны включать массив связанных подписок.

Однако мне очень трудно найти примеры цепных кодов с такой структурой. Все объекты тесно взаимосвязаны (модификация данных одного объекта напрямую подразумевает модификацию других), поэтому я бы хотел, чтобы они были сохранены в одном цепочечном коде, но операции с ними очень разные. Пространства имен предназначены для использования таким образом?

Я пытался хранить их как отдельные контракты в одном и том же коде цепи (используя верхний ответ из этого вопроса):

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

Я могу обойти это, сохранив тип объекта (в строковой форме) как поле "класс", и найдя объекты путем поиска как идентификатора, так и класса, который ... работает, но очень кажется грязным, чтобы хранить кучу совершенно разных типов объектов в одном массиве. Я сомневаюсь, что это способ, которым это предназначено для использования.

Я не уверен, почему я получаю вышеупомянутую ошибку, или если это было бы даже лучшим способом решения основной проблемы, чтобы начинается с. Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 26 января 2020

Я советую вам реализовывать разные умные контракты в разных файлах, это помогает организовать ваш код:

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

Относительно вашей организационной проблемы, если вы реализуете абстракции объектов, которыми вы манипулируете в ваших контрактах ( список состояний и состояний), как показано здесь , вы можете сохранять разные объекты в разных массивах. Таким образом, запрос состояния вашего мира будет более простым.

Это ясно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...