WEB3DEV

Cover image for O Ambiente de Tempo de Execução da Máquina Virtual Ethereum (EVM)
Panegali
Panegali

Posted on

O Ambiente de Tempo de Execução da Máquina Virtual Ethereum (EVM)

A EVM (Máquina Virtual Ethereum) fornece um ambiente de tempo de execução do sistema operacional na blockchain Ethereum. O código Solidity em um contrato inteligente deve passar por tradução de código legível por humanos de alto nível para código legível por máquina de baixo nível. Isso requer a conversão de texto em valores hexadecimais que traduzem o código em bytecode. O bytecode é gerado por um compilador. O bytecode é então processado pela EVM e executado na rede. A EVM pode ser construída em cima de uma FPGA (Matriz Programável de Campo) ou CPU baseada em pilha. Ela fornece uma camada de abstração que permite a portabilidade do código em uma plataforma distribuída (por exemplo, a rede Ethereum).

A EVM é um exemplo do que é chamado de Stack Machine. Assim como em outras linguagens de programação baseadas em pilha, a ÚLTIMA entrada que você coloca é a PRIMEIRA que você retira. Este é o conceito de Último a Entrar, Primeiro a Sair (LIFO). Ele usa um conjunto de instruções Formato de endereço zero (Zero Address Format) onde os operandos (operands) estão sempre em um local conhecido. Isso não requer endereços em registradores, pois os valores na pilha são temporários. Assim, quando uma operação é realizada, os valores no topo da pilha são “pulados” e o valor resultante é “empurrado” de volta para a pilha. Outro termo para isso é Notação Polonesa Reversa.

Tomemos o seguinte exemplo.

x = 12 + 4 * 5
Enter fullscreen mode Exit fullscreen mode

Normalmente, esta equação seria lida:

x é igual ao produto de 4 e 5 somado a 12, seguindo o princípio PEMDAS (Parênteses, Expoentes, Multiplicação e Divisão, Adição e Subtração).

Usando o conceito LIFO, ele é lido de maneira muito diferente por uma máquina de pilha (Stack Machine). Nesse caso, a equação se pareceria com este exemplo.

x = 4 5 * 12 +
Enter fullscreen mode Exit fullscreen mode

A maneira como isso é lido na pilha de chamadas (Call stack) seria:

Pegue os valores 4 e 5, multiplique, retire os valores da pilha e coloque o produto resultante no topo da pilha. Em seguida, pegue o produto e o valor 12 para obter a soma de x e, em seguida, retire os valores da pilha. Empurre a soma x de volta para o topo da pilha

1

Em ambos os casos, o resultado obtido para esta operação é 32. O ato de colocar dados na pilha de chamadas usa o que é chamado de método PUSH, enquanto a remoção de dados é chamada de método POP.

Compilar o código de caracteres ASCII legíveis por humanos para caracteres hexadecimais legíveis por máquina é apenas o primeiro passo. Em seguida, o código de máquina deve executar os chamados opcodes. O opcode ou código de operação é o que informa ao computador quais operações realizar. Temos os operandos, nossos dados para quais ações dependem do que os operadores (operators) irão realizar.

Este é um contrato inteligente simples que executa uma função de garantia.

pragma solidity ^0.5.1;
contract Escrow {

   address agent;

   mapping(address => uint256) public deposits;

   modifier onlyAgent() {
       require(msg.sender == agent);
       _;
   }

   constructor () public {
       agent = msg.sender;
   }

   function deposit(address payee) public onlyAgent payable {
       uint256 amount = msg.value;
       deposits[payee] = deposits[payee] + amount;
   }

   function withdraw(address payable payee) public onlyAgent {
       uint256 payment = deposits[payee];
       deposits[payee] = 0;
       payee.transfer(payment);
   }
}
Enter fullscreen mode Exit fullscreen mode

Veja a seguir um exemplo do bytecode que foi gerado a partir do código após a compilação.

{
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103ac806100606000396000f3fe608060405260043610610051576000357c01000000000000000000000000000000000000000000000000000000009004806351cff8d914610056578063f340fa01146100a7578063fc7e286d146100eb575b600080fd5b34801561006257600080fd5b506100a56004803603602081101561007957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610150565b005b6100e9600480360360208110156100bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061027f565b005b3480156100f757600080fd5b5061013a6004803603602081101561010e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610368565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101ab57600080fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561027a573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102da57600080fd5b600034905080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6001602052806000526040600020600091509050548156fea165627a7a72305820d6fa1114b349521b18dd6efdd04f06c882f1f7984c04829d2400baec88dc76950029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x3AC DUP1 PUSH2 0x60 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x51 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0x51CFF8D9 EQ PUSH2 0x56 JUMPI DUP1 PUSH4 0xF340FA01 EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xFC7E286D EQ PUSH2 0xEB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LTISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x150 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xE9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x27F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x10E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E SWAP1 PUSH1 0x20 ADDSWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x368 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EDUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x27A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLVALUE SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH200xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd6 STATICCALL GT EQ 0xb3 0x49 MSTORE SHL XOR 0xdd PUSH15 0xFDD04F06C882F1F7984C04829D2400 0xba 0xec DUP9 0xdc PUSH23 0x9500290000000000000000000000000000000000000000 ",
"sourceMap": "56:676:0:-;;;331:57;8:9:-1;5:2;;;30:1;27;20:12;5:2;331:57: 0;371:10;363:5;;:18;;;;;;;;;;;;;;;;;;;56:676;;;;;;"
}
Enter fullscreen mode Exit fullscreen mode

A seguir estão os códigos de operação gerados para este contrato inteligente.

PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x51 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0x51CFF8D9 EQ PUSH2 0x56 JUMPI DUP1 PUSH4 0xF340FA01 EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xFC7E286D EQ PUSH2 0xEB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x150 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xE9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADICIONAR SWAP1 DUP1 DUP1CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x27F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x10E JUMPI PUSH1 0x0 Dup1 revert Jumpest Dup2 Adicionar swap1 dup1 dup1 calldataload push20 0xffffffffffffffffffffffffffffffffffffffffffffffffffff1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap1 swap swap2 swap2 swap2 swap1 swap ppopo pop pup2 0x368 jumpo swap1 0x40 swap2 swap2 swap2 POP POP POP push2 0x368 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E CHAMADA PUSH200xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP ISZERO DUP1 ISZERO PUSH2 0x27A JUMPI RETURNDATASIZEPUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLVALUE SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADICIONAR PUSH1 0x0KECCAK256 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd6 STATICCALL GT EQ 0xb3 0x49 MSTORE SHL XOR 0xdd PUSH15 0xFDD04F06C882F1F7984C04829D2400 0xba 0xec DUP9 0xdc PUSH23 0x9500290000000000000000000000000000000000000000
Enter fullscreen mode Exit fullscreen mode

Os códigos de operação são comandos em linguagem assembly que são executados pela CPU. Na verdade, os desenvolvedores podem usar assembly em vez de código de programação de alto nível para atingir o mesmo objetivo, mas é muito mais complicado. A facilidade de uso e a interface amigável de um IDE são muito melhores e provavelmente consomem menos tempo para a maioria dos desenvolvedores. Não vou explicar mais o código da linguagem assembly, pois isto em si é outra lição.

O contrato inteligente será implantado na blockchain, que é uma rede distribuída e descentralizada. A Interface Binária de Aplicação (ABI) fornece uma maneira padrão de interagir com o contrato inteligente pela rede. Ela permite aplicativos externos e interação contrato a contrato. Os desenvolvedores usam a ABI em seus aplicativos ou DApps (Aplicativos Descentralizados) para acessar os métodos e funções do contrato inteligente.

[
{
 "constant": false,
 "inputs": [
  {
   "name": "payee",
   "type": "address"
  }
 ],
 "name": "withdraw",
 "outputs": [],
 "payable" : false,
 "stateMutability": "nonpayable",
 "type": "function"
},
{
 "constant": false,
 "inputs": [
  {
   "name": "payee",
   "type": "address"
  }
 ] ,
 "nome": "depósito",
 "saídas": [],
 "payable": true,
 "stateMutability": "payable",
 "type": "function"
},
{
 "constant": true,
 "inputs": [
  {
   "name": "",
   "type": "address"
  }
 ],
 "name": "deposits",
 "outputs": [
  {
   "name": "",
   "type": "uint256"
  }
 ],
 " pagar": false,
 "stateMutability": "view",
 "type": "function"
},
{
 "inputs": [],
 "payable": false,
 "stateMutability": "nonpayable",
 "type": "constructor "
}
]
Enter fullscreen mode Exit fullscreen mode

Quando o contrato inteligente é implantado na blockchain, a EVM executará os códigos de operação do código compilado no bytecode. Se a função exigir uma mudança no estado da blockchain, uma unidade de computação chamada gás (medida em wei) será cobrada do proprietário do contrato. Esses custos seguem o protocolo Ethereum que exige o gasto de um custo para computação em toda a rede, que são as taxas que são pagas aos mineradores que verificarão a transação que é colocada em um bloco. Funções de chamada simples, que não exigem nenhuma alteração no estado da blockchain, não gastam gás e, portanto, são gratuitas. Um exemplo disso seria uma chamada de consulta de saldo em um valor armazenado em um contrato inteligente.

Em termos de custo, armazenar dados na pilha usando o método PUSH é o mais barato. Isso é seguido pelo método MSTORE, que armazena dados na memória RAM (memória do sistema). Em ambos os métodos, como os valores dos dados são temporários, eles não são persistentes na blockchain. Torna-se persistente ao usar o método SSTORE, que armazena os dados em disco. O método SSTORE também é o mais caro porque armazena dados persistentes na blockchain.

Agora, de volta aos detalhes do contrato inteligente deste exemplo. Quando o contrato inteligente foi implantado e executado pela EVM, ele agora reside na blockchain. Ele se tornará imutável e ao mesmo tempo transparente, o que significa que não pode ser alterado diretamente e pode ser visualizado pelo público. O contrato inteligente também é atribuído com seu próprio endereço. Neste exemplo é:

0x692a70d2e424a56d2c6c27aa97d1a86395877b3a
Enter fullscreen mode Exit fullscreen mode

Este contrato inteligente foi implantado em um sistema de teste, mas se o contrato inteligente foi implantado na rede principal na blockchain Ethereum, ele pode ser pesquisado usando o explorador de blocos. Isso contém mais detalhes sobre o contrato inteligente, incluindo o saldo, o valor de ether e o endereço público do criador do contrato. Todas as transações também são listadas e pesquisáveis ​​por seu valor de hash de transação.

Este diagrama ilustra a EVM em relação à arquitetura de rede Ethereum.

2


Artigo escrito por Vincent Tabora e traduzido por Marcelo Panegali

Top comments (0)