Я хотел бы понять преимущество архитектуры execute-order-validate Hyperledger Fabric по сравнению с архитектурой order-execute с точки зрения эффективности.
Подход execute-order-validate позволяет партнерам выполнять транзакции без учета их заказа. Это позволяет партнерам параллельно выполнять транзакции во время фазы execute .
Однако, насколько я понимаю, на этапе validate все транзакции (кроме первой), которые обновят тот же набор ключей в состоянии мира, будут признаны недействительными, чтобы избежать двойных расходов.
Учитывая это, будет ли архитектура execute-order-validate потенциально производить много недействительных транзакций?
Ниже приведен пример умного контракта, который проиллюстрирует мою обеспокоенность:
reserveTicket(eventId, ticketingAgencyId, ticketCount){
//check if there is not enough tickets left
if (worldState[eventId] < ticketCount)
throw "there is not enough tickets"
worldState[eventId] -= ticketCount;
if (worldState[eventId + ":" + ticketingAgencyId] == null)
worldState[eventId + ":" + ticketingAgencyId] = 0;
worldState[eventId + ":" + ticketingAgencyId] += ticketCount
}
В этом умном договоре реализована система бронирования билетов. Для конкретного события может быть много билетных агентств, которые могут забронировать билеты, вызвав функцию reserveTicket
.
Если есть 10 билетных агентств (например, от agency1
до agency10
), которые будут резервировать одно и то же событие (например, event9999
) в одно и то же время (т. Е. Заказчик совершит 10 транзакций является частью того же блока), означает ли это, что 9 транзакций будут признаны недействительными в фазе validate
, поскольку все они обновят один и тот же ключ в состоянии мира:
worldState["event9999"] -= ticketCount;
Сделает ли это execute-order-validate
менее эффективным, поскольку необходимо повторить попытку 9 из 10 транзакций?
В подходе order-execute
10 транзакций не будут выполняться параллельно, однако, если осталось достаточно билетов, все транзакции будут успешными.
Правильно ли мое понимание, если execute-order-validate
верно? Если да, есть ли способ избежать аннулирования 9 из 10 транзакций?