У меня проблема с определением правила контроля доступа в hyperledger composer. Допустим, у меня есть ресурс (актив) asset1
и asset2
и участник p1
в пространстве имен org.example
. Пример файла модели (.cto):
namespace org.example
participant p1 identified by p1Id
{
o String p1Id
o String name
}
asset asset1 identified by asset1Id
{
o String asset1Id
o String name
}
asset asset2 identified by asset2Id
{
o String asset2Id
o String name
--> p1
--> asset1 asset1
}
Как видите, asset2
ссылки p1
и asset1
. Тем не менее, в моей модели есть соотношение 1: 1 между asset1
и asset2
. Но я не хочу ссылаться на второй актив в определении модели первого актива (--> asset2 asset2
), потому что к моменту создания экземпляра asset1
(выполнение "$class":"org.hyperledger.composer.system.AddAsset"
) экземпляр asset2
может уже не существовать.
Моя цель - предоставить экземпляр p1
READ
доступа к asset1
, только если этот экземпляр объявлен в asset2
с соответствующим asset1
.
Для решения я думал сделать ссылку в asset1
(--> asset2 asset2 optional
) необязательной и избежать встроенной функции создания ресурса ("org.hyperledger.composer.system.AddAsset"
). Таким образом, реализуем пользовательскую транзакцию (AddAssetAsset2
) в файле logic.js
, которая обновляет необязательную ссылку asset2 в соответствующем экземпляре asset1. Но я хочу использовать встроенную функцию, которую можно легко вызвать в composer-playground
.
Итак, я сейчас спрашиваю, существует ли какое-либо решение объявить этот специальный READ
доступ для p1
экземпляра в файле .acl
?
Эта ситуация немного отличается от этого вопроса переполнения стека .
В частности, возможно ли использовать другие ресурсы в условии правила? Как например:
rule P1ReadAsset1Rule {
description: "P1 can read the asset1 if p1 is defined in the asset2"
participant(p): "org.example.p1"
operation: READ
resource(r): "org.example.asset1"
condition: (org.example.asset2.p1.getIdentifier() == p.getIdentifier() && org.example.asset2.asset1.getIdentifier() == r.getIdentifier())
action: ALLOW
}
Может ли быть такое решение или я должен сделать это по-другому? Например. использование служебной функции javascript с запросом, объявленным в .qry
?
Спасибо, ребята, что помогли мне:)