Ошибка: Объект с идентификатором «Участник: 01» в коллекции с идентификатором «$ sysregistries» не существует - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь построить бизнес-модель в Hyperledger Composer. У меня есть 2 участника: продавец и покупатель, а также один актив - доставка. У меня есть 2 транзакции: создать доставку и получить доставку. createDelivery создает актив, а receiveDelivery изменяет статус доставки.

У клиента есть поле Инвентаризация, и моя цель состоит в том, чтобы при прохождении транзакции receiveDelivery поле Инвентаризация в активе клиента обновлялось по количеству поставки.

Я получаю сообщение об ошибке, когда пытаюсь вызвать функцию verifyDelivery, и ошибка выглядит следующим образом: Обратите внимание, что 01 - это идентификатор клиента.

Вот мой файл модели:

namespace org.example

participant customer identified by CompanyID {

  o String CompanyID
  o String Name
  o Integer Inventory
}

participant vendor identified by CompanyID {

  o String CompanyID
  o String Name
}

asset Delivery identified by DeliveryID {

  o String DeliveryID
  o String Material
  o Integer Quantity
  o DeliveryStatus Status
  --> vendor vendor
  --> customer customer

}

 enum DeliveryStatus {

 o Created
 o Received

}

transaction createDelivery { 

  o String DeliveryID
  o String Material
  o Integer Quantity
  --> vendor vendor
  --> customer customer
}

transaction receiveDelivery { 
  --> Delivery Delivery
}

Ниже приведен файл скрипта:

'use strict';

/**
 * Create Delivery.
 * @param {org.example.createDelivery} createDelivery 
 * @transaction
 */

 async function createDelivery(createDelivery) { // eslint-disable-line no-unused-vars
    const factory = getFactory();
    const NS = 'org.example';

    var delivery = factory.newResource(NS, 'Delivery', createDelivery.DeliveryID);

    delivery.customer = factory.newRelationship(NS, 'customer', createDelivery.customer.getIdentifier());
    delivery.vendor = factory.newRelationship(NS, 'vendor', createDelivery.vendor.getIdentifier());

    delivery.Material = createDelivery.Material;
    delivery.Quantity = createDelivery.Quantity;
    delivery.Status = "Created";

    //save the asset
    const assetRegistry = await getAssetRegistry(delivery.getFullyQualifiedType());
    await assetRegistry.add(delivery);

 }

  /**
 * Receive Delivery.
 * @param {org.example.receiveDelivery} receiveDelivery 
 * @transaction
 */

 async function receiveDelivery(receiveDelivery) { // eslint-disable-line no-unused-vars
    const factory = getFactory();
    const NS = 'org.example';

    var delivery = receiveDelivery.Delivery
    var quantity = delivery.Quantity
    const customer = await getParticipantRegistry(delivery.customer.getIdentifier());

    customer.Inventory += quantity;
    await customer.update(customer)

    delivery.Status = 'Received'

 }

ACL по умолчанию:

rule NetworkAdminUser {
    description: "Grant business network administrators full access to user resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "**"
    action: ALLOW
}

rule NetworkAdminSystem {
    description: "Grant business network administrators full access to system resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "org.hyperledger.composer.system.**"
    action: ALLOW
}

rule GrantSysAccess {
     description: "Grant access to all Participants to target system registries"
     participant: "org.hyperledger.composer.system.Participant"
     operation: ALL
     resource: "org.hyperledger.composer.system.**"
     action: ALLOW
   }

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

1 Ответ

0 голосов
/ 07 января 2019

Произошло несколько ошибок в вашей транзакции receive, но приведенный ниже код должен работать.

Некоторые заметки:

  1. Вам нужно получить реестр (актив или участника) по его пространству имен, прежде чем пытаться обновить его
  2. Реестр клиентов, после чего вам нужно получить конкретного клиента, прежде чем пытаться обновить.
  3. Для актива доставки вы уже передали его в качестве параметра, поэтому вам не нужно получать этот конкретный актив
  4. Вы использовали строчную букву «c» для своего класса клиента и «v» для класса поставщика, а затем использовали букву «D» в верхнем регистре для доставки, что немного сбивает с толку.

Пример кода

 /**
 * Receive Delivery.
 * @param {org.example.receiveDelivery} receiveDelivery 
 * @transaction
 */

 async function receiveDelivery(receiveDelivery) { // eslint-disable-line no-unused-vars
 //   const factory = getFactory();
 const NS = 'org.example';

 var delivery = receiveDelivery.Delivery;
 var quantity = delivery.Quantity;

 //Get The Customer Participant Registry, get the Specific Customer, then update  
 const customerRegistry = await getParticipantRegistry(NS+'.customer');
 var customer = await customerRegistry.get( delivery.customer.getIdentifier() );
 customer.Inventory += quantity;
 await customerRegistry.update(customer);

 //Get the Delivery Asset registry, then Update   
 const deliveryRegistry = await getAssetRegistry(NS+'.Delivery');
 delivery.Status = 'Received';
 await deliveryRegistry.update(delivery);
...