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:
MSTORE/SSTOREpode armazenar dados de comprimento arbitrário de uma só vez.- Intérpretes on-chain e motores DSL mais eficientes
- Codificação natural de estruturas de dados funcionais (por exemplo, listas de cons)
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:
- Pop
nvalores da pilha - Preservar sua ordem
- Crie um novo valor estruturado compactado
Pcontendo esses valores - Empurrar
Pna pilha
PACK0 produz uma estrutura vazia (análoga a nil).
Exemplo (semelhante a uma tupla):
PUSH1 0x03
PUSH1 0x02
PUSH1 0x01
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
PACK2 ; (2, (3))
PUSH1 0x01
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.
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:
UNPACK– desestruturar valores compactadosGETi— acesse o i-ésimo elemento dos dados compactados
Fontesethresear


