Execução paralela

Monad executa transações em paralelo. Embora à primeira vista possa parecer que isso implica uma semântica de execução diferente da existente no Ethereum, na verdade não implica. Os blocos Monad são iguais aos blocos Ethereum - um conjunto de transações ordenado linearmente. O resultado da execução das transações em um bloco é idêntico entre Monad e Ethereum.

Execução Otimista

Em um nível básico, o Monad usa execução otimista. Isso significa que o Monad começará a executar transações antes que as transações anteriores no bloco sejam concluídas. Às vezes (mas nem sempre) isso resulta em execução incorreta.

Considere duas transações (nesta ordem no bloco):

  1. A transação 1 lê e atualiza o saldo da conta A (por exemplo, recebe uma transferência da conta B).

  2. A transação 2 também lê e atualiza o saldo da conta A (por exemplo, faz uma transferência para a conta C).

Se essas transações forem executadas em paralelo e a transação 2 começar a ser executada antes da conclusão da transação 1, o saldo lido para a conta A poderá ser diferente do que se fossem executadas sequencialmente. Isso pode resultar em execução incorreta.

A maneira como a execução otimista resolve isso é rastreando as entradas usadas durante a execução da transação 2 e comparando-as com as saídas da transação 1. Se forem diferentes, detectamos que a transação 2 usou dados incorretos durante a execução e precisa ser executada novamente com o dados corretos.

Enquanto o Monad executa transações em paralelo, o estado atualizado de cada transação é “mesclado” sequencialmente para verificar a condição mencionada acima.

Tópicos relacionados à ciência da computação são controle de simultaneidade otimistaarrow-up-right (OCC) e memória transacional de softwarearrow-up-right (STM).

Implicações de execução otimista

Numa implementação ingénua de execução optimista, não se detecta que uma transacção precisa de ser executada novamente até que as transacções anteriores no bloco tenham sido concluídas. Nesse momento, as atualizações de estado de todas as transações anteriores foram mescladas, portanto não é possível que a transação falhe devido à execução otimista uma segunda vez.

Existem etapas na execução de uma transação que não dependem do estado. Um exemplo é a recuperação de assinatura, que é um cálculo caro. Este trabalho não precisa ser repetido ao executar a transação novamente.

Além disso, ao executar uma transação novamente devido a uma falha na fusão, muitas vezes a(s) conta(s) e o armazenamento acessado(s) não serão alterados. Esse estado ainda será armazenado em cache na memória; portanto, novamente, esse é um trabalho caro que não precisa ser repetido.

Agendamento

Uma implementação ingênua de execução otimista tentará iniciar a execução da próxima transação quando o processador tiver recursos disponíveis. Pode haver longas “cadeias” de transações que dependem umas das outras no bloco. A execução destas transações em paralelo resultaria num número significativo de falhas.

Determinar antecipadamente as dependências entre as transações permite que a Monad evite esse esforço desperdiçado, agendando transações para execução apenas quando as transações de pré-requisito forem concluídas. Monad possui um analisador de código estático que tenta fazer tais previsões. Em um bom caso, o Monad pode prever muitas dependências com antecedência; na pior das hipóteses, a Monad recorre à implementação ingênua.

Trabalho adicional

Existem outras oportunidades para evitar a reexecução de transações que ainda estão sendo exploradas.

Last updated