# Arquitetura do PoCo Agent (Proof-of-Concept Agent) Este documento descreve detalhadamente o estado atual da arquitetura do Agente PoCo localizado em `src/agents/tester`, bem como a metodologia rigorosa de avaliação, as métricas e a estrutura dos datasets utilizados para validar a eficácia da Inteligência Artificial como auditora de Smart Contracts. --- ## 1. Arquitetura do Agente (`src/agents/tester`) O Agente Tester foi projetado para atuar como um auditor de segurança e desenvolvedor de *exploits* totalmente autônomo. A espinha dorsal deste agente é construída sobre o framework **LangGraph**, que permite orquestrar nós de processamento como uma Máquina de Estados Finita (FSM). Essa abordagem cíclica mimetiza perfeitamente o raciocínio humano: Perceber, Planejar, Executar, Analisar o Feedback e Iterar. ### 1.1. O Grafo de Execução (Nodes) A lógica principal está contida no arquivo `graph.ts`, onde o LangGraph roteia a execução pelos seguintes nós (Nodes): 1. **`oracleNode`**: Nó de inicialização. Carrega o contexto do ambiente e injeta a descrição original da vulnerabilidade (o relatório humano do auditor). 2. **`routerNode`**: Prepara o prompt inicial e configura o ambiente (como limites de iteração e injeção das descrições dos arquivos-alvo). 3. **`pocoAgentNode`**: O "Cérebro" do sistema. É aqui que o Modelo de Linguagem de Grande Escala (**LLM**) é invocado. Este nó avalia o estado atual do teste, analisa a saída dos erros anteriores e decide quais ferramentas invocar (ex: ler um arquivo, escrever um código, disparar a compilação). - **Modelo Utilizado**: O sistema utiliza primariamente o modelo **Claude 3.5 Sonnet**, conhecido por sua alta capacidade de _reasoning_ técnico e programação. 4. **`pocoToolsNode`**: O nó de execução mecânica. Recebe o output estruturado do `pocoAgentNode` e executa as ações no sistema de arquivos real (ex: executa os binários do Foundry e escreve nos arquivos locais da sandbox). 5. **`trackToolCallsNode`**: Nó de avaliação de parada. Ele intercepta a saída do `smart_contract_test`. Se a saída for `Test Passed Successfully!` (ou seja, o exploit funcionou), ele altera o estado global para `success` e encerra o Grafo. Caso contrário, ele devolve o controle para o `pocoAgentNode` com o log de erro para a próxima iteração. ### 1.2. Ferramentas Disponibilizadas (Tools) As ferramentas implementadas em `src/agents/tester/tools.ts` limitam e empoderam o agente: - **`read_file` e `list_dir`**: Para exploração e compreensão da arquitetura do repositório vulnerável. - **`write_file` e `edit_file`**: Para criação do arquivo `test/Exploit.t.sol`. A instrução exige que o agente não modifique os contratos de produção, apenas crie a PoC isolada. - **`todo_planner`**: Ferramenta de memória de longo prazo que permite ao agente escrever e riscar checklists complexos de ataque. - **`smart_contract_compile`**: Executa `forge build`. Útil para o agente limpar erros sintáticos de interfaces ou *mocks* antes do teste final. - **`smart_contract_test`**: Executa a PoC. É a ferramenta que decide se o ciclo falha ou triunfa. --- ## 2. Métricas de Avaliação do Benchmark Para validar se um LLM gerou um exploit real ou apenas sofreu alucinação, nós utilizamos três pilares absolutos extraídos do paper original do PoCo: ### 2.1. Reproducibility (Reprodutibilidade) Mede se o agente conseguiu escrever uma PoC que compila e cujo teste passa com sucesso no ambiente vulnerável original. - **Como funciona:** O `runTesterBenchmark.ts` clona o repositório na versão exata em que o auditor humano reportou a falha, injeta o agente e espera que ele gere o `Exploit.t.sol`. Se o `forge test` da PoC passar, o projeto ganha a flag `Reproducible=true`. ### 2.2. Specificity (Especificidade) Uma PoC só tem valor real se ela falhar quando a vulnerabilidade for corrigida. Isso prova que o agente focou cirurgicamente na falha arquitetural e não escreveu um teste vazio que passa independentemente do código. - **Como funciona:** Imediatamente após o agente conseguir uma PoC válida no código vulnerável, o nosso script de Benchmark injeta secretamente os **arquivos já corrigidos com o Patch Oficial** (diretamente da branch fix do protocolo) por cima do código vulnerável. O script roda o `forge test` do agente novamente. Se o teste do agente **FALHAR** (pois o roubo não é mais possível), a PoC prova sua eficácia clínica e recebe a flag `Specific=true`. ### 2.3. Teste de Falso Positivo (Hallucination Resistance) Para termos a confiança final na arquitetura, precisamos provar que o agente não gera exploits fantasmas. - **O Cenário de Falso Positivo:** Alimentamos o agente com um repositório 100% seguro (já com o patch aplicado) e mandamos uma informação falsa (o relatório original de vulnerabilidade). - **O Comportamento Esperado:** Um agente de segurança verdadeiro deve investigar o código, tentar gerar a PoC iterativamente, notar que os `requires` do protocolo bloqueiam qualquer roubo descrito na anotação, e finalmente desistir (esgotando as iterações) sem gerar uma PoC bem-sucedida. Se o agente gerasse uma PoC de sucesso aqui, seria uma falha grave da arquitetura. --- ## 3. Estrutura dos Datasets A inteligência do Agente é submetida a problemas de níveis de complexidade crescentes: ### 3.1. Datasets Easy & Intermediate - **Easy**: Desafios sintéticos e isolados (CTFs de 1 a 2 contratos). Avalia o conhecimento intrínseco sobre vetores canônicos (Reentrancy, Integer Overflow) sem barreiras arquiteturais. - **Intermediate**: Clones reduzidos de protocolos reais (ex: forks de cofres simples). Testa se o agente consegue coordenar a interação entre alguns contratos e usar os cheatcodes complexos do Foundry (como `vm.prank`, `vm.warp` e `vm.expectRevert()`). ### 3.2. Dataset Hard (`Proof-of-Patch-only-dataset`) Este é o teste acadêmico definitivo. Composto por repositórios auditados do mundo real vindos do Code4rena e Sherlock. Os protocolos contêm dezenas de contratos interligados. O dataset original cataloga um total de **23 vulnerabilidades**. #### Por que o artigo testa apenas 13 das 23 vulnerabilidades? No paper original do PoCo, das 23 listadas, apenas 13 foram consideradas "prontas para compilação automatizada". As outras 10 requeriam intervenção humana excessiva para rodar no Foundry (ex: versões ultra específicas do compilador, setups de rede complexos ou forks pesados que impossibilitavam o uso cego do `forge test`). #### Por que avaliamos apenas 6 em nosso rigoroso teste final? Ao validarmos de perto a infraestrutura fornecida em nosso repositório para essas 13 vulnerabilidades, expomos um erro silencioso nos dados: **mais da metade (7 projetos) estava fisicamente corrompida**. Projetos como os ligados ao protocolo *Caviar* (`009`, `018`, `033`, `048`), entre outros, apresentavam: 1. **Submódulos Mortos**: Diretórios de bibliotecas vitais foram deletados no GitHub original e constavam vazios no dataset, quebrando qualquer importação de base. 2. **Dependências NPM em Conflito**: Pacotes e scripts NodeJS mal resolvidos que quebravam antes do setup. 3. **Erros de "Out-of-the-Box"**: O comando puro `forge build` na raiz do projeto original (sem o agente tocar em uma linha de código) falhava. Se o agente fosse jogado nesse cenário falho, a saída de erro recebida faria o LLM lutar contra a infraestrutura de pastas corrompidas — tentando recriar os módulos do zero, deletando heranças arquiteturais e alucinando interfaces de sistema — desviando o foco do ataque ao Smart Contract. Para avaliar **puramente a capacidade analítica de segurança da Inteligência Artificial**, usamos um script isolado para filtrar o dataset original e isolar **apenas os 6 repositórios que compilaram perfeitamente na primeira tentativa sem interrupção**. Nosso Benchmark final, focado exclusivamente nestes 6 projetos limpos, retornou um histórico impressionante de **50% de taxa de sucesso (Verified Ground Truth)** em exploração automatizada e autônoma, validando perfeitamente a eficácia desta infraestrutura de agentes para o cenário real da Web3.