我正在使用hyperledger作曲家制作商业模式,其中我将银行作为参与者,将客户作为资产。银行的定义如下:
participant Bank identified by bankId {
o String bankId
o String name
o String code
}
客户看起来像这样:
asset Customer identified by aadhaarId {
o String aadhaarId
o String panId
o String firstName
o String lastName
o String contactNo
o String residence
o String accountNumber
o AccountType accountType
o String creationDate
--> Bank bank
}
我希望参与者(银行)只能更新属于它的客户,并且我想创建一个事务来执行此操作。所以我创建了以下事务:
transaction updateCustomer identified by transactionId {
o String transactionId
--> Customer customer
o Customer newDetails
}
并在.acl文件中定义了一条规则,如下所示:
rule bankCanUpdateItsCutomersViaTransaction {
description: "Allow a participant to update it's own resources"
participant(p): "org.acme.sample.Bank"
operation: UPDATE
resource(r): "org.acme.sample.updateCustomer"
condition: (p.getIdentifier() == r.customer.bank.getIdentifier())
action: ALLOW
}
为了测试这个,我创建了一个参与者(除了已经提供的管理员)并创建了一个与该参与者链接的客户。我有一个交易处理器功能,它只是更新客户资产注册表。 但是当我尝试执行updateCustomer事务时,我收到一条错误消息,指出参与者没有对资源的CREATE访问权限。即使我在.acl文件中将操作更改为CREATE,问题仍然存在。我认为问题在于条件部分,但我无法纠正它。
我有一个类似的事务来创建Customer,如下所示:
transaction createCustomer identified by transactionId {
o String transactionId
o Customer newCustomer
}
,其规则如下:
rule bankCanCreateItsCutomersViaTransaction {
description: "Allow a participant to create it's own resources"
participant(p): "org.acme.sample.Bank"
operation: CREATE
resource(r): "org.acme.sample.createCustomer"
condition: (p.getIdentifier() == r.newCustomer.bank.getIdentifier())
action: ALLOW
}
此createCustomer事务后面有一个简单的事务处理器函数,它只是在客户资产注册表中添加newCustomer。这工作完全正常但updateCustomer事务不起作用。 任何帮助将非常感激。谢谢:))
答案 0 :(得分:1)
根据此规则,您允许银行更新交易。您应该尝试按客户替换ressource updateCustomer,以便银行可以更新资产:
resource(r): "org.acme.sample.Customer"
此外,您应该添加一条规则,授权银行创建 updateCustomer 交易:
rule bankCanCreateTransaction {
description: "..."
participant: "org.acme.sample.Bank"
operation: CREATE
resource: "org.acme.sample.updateCustomer"
action: ALLOW
}
答案 1 :(得分:0)
我采取了一些其他路径,而不是在规则中检查客户是否属于该银行,我在交易处理器功能中检查了该路径。所以我对updateCustomer的规则如下所示:
rule bankCanInvokeUpdateCustomer {
description: "Allow a bank to invoke updateCustomer transaction"
participant: "org.acme.sample.Bank"
operation: CREATE
resource: "org.acme.sample.updateCustomer"
action: ALLOW
}
我按照以下方式检查了银行:
var currentParticipant = getCurrentParticipant();
var currentBank = currentParticipant["$identifier"];
var actualBank = tx.customer.bank.bankId;
if( actualBank != currentBank)
throw new Error('You can not update someone else\'s customer');
上面的代码通过使用getCurrentParticipant()函数获取当前参与者,然后将银行标识符与客户帐户所在的银行匹配。如果它们不相同,则会抛出错误