Skip to main content
Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
Os programas mais recentes da Raydium (CPMM, CLMM, Farm v6, LaunchLab) são escritos em Anchor — um framework Rust que se baseia no modelo nativo de programas Solana para fornecer validação de contas, tratamento de erros e um IDL (interface description). AMM v4 e farms mais antigos são anteriores ao Anchor. Compreender ambos os paradigmas ajuda você a ler o código, gerar clientes a partir do IDL e depurar erros inesperados.

Modelo de implantação de programas

Todo programa Solana reside em uma Pubkey. O bytecode do programa é armazenado em uma conta executável de propriedade do BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). Uma implantação de programa compreende três contas:
  1. Conta do programa: pequena conta de metadados no ID do programa. Proprietário: BPF Upgradable Loader.
  2. Conta ProgramData: contém o bytecode real. Derivada como [program_id, "programdata"].
  3. Conta Buffer (transitória): contém o novo bytecode durante uma atualização. Descartada após a atualização.
A conta ProgramData tem uma autoridade de atualização — uma chave que pode substituir o bytecode por uma nova versão. A autoridade de atualização da Raydium é um multisig atrás de um timelock de 24 horas; veja security/admin-and-multisig.

Verificando um programa implantado

Para confirmar que o que está on-chain corresponde ao que está na fonte aprovada pela auditoria:
Hashes correspondentes comprovam que você está interagindo com a fonte que pensa estar. A Raydium publica instruções de build verificado nas notas de lançamento.

Anchor: um framework sobre Solana

Programas Solana brutos são funções Rust com esta assinatura:
Anchor envolve todo o boilerplate e permite que você escreva:
Anchor:
  • Gera automaticamente um discriminador determinístico de 8 bytes para cada instrução e cada tipo de conta.
  • Valida restrições de conta (proprietário, seeds, gravável, assinante, mint-matches, token-program-matches) antes de seu código ser executado.
  • Gera um IDL — um arquivo de descrição de interface que clientes usam para chamar o programa.
  • Vem com uma biblioteca cliente Rust, TypeScript e Python.

O discriminador de 8 bytes

Toda conta Anchor e toda instrução Anchor começa com um discriminador de 8 bytes — os primeiros 8 bytes do SHA-256 de uma string fixa:
Quando você chama uma instrução Anchor, os primeiros 8 bytes dos dados da instrução são este discriminador; Anchor despacha para o handler correto procurando-os. Quando você lê uma conta Anchor, os primeiros 8 bytes indicam seu tipo — crucial para ferramentas como getProgramAccounts que enumeram todas as contas de um tipo.

Erros

Programas Anchor definem erros via #[error_code]:
Anchor atribui automaticamente esses códigos numéricos começando em 6000 (0x1770). A tabela completa de códigos de erro da Raydium está em reference/error-codes.

O IDL

Um arquivo IDL (Interface Description Language) do Anchor é uma descrição JSON de um programa: suas instruções, contas, tipos, erros e eventos. É o equivalente de um ABI do Ethereum. A Raydium publica IDLs para todos os programas Anchor. Busque ao vivo on-chain:
Ou da fonte do SDK: src/raydium/*/idl/*.json.

Estrutura do IDL

Gerando um cliente a partir do IDL

O CLI anchor do Anchor gera tipos TypeScript e Rust:
Ferramentas de terceiros como Codama podem gerar clientes Rust, Go, Python ou JavaScript a partir de um IDL. (O Codama é o sucessor do Kinobi da Metaplex, que só chegou a fornecer um renderizador JavaScript.)

Quando o IDL é seu amigo

Se você deseja construir uma integração personalizada que não passa pelo SDK Raydium:
  1. Busque o IDL (ao vivo on-chain ou da fonte do SDK).
  2. Procure a instrução que deseja (por exemplo, swap_base_input).
  3. Construa os dados da instrução: discriminador de 8 bytes + args codificados.
  4. Passe contas na ordem que o IDL especifica.
Veja sdk-api/anchor-idl para exemplos práticos.

Programas pré-Anchor: AMM v4 e Farm v3/v5

Esses programas são anteriores ao Anchor. Eles usam:
  • Despacho manual de instrução: uma tag u8 em instruction_data com uma declaração match.
  • Validação manual de conta: if accounts[0].owner != &expected_program { ... }.
  • Args de instrução serializados em Borsh: sem discriminador, apenas instruction_data[1..].
  • Layout via #[repr(C, packed)]: layout binário de struct C.
O SDK Raydium v2 fornece layouts TypeScript para as instruções AMM v4 não-Anchor para que clientes possam codificar/decodificar sem Anchor:
O padrão de integração é o mesmo — você apenas não obtém a auto-geração orientada por IDL do Anchor.

Mecânica de atualização de programa

Apenas a upgrade_authority do ProgramData pode atualizar. Etapas:
  1. Compile o novo bytecode.
  2. Escreva-o em uma conta buffer (solana program write-buffer).
  3. Envie uma instrução de atualização: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. O runtime substitui atomicamente o bytecode do programa pelo conteúdo do buffer.
A Raydium coloca isso atrás de um timelock de 24 horas implementado nas configurações do multisig Squads. Uma transação de atualização deve aguardar 24 horas após a aprovação do multisig antes da execução. Isso protege contra atualizações apressadas / coagidas. Veja security/admin-and-multisig.

Tornando um programa imutável

Uma autoridade de atualização pode ser definida como None, ponto em que o programa se torna permanentemente imutável. A Raydium não fez isso para nenhum produto — a equipe retém a capacidade de enviar correções de segurança. Trade-off: os usuários devem confiar no processo de multisig + timelock.

Programas e aluguel

Implantar um programa consome lamports isentos de aluguel:
  • Um programa de 50 KB: ~0,35 SOL em aluguel.
  • Um programa de 200 KB: ~1,4 SOL em aluguel.
Fechar um programa (via solana program close) retorna os lamports. Os programas Raydium permanecem ativos e não estão programados para fechamento.

Depurando programas Anchor

Saída de log

A macro msg! do Anchor escreve no log da transação. Simule uma transação para ver logs:
Os logs incluem:
  • Invocação de programa (Program CPMMoo8... invoke [1]).
  • Chamadas msg! do código do programa.
  • Consumo de unidade de computação (consumed 137842 of 400000 compute units).
  • Sucesso ou erro do programa.

Códigos de erro

Se um programa Anchor lança, o log mostra:
0x1770 = 6000 decimal = o primeiro erro Anchor (por exemplo, SlippageExceeded). Faça referência cruzada com o array errors do IDL. Veja reference/error-codes para a tabela completa de erros da Raydium.

Incompatibilidades de layout de conta

Se você passar a conta errada no slot errado, as macros de validação de conta do Anchor retornam erros como:
Números de erro abaixo de 6000 são erros integrados do Anchor (veja o enum ErrorCode do Anchor); erros ≥6000 são os códigos personalizados do programa.

Referências

Fontes: