Máquina Virtual Ethereum (EVM)
- A Ethereum Virtual Machine (EVM) é o ambiente operacional para contratos inteligentes
- Cada nó participante da rede executa o EVM como parte do protocolo de validação de bloco . Eles verificam as transações listadas no bloco que está sendo validado e executam o código acionado por transações no EVM
- EVM não é apenas sandbox, mas também completamente isolado, o que significa que o código em execução no EVM não pode acessar a rede, sistema de arquivos e outros processos, e até mesmo o acesso entre contratos inteligentes é restrito
- Os contratos existem no blockchain no formato bytecode (EVM bytecode)
- O contrato geralmente é escrito em uma linguagem de alto nível (solidez), compilado em bytecode pelo compilador EVM e, finalmente, implantado na rede blockchain por meio do cliente
EVM e contas
- Existem dois tipos de contas no Ethereum: contas externas e contas de contrato , que compartilham o mesmo espaço de endereço no EVM
- Quer a conta armazene ou não o código, esses dois tipos de contas são tratados exatamente da mesma forma para o EVM
- Cada conta possui um armazenamento persistente na forma de pares chave-valor no EVM . Entre eles, o comprimento da chave e do valor é de 256 bits, o que é chamado de espaço de armazenamento (armazenamento)
EVM e transações
- Uma transação pode ser vista como uma mensagem enviada de uma conta para outra, pode conter dados binários ( payload ) e ether
- Se a conta de destino contiver code , esse código será executado no EVM e o payload será usado como parâmetro de entrada, que é a chamada do contrato
- Se a conta de destino for uma conta zero (o endereço da conta é 0), esta transação criará um novo contrato , e a carga útil da transação usada para criar o contrato será convertida em bytecode EVM e executada, e a saída da execução será permanentemente armazenado como o código do contrato
EVM e gás
- Quando um contrato é invocado por uma transação, a instrução será executada em todos os nós de toda a rede: isso requer o consumo de custos de cálculo; a execução de cada instrução tem um consumo específico e o gás usa essa quantificação para representar esse consumo de custo
- Uma vez criada, cada transação é pré-paga com uma certa quantidade de gás, o objetivo é limitar a quantidade de trabalho necessária para executar a transação e pagar a taxa de transação pela transação
- Quando o EVM realizar uma transação, o gás será consumido gradativamente de acordo com regras específicas
- O preço do gás é um valor definido pelo remetente da transação como o preço unitário da taxa de transação pré-paga do remetente. Caso haja sobra após a efetivação da transação, o gás será devolvido pela rota original
- Não importa onde seja executado, assim que o gás acabar (como cair para um valor negativo), uma exceção de falta de gás será acionada. Todas as modificações de estado feitas pelo quadro de chamada atual ( quadro de chamada ) serão revertidas
armazenamento de dados EVM
Armazenar
- Cada conta possui um espaço de armazenamento persistente, chamado storage, que é uma área de armazenamento de chave-valor que mapeia palavras de 256 bits para palavras de 256 bits, que podem ser entendidas como um banco de dados de contratos
- Armazenado permanentemente no blockchain, uma vez que as variáveis de estado do contrato são salvas permanentemente, a sobrecarga de gás para leitura e gravação também é a maior
Memória
- Para cada chamada de mensagem, o contrato obterá temporariamente um espaço de memória limpo
- O ciclo de vida ocorre apenas durante a execução de todo o método e é reciclado após a chamada da função. Como apenas variáveis temporárias são salvas, a sobrecarga de gás para leitura e gravação é relativamente pequena
Pilha
- O EVM não é baseado em registro, mas sim em pilha, portanto todos os cálculos são realizados em uma área chamada de pilha (stack)
- Armazena algumas variáveis de tipo de valor local, quase liberando memória, mas há um limite no número
conjunto de instruções EVM
- Todas as instruções operam no tipo de dados básico de "palavra de 256 bits (palavra)"
- Possui operações comuns de aritmética, bit, lógica e comparação, e também pode executar saltos condicionais e incondicionais
- Os contratos podem acessar propriedades relevantes do bloco atual, como a altura do bloco e o carimbo de data/hora
Chamadas de mensagem (Chamadas de mensagem)
- Os contratos podem chamar outros contratos ou enviar ether para contas sem contrato chamando
- Um contrato pode decidir quanto do gás restante deve enviar e manter em suas chamadas de mensagens internas
- Se ocorrer uma exceção de falta de gás (ou qualquer outra exceção) em uma chamada de mensagem interna, isso será indicado por um valor de erro empurrado para a pilha; neste ponto, apenas o gás enviado com a chamada de mensagem interna será consumido
Delegar chamada (Delegatecall)
- Um tipo especial de chamada de mensagem
- O código no endereço de destino será executado no contexto do contrato de chamada, e msg.sender e msg.value permanecerão inalterados
- A "biblioteca" pode ser realizada desta forma: a biblioteca de código reutilizável pode ser colocada no armazenamento de um contrato e o código correspondente pode ser introduzido através da chamada do delegado
Criação de contrato e autodestruição
- Ao chamar create calls com uma mensagem especial , os contratos podem criar outros contratos (em vez de simplesmente chamar zero endereços)
- A única maneira de o código do contrato ser removido do blockchain é o contrato realizar uma operação de autodestruição no endereço do contrato ; o ether restante na conta do contrato é enviado para o destino especificado e, em seguida, seu armazenamento e código são removido do estado