Apresentando CuEVM V2. Começamos em 2024 com o objetivo de aproveitar o poder da GPU para o ecossistema Ethereum com um EVM nativo da GPU que executa transações em paralelo, com fuzzing (teste massivo de transações ligeiramente mutadas) como o primeiro caso de uso. Outros casos de uso incluem simulações de transações ou até mesmo execução paralela para um L2 (com controle de simultaneidade adequado). Desde o CuEVM V1 Apresentei no Devcon SEA (40-80k TPS, link para a palestra), redesenhamos e reimplementamos toda a base de código para desbloquear um rendimento sem precedentes (8M+ TPS).
Todo o código-fonte e um contêiner Docker agora estão liberados para que todos possam mexer e desenvolver. Compartilharei opções de design mais aprofundadas e pré-impressões de artigos de pesquisa em postagens de acompanhamento nas próximas semanas. Contribuições, discussões e perguntas são bem-vindas.
Destaques
Links do GitHub
Integração de Ecossistemas
- medusa-cuevm – construído em cima da Medusa de Crytic
- go-evmlab – um garfo de holiman/goevmlab
Configuração e consumo de recursos
- 32.768–65.536 threads CUDA ↔ ~20 GB de memória GPU
- 2 a 8 threads de CPU para preparar dados de transação e processar resultados de execução para threads CUDA entre lotes de transações. O gargalo muda entre os lados da CPU e da GPU dependendo de como esses parâmetros estão configurados.
Principais otimizações para alto rendimento
- Buffers pré-alocados com acesso unido (a otimização crítica do CUDA)
- Intercalação de estrutura de dados em diferentes instâncias EVM (SoA, design de estrutura de arrays)
- Agendamento de tópicos (semelhança de transação em tamanho warp)
- Otimização de baixo nível de recursos de GPU (por exemplo, uso de registro)
- Mecanismo de reversão otimista (copiar na gravação, manter um registro de todas as gravações; commit barato grava diretamente no estado, reversão cara)
- Transferência de dados de transação CPU↔GPU minimizada (estado mundial persistente entre transações, estado inicial em cache para redefinição de estado)
Replicação de resultados
Um ambiente totalmente reproduzível está disponível no link do contêiner Docker acima.
Interface
- Binário CuEVM — funcionalidade equivalente a ./cmd/evm em go-ethereum. Recebe a entrada como um arquivo JSON.
- Biblioteca CuEVM (libcuevm_go.so) – um fuzzer por si só, fazendo interface com um programa host para fuzzer contratos inteligentes e retornar contadores de programa que acionam bugs. Oráculos suportados: afirmações da Medusa, bugs inteiros, vazamento de Éter e reentrada.
Projeto
Modelo de execução: Estado inicial + N sequências de M transações cada → um kernel da GPU executa N threads CUDA = N transações (a primeira transação de todas as N sequências) → o estado persiste na memória da GPU → executa a segunda transação de todas as N sequências →… → executa a transação Mᵗʰ de todas as N sequências → copiar o resultado → redefinir o estado.
Comunicação:
- Os dados brutos da transação são passados como um objeto que imita o formato JSON do eth-tests, para mantê-los compatíveis entre a biblioteca Go e o modo EVM binário.
- Um único estado mundial é clonado para todas as N instâncias EVM; cada instância executa uma transação.
- Resultado da execução: resultados específicos de fuzzing (locais de bugs e entradas interessantes que acionam bugs ou aumentam a cobertura de código), além de rastreamentos EIP-3155 (atualmente limitados à impressão do rastreamento de um thread). Você pode instrumentar o CuEVM para emitir qualquer outro resultado personalizado.
O que poderia ser feito de maneira diferente
Desenvolvi experimentalmente uma biblioteca Python e um fuzzer em Python do zero, mas abandonei essa direção devido à dificuldade de preparação paralela de dados no lado da CPU (o lado da CPU se torna o maior gargalo). Como o verdadeiro multithreading com GIL desativado chega ao Python 3.13+, uma biblioteca Python pode ser uma direção viável para trabalhos futuros.
Fico feliz em discutir, acompanhar e colaborar em novos casos de uso e oportunidades. Sinta-se à vontade para me mandar um DM em @nminh_ho.
O projeto foi desenvolvido no âmbito do Programa de Inovação Blockchain de Cingapura da Universidade Nacional de Cingapura e financiado pela Fundação Ethereum. Gostaria de agradecer a Fredrik Svantes por seu apoio e orientação na integração do CuEVM ao ecossistema.
1 Curtir
Fontesethresear

