Циклическое правило ACL обнаружено, условие правила вызывает то же правило - PullRequest
0 голосов
/ 25 октября 2018

Я получаю сообщение об ошибке при добавлении новых данных в hyperledger.

Обновление работает нормально.

Вот мой код, где я сталкиваюсь с проблемой

if(isExist) {
                const oldProOwnVal =  await PropertyOwnersRegistry.get(isExist.ownershipId);

                owners.ownership_start_date = oldProOwnVal.ownership_start_date;
                owners.created_at = oldProOwnVal.created_at;
                owners.updated_at = updatedProperty.timestamp;
                const mergeOwner = Object.assign(oldProOwnVal, owners);
                await PropertyOwnersRegistry.update(mergeOwner);
            } else {
                newKey =  'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, function(c) {
                    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                    return v.toString(16);
                });
                const newOwnerRes = factory.newResource(NS, 'PropertyOwners', newKey);


                owners.ownership_start_date = updatedProperty.timestamp;
                owners.created_at = updatedProperty.timestamp;
                owners.updated_at = updatedProperty.timestamp;
                const newOwner = Object.assign(newOwnerRes, owners);
                await PropertyOwnersRegistry.add(newOwner);
            }

Проблемапроисходят только в строке

await PropertyOwnersRegistry.add(newOwner);

Не знаю, что здесь происходит.

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

У меня была похожая проблема, но для моего случая я обновлял два ресурса назад, и я не ждал, пока другой завершит работу.Вот что я имею в виду

  const prodRegistry = await getAssetRegistry('org.trade.com.Product');
  const chequeReg = await getAssetRegistry('org.trade.com.Cheque');
  chequeRegistry.update(cheque);
  await prodRegistry.updateAll(products);

Исправление состоит в том, чтобы дождаться, пока первый реестр завершит обновление ресурса, прежде чем обновлять другой.

await chequeReg.update(cheque);
await prodRegistry.updateAll(products);
0 голосов
/ 26 октября 2018

это может быть то, как вы настраиваете, перед вызовом API Composer - например, getAssetRegistry (активы) или getParticipantRegistry (участники) - или же это выходит за рамки add в части 2.Я не видел вашу модель или предыдущий код - поэтому дополняю соответствующим образом ниже:

это должно работать (не пробовал) - заметьте - у вас есть недетерминированный код, если вы тестируете с одобрением и т. Д .:

const NS = 'org.acme.example';
var factory = getFactory();

const  propRegistry = await  getAssetRegistry(NS+ '.PropertyOwners'');

if(isExist) {
    const oldProOwnVal =  await propRegistry.get(isExist.ownershipId);

    owners.ownership_start_date = oldProOwnVal.ownership_start_date;
    owners.created_at = oldProOwnVal.created_at;
    const mergeOwner = Object.assign(oldProOwnVal, owners);
   //etc

    await propRegistry.update(mergeOwner);
 } else {           
     newKey =  'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, function(c) {
                    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);  // this code is non-deterministic
                    return v.toString(16);
                });
     const newOwnerRes = factory.newResource(NS, 'PropertyOwners', newKey);
     owners.ownership_start_date = updatedProperty.timestamp;
     owners.created_at = updatedProperty.timestamp;
     owners.updated_at = updatedProperty.timestamp;

     const newOwner = Object.assign(newOwnerRes, owners);

     await propRegistry.add(newOwner);
 }
...