2017-06-26 2 views
0

Ich mache ein Geschäftsmodell mit Hyperledger Composer, wobei ich eine Bank als Teilnehmer und einen Kunden als Asset habe. Die Bank wird wie nachstehend definiert:Der Teilnehmer hat keinen Zugriff auf die Ressource

participant Bank identified by bankId { 
o String bankId 
o String name 
o String code 
} 

und der Kunde sieht wie folgt aus:

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 
} 

Ich möchte, dass ein Teilnehmer (Bank) nur diejenigen Kunden aktualisieren können, die zu ihr gehören, und ich möchte erstellen eine Transaktion, um dies zu tun. Also habe ich die folgende Transaktion:

transaction updateCustomer identified by transactionId { 
o String transactionId 
--> Customer customer 
o Customer newDetails 
} 

und definiert eine Regel in der .acl-Datei wie folgt:

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 
} 

Um dies zu testen, ich einen Teilnehmer erstellt (neben dem bereits vorhandenen admin) und erstellt ein Kunde, der mit diesem Teilnehmer verbunden ist. Ich habe dahinter eine Transaktionsprozessorfunktion, die einfach die Kunden-Asset-Registrierung aktualisiert. Aber wenn ich versuche, die updateCustomer-Transaktion auszuführen, erhalte ich eine Fehlermeldung, dass der Teilnehmer keinen CREATE-Zugriff auf die Ressource hat. Das Problem bleibt bestehen, auch wenn ich den Vorgang in CREATE in der .acl-Datei ändern. Ich denke, dass das Problem in der Bedingung Teil liegt, aber ich bin nicht in der Lage, es zu korrigieren.

Ich habe eine ähnliche Transaktion Kunde für die Erstellung wie folgt:

transaction createCustomer identified by transactionId { 
o String transactionId 
o Customer newCustomer 
} 

und die Regel ist wie folgt:

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 
} 

es eine einfache Transaktionsprozessor Funktion hinter dieser createCustomer Transaktion ist, dass fügt den neuen Kunden einfach in die Kunden-Asset-Registrierung ein. Das funktioniert ganz gut, aber die updateCustomer Transaktion funktioniert nicht. Jede Hilfe würde sehr geschätzt werden. Danke :)

Antwort

0

Ich nahm einen anderen Pfad und anstatt zu überprüfen, ob der Kunde zu dieser Bank in den Regeln gehört, habe ich das in der Transaktionsprozessor-Funktion überprüft. So ist meine Regel für Updatecustomer sieht wie folgt aus:

rule bankCanInvokeUpdateCustomer { 
description: "Allow a bank to invoke updateCustomer transaction" 
participant: "org.acme.sample.Bank" 
operation: CREATE 
resource: "org.acme.sample.updateCustomer" 
action: ALLOW 
} 

und ich überprüft die Bank wie folgt:

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'); 

Der obige Code den aktuellen Teilnehmer erhält entspricht dem getCurrentParticipant() Funktion verwenden und dann die Bank Bezeichner mit der Bank, dass der Kunde Konto hat. Wenn sie nicht die gleichen sind, dann wirft in einen Fehler

0

Mit dieser Regel erlauben Sie der Bank, eine Transaktion zu aktualisieren. Sie sollten versuchen, die Ressource Updatecustomer vom Kunden zu ersetzen, so die Bank das Asset aktualisieren können:

resource(r): "org.acme.sample.Customer" 

Auch Sie wahrscheinlich eine Regel sollte das Recht auf die Bank zu geben, eine Updatecustomer Transaktion zu erstellen:

rule bankCanCreateTransaction { 
    description: "..." 
    participant: "org.acme.sample.Bank" 
    operation: CREATE 
    resource: "org.acme.sample.updateCustomer" 
    action: ALLOW 
} 
+0

Was Sie gesagt hat eigentlich Sinn, aber die createCustomer Transaktion funktioniert gut (ich habe es gerade in der Frage aktualisiert). Wenn ich die Bedingung als Bedingung ändere: (wahr), dann aktualisiert es den Kunden.Also ich denke das Problem ist in der Art, wie ich die Bedingung schreibe. Kann ich von updateCustomer transaction auf den Kunden zugreifen, so wie ich es in der Regel mache? –

Verwandte Themen