Resumo

Esta proposta introduz uma nova família de opcodes EVM, PACKnque estourou n valores da pilha e combiná-los em um único valor estruturado compactado que é colocado de volta na pilha.

Isso permite a construção nativa de dados estruturados (como listas, tuplas ou árvores) diretamente no nível EVM, melhorando a eficiência e a expressividade para interpretadores on-chain, tempos de execução DSL e máquinas virtuais de nível superior implementadas em contratos inteligentes.


Motivação

O EVM atual suporta apenas valores primitivos de palavras de 256 bits. Dados estruturados (listas, árvores, ASTs, etc.) devem ser construídos manualmente na memória ou armazenamento usando MSTORE, SSTOREe convenções de ponteiro.

Isso leva a:

  • Altos custos de gás devido ao uso intenso de memória/armazenamento
  • Manipulação complexa de ponteiros em contratos estilo intérprete
  • Inchaço de código ao construir estruturas profundamente aninhadas
  • Falta de conhecimento dos limites estruturais no nível da VM, limitando as oportunidades de otimização

Ao apresentar PACKnos dados estruturados podem ser tratados como valores de pilha de primeira classe, permitindo:

  • Intérpretes on-chain e motores DSL mais eficientes
  • Codificação natural de estruturas de dados funcionais (por exemplo, listas de cons)
  • Melhor alinhamento com a evolução futura do EVM de nível superior (por exemplo, projetos baseados em EOF)

Especificação

Família de códigos de operação

PACK0
PACK1
PACK2
...
PACK16

Os números exatos do código de operação devem ser atribuídos. Um limite superior razoável (por exemplo, 16) DEVE ser definido para n.


Comportamento da pilha

Para PACKn:

Entrada de pilha:

..., vₙ, vₙ₋₁, ..., v₂, v₁

Saída da pilha:

..., P

Onde P é um valor estruturado compactado contendo a sequência ordenada:

(v₁, v₂, ..., vₙ)

Semântica

PACKn executa as seguintes etapas:

  1. Pop n valores da pilha
  2. Preservar sua ordem
  3. Crie um novo valor estruturado compactado P contendo esses valores
  4. Empurrar P na pilha

PACK0 produz uma estrutura vazia (análoga a nil).

Exemplo (semelhante a uma tupla):

PUSH1 0x01
PUSH1 0x02
PUSH1 0x03
PACK3

O topo da pilha agora contém um valor compactado equivalente a:

(1, 2, 3)

Estruturas aninhadas

Valores compactados são valores de pilha comuns e podem ser aninhados:

PUSH1 0x03
PACK1          ; (3)

PUSH1 0x02
SWAP1
PACK2          ; (2, (3))

PUSH1 0x01
SWAP1
PACK2          ; (1, (2, (3)))

Isso corresponde à lista de contras:

cons 1 (cons 2 (cons 3 nil))

Representação Interna

Um valor embalado P é um tipo de valor EVM abstrato com:

  • Comprimento n
  • Elementos ordenados (v₁ … vₙ)

Este é um novo tipo de valor internodistinto de uma palavra de 256 bits. As implementações do cliente DEVEM tratar os valores compactados como objetos estruturados opacos.


Interação com Opcodes Existentes

Categoria de código de operação Comportamento com valores compactados
Aritmética (ADD, MULetc.) Operação inválida (exceção)
Operações de pilha (DUP, SWAP, POP) Operar normalmente
MSTORE, SSTORE O valor compactado é serializado para uma representação de bytes
KECCAK256 Hashes no formulário serializado
Comparação (EQ) Igualdade estrutural

O formato de serialização DEVE ser especificado (por exemplo, codificação semelhante a ABI com prefixo de comprimento).


Custo do gás

Gas(PACKn) = G_base + n × G_element

Valores iniciais sugeridos:

Isso faz PACKn mais barato que construir estruturas via memória, mas mais caro que a simples aritmética.


Justificativa

Por que estruturas em nível de pilha?

O EVM é uma máquina de pilha. Intérpretes e avaliadores geralmente operam com dados semelhantes a árvores. Representar tais estruturas diretamente na pilha reduz o tráfego de memória e simplifica os modelos de execução.

Compatibilidade com versões anteriores

O bytecode existente não usa esses opcodes, portanto, nenhuma mudança comportamental ocorre. Novos opcodes DEVEM ser alocados do espaço de opcode atualmente não utilizado.


Extensões Futuras

Possíveis códigos de operação de acompanhamento:

  • UNPACKn – desestruturar valores compactados
  • GETn — acesse o i-ésimo elemento dos dados compactados

Fontesethresear

By victor

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *