Я пытаюсь создать пример приложения BlockChain, состоящего из покупателя, продавца, поставщика, грузоотправителя и т. Д. Как покупатель я могу успешно создать транзакцию покупки, а также обновить транзакцию от созданной до покупки.Теперь, когда заказ находится в состоянии «Покупка», Продавец может изменить заказ, чтобы поручить Провайдеру выполнить заказ полностью.По ряду причин Продавец НЕ может это сделать.Я прикрепляю модель, ACL и трассировку стека исключений, чтобы кто-то посмотрел на это и сказал, что то, что я делаю, правильно или неправильно.Если вы видите что-то не так, пожалуйста, посоветуйте правильный подход к этому.TIA.
Permissions.acl
rule NetworkAdminUser {
description: "Grant business network administrators full access to user resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "**"
action: ALLOW
}
rule NetworkAdminSystem {
description: "Grant business network administrators full access to system resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
/**
* end of V0.14 additions
*/
/**
*
**/
rule BuyerACLCreate {
description: "Enable Buyers to execute all actions on an Order"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.CreateOrder"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACLBuy {
description: "Enable a Buyer to update an Order from Create to Buy"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.Buy"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACLCancel {
description: "Enable a Buyer to CANCEL an Order"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE, DELETE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.OrderCancel"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACLDispute {
description: "Enable a Buyer to raise a DISPUTE on an Order"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.Dispute"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACLResolve {
description: "Enable a Buyer to RESOLVE a DISPUTEd Order"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.Resolve"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACLAuthorizePayment {
description: "Enable a Buyer to AuthorizePayment for an Order"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.AuthorizePayment"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule BuyerACL {
description: "Allow Buyer full access to any order where they are listed as Buyer"
participant(m): "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE, DELETE
resource(v): "org.acme.Z2BTestNetwork.Order"
condition: (v.buyer.buyerID == m.getIdentifier())
action: ALLOW
}
/**
*
*/
rule netAccessBuyer {
description: "Allow Buyers access to the network"
participant: "org.acme.Z2BTestNetwork.Buyer"
operation: READ, CREATE, UPDATE, DELETE
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
/**
*
**/
rule SellerOrderFromSupplier {
description: "Enable a Seller to Submit an Order to a third party for fulfillment"
participant(m): "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.OrderFromSupplier"
condition: (v.seller.sellerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule SellerRequestPayment {
description: "Enable a Seller to request payment for a fulfilled order"
participant(m): "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.RequestPayment"
condition: (v.seller.sellerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule SellerResolve {
description: "Enable a Seller to resolve a dispute"
participant(m): "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.Resolve"
condition: (v.seller.sellerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule SellerRefund {
description: "Enable a Seller to refund payment for a disputed order"
participant(m): "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.**"
transaction(tx): "org.acme.Z2BTestNetwork.Refund"
condition: (v.seller.sellerID == m.getIdentifier())
action: ALLOW
}
/**
*
**/
rule SellerACL {
description: "Allow Seller full access to order where they are listed as seller and the order has been Submitted for Purchase"
participant(m): "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE
resource(v): "org.acme.Z2BTestNetwork.Order"
condition: ((v.seller.sellerID == m.getIdentifier()) && (v.bought != ''))
action: ALLOW
}
/**
*
*/
rule netAccessSeller {
description: "Allow Sellers access to the network"
participant: "org.acme.Z2BTestNetwork.Seller"
operation: READ, CREATE, UPDATE, DELETE
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
/**
*
**/
rule FinanceCoACL {
description: "Allow FinanceCo full access to all Orders"
participant: "org.acme.Z2BTestNetwork.FinanceCo"
operation: ALL
resource: "org.acme.Z2BTestNetwork.*"
action: ALLOW
}
Модель
namespace org.acme.Z2BTestNetwork
import composer.base.*
import composer.events.*
participant Buyer identified by buyerID extends Member{
o String buyerID
}
participant Seller identified by sellerID extends Member{
o String sellerID
}
participant Shipper identified by shipperID extends Member {
o String shipperID
}
participant Provider identified by providerID extends Member {
o String providerID
}
participant FinanceCo identified by financeCoID extends Member {
o String financeCoID
}
asset Order identified by orderNumber {
o String orderNumber
o String[] items
o String status
o String dispute
o String resolve
o String backorder
o String refund
o Integer amount
o String created
o String bought
o String cancelled
o String ordered
o String dateBackordered
o String requestShipment
o String delivered
o String delivering
o String disputeOpened
o String disputeResolved
o String paymentRequested
o String orderRefunded
o String approved
o String paid
--> Provider provider
--> Shipper shipper
--> Buyer buyer
--> Seller seller
--> FinanceCo financeCo
}
transaction CreateOrder {
o Integer amount
--> Order order
--> Buyer buyer
--> Seller seller
--> FinanceCo financeCo
}
transaction OrderCancel {
--> Order order
--> Buyer buyer
--> Seller seller
}
transaction Buy {
--> Order order
--> Buyer buyer
--> Seller seller
}
transaction OrderFromSupplier {
--> Order order
--> Provider provider
--> Seller seller
}
transaction RequestShipping {
--> Order order
--> Shipper shipper
--> Provider provider
}
transaction Deliver {
--> Order order
--> Shipper shipper
}
transaction Delivering {
o String deliveryStatus
--> Order order
--> Shipper shipper
}
transaction BackOrder {
o String backorder
--> Order order
--> Provider provider
}
transaction Dispute {
o String dispute
--> Order order
--> Buyer buyer
--> Seller seller
--> FinanceCo financeCo
}
transaction Resolve {
o String resolve
--> Order order
--> Buyer buyer
--> Seller seller
--> Shipper shipper
--> Provider provider
--> FinanceCo financeCo
}
transaction RequestPayment {
--> Order order
--> Seller seller
--> FinanceCo financeCo
}
transaction AuthorizePayment {
--> Order order
--> Buyer buyer
--> FinanceCo financeCo
}
transaction Pay {
--> Order order
--> Seller seller
--> FinanceCo financeCo
}
transaction Refund {
o String refund
--> Order order
--> Seller seller
--> FinanceCo financeCo
}
Исключение Stacktrace
Введен заказ от поставщика для abbykidfriendlyinccom1526916622207 входящий идентификатор: bob @ pchardwareinc.com с order.seller as: bob@pchardwareinc.com abbykidfriendlyinccom1526916622207 submitTransaction для обновления статуса заказа от поставщика не удалось с текстом: Ошибка при попытке вызвать бизнес-сеть.Ошибка: нет действительных ответов от любых пиров.Ответ от попытки одноранговых коммуникаций был ошибкой: Ошибка: 2 НЕИЗВЕСТНО: ошибка при выполнении цепного кода: транзакция возвращена с ошибкой: AccessException: участник 'org.acme.Z2BTestNetwork.Seller#bob@pchardwareinc.com' не имеет доступа 'CREATE' к ресурсу'org.acme.Z2BTestNetwork.OrderFromSupplier # 751d9ec9d134be96cef201e495331f73aba55d004550c9b3d89bfc9f5cc225e5'