Транзакция Hyperledger Разрешение участнику на основе какого-то 3-го ресурса - PullRequest
0 голосов
/ 10 сентября 2018

Я работал над некоторой логикой разрешений для Hyperledger, когда возникла необходимость в условии, когда мне нужно использовать 3 ресурса в условииmission.acl.

Вкратце о сценарии Предположим, что Ресурсная транзакция - это t, для которой необходимо предоставить Разрешение на чтение, Участник - это P, которому необходимо прочитать транзакцию t.

Теперь Транзакция t содержит имя идентификатора для Актива А. Поэтому я хочу сделать условие, например, если для актива A, где идентификатор (имя) равен имени транзакции T, сравнивается регистратор актива A (который будет содержать имя участника) с идентификатором участника P. И если сравнение прошло успешно, дайте разрешение на чтение ресурса (транзакция T) участнику P.

Например, фрагмент.

Asset ABC identified by name{
    o String name;
    --> Company registrar; (Company is type of participant)

}

Transaction CreateABC{
     o String name;
}

Таким образом, участник P типа company должен иметь разрешение на чтение транзакции CreateABC, если актив, содержащий createABC.name, имеет регистратор, равный P.getIdenitifer ();

Я прочитал, что мы можем создать отдельные функции в js-файле и вызывать это из license.acl, но я пока не могу выполнить этот сценарий.

1 Ответ

0 голосов
/ 10 сентября 2018
  1. Примером использования 3 ресурсов может быть что-то вроде (пример):

// во-первых, доступ для вызова самого ресурса транзакции

rule Transaction_access {
    description: "Can generate transaction"
    participant: "org.acme.account.AccountTrader"
    operation: CREATE
    resource: "org.acme.account.TransferAmount"
    action: ALLOW
}

// далее, (пример) правило динамического ACL, которое оценивает, между кем выполняется транзакция

rule BiTrade_betweenTraders_only {
    description: "Only Allow Updatee between Transferor/Transferee via named transaction"
    participant(p): "org.acme.account.AccountTrader"
    operation: ALL
    resource(v): "org.acme.account.BankAccount"
    transaction(tx): "org.acme.account.TransferAmount"
  condition: ( p.getIdentifier() === v.owner.getIdentifier()  && v.getIdentifier() === tx.targetAccount.getIdentifier() )
    action: ALLOW
}

ОБНОВЛЕНО пунктом 2:

  1. Примером предоставления доступа к ресурсу транзакции на основе владения активом участником (оба получены из объекта транзакции) может быть:
rule my_restricted_Transaction_access {
           description: "as per description above"
           participant(p): "org.acme.account.AccountTrader"
           operation: CREATE
           resource(v): "org.acme.account.TransferAmount"
           condition: ( p.getIdentifier() === v.account.owner.getIdentifier() )
           action: ALLOW
}

, где TransferAmount может быть определено как:

transaction TransferAmount {
   --> Account account   // asset
}

и account имеют поле --> owner, указывающее на AccountTrader (участник, в моем исходном примере - и т. Д. И т. Д.) - имейте в виду, что ваши ACL-списки должны позволять участнику иметь доступ к соответствующему активу и целевой ресурс владельца ресурса тоже.

очевидно, что это простой пример - но вы можете определить свою функцию (чтобы сделать эквивалентную проверку для вашей модели) в разделе condition. Если вы добавили JS-скрипт в свою BNA в /lib (и обновили бизнес-сеть на Fabric, чтобы она вступила в силу), вам просто нужно беспокоиться о том, соответствует ли имя вашей функции тому, что вы назвали (опять же, ссылки, которые я отправлено, вы должны предоставить четкий пример использования).

  1. Вызов функции как части вашего условия ACL прост - вы можете увидеть пример этого в этом тестовом файле github -> функция (JS) здесь https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.js#L23 и соответствующий (вызывающий) набор правил ACL здесь -> https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/accesscontrols.acl#L124

ОБНОВЛЕНО пункт 3:

например, в вашем файле permissions.acl правило вроде:

rule rule_func_condition {
    description: "Allow all participants access to all resources"
    participant(p): "org.acme.account.AccountTrader"
    operation: CREATE
    resource(a): "org.example.account.TransferAmount"
    condition: (testOwnership(a, p))
    action: ALLOW
}

в вашем файле functions.js (или в любом другом месте) в папке /lib (или, если хотите, вы можете использовать его в существующем файле logic.js):

/**
 * Test that the specified asset is owned by the specified participant.
 * @param {Resource} asset The asset.
 * @param {Resource} participant The participant.
 * @return {boolean} True if yes, false if no.
 */
function testOwnership(asset, participant) {
    return asset.owner.getIdentifier() === participant.getIdentifier();
}

где asset и participant объекты передаются в этот конкретный пример функции.

...