Skip to main content
Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Los programas más recientes de Raydium (CPMM, CLMM, Farm v6, LaunchLab) están escritos en Anchor — un framework de Rust que se construye sobre el modelo nativo de programas de Solana para proporcionar validación de cuentas, manejo de errores e IDL (descripción de interfaz). AMM v4 y las granjas más antiguas son anteriores a Anchor. Entender ambos paradigmas te ayuda a leer el código, generar clientes desde el IDL y depurar errores inesperados.

Modelo de despliegue de programas

Cada programa de Solana vive en una Pubkey. El bytecode del programa se almacena en una cuenta ejecutable propiedad del BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). Un despliegue de programa comprende tres cuentas:
  1. Cuenta de programa: pequeña cuenta de metadatos en el ID del programa. Propietario: BPF Upgradable Loader.
  2. Cuenta ProgramData: contiene el bytecode real. Derivada como [program_id, "programdata"].
  3. Cuenta Buffer (transitoria): contiene el nuevo bytecode durante una actualización. Se descarta después de la actualización.
La cuenta ProgramData tiene una autoridad de actualización — una clave que puede reemplazar el bytecode con una nueva versión. La autoridad de actualización de Raydium es un multisig detrás de un timelock de 24 horas; consulta security/admin-and-multisig.

Verificar un programa desplegado

Para confirmar que lo que está en cadena coincide con lo que está en la fuente aprobada por auditoría:
Los hashes coincidentes prueban que estás interactuando con la fuente que crees que es. Raydium publica instrucciones de compilación verificada en las notas de lanzamiento.

Anchor: un framework sobre Solana

Los programas de Solana sin procesar son funciones de Rust con esta firma:
Anchor envuelve todo el código repetitivo y te permite escribir:
Anchor:
  • Genera automáticamente un discriminador determinista de 8 bytes para cada instrucción y cada tipo de cuenta.
  • Valida restricciones de cuenta (propietario, seeds, escribible, firmante, coincidencia de mint, coincidencia de programa de token) antes de que se ejecute tu código.
  • Genera un IDL — un archivo de descripción de interfaz que los clientes usan para llamar al programa.
  • Se envía con una biblioteca de cliente de Rust, TypeScript y Python.

El discriminador de 8 bytes

Cada cuenta de Anchor y cada instrucción de Anchor comienza con un discriminador de 8 bytes — los primeros 8 bytes del SHA-256 de una cadena fija:
Cuando llamas a una instrucción de Anchor, los primeros 8 bytes de los datos de instrucción son este discriminador; Anchor se envía al manejador correcto buscándolos. Cuando lees una cuenta de Anchor, los primeros 8 bytes te dicen su tipo — crucial para herramientas como getProgramAccounts que enumeran todas las cuentas de un tipo.

Errores

Los programas de Anchor definen errores mediante #[error_code]:
Anchor asigna automáticamente estos códigos numéricos comenzando desde 6000 (0x1770). La tabla completa de códigos de error de Raydium está en reference/error-codes.

El IDL

Un archivo IDL (Interface Description Language) de Anchor es una descripción JSON de un programa: sus instrucciones, cuentas, tipos, errores y eventos. Es el equivalente de un ABI de Ethereum. Raydium publica IDLs para todos los programas de Anchor. Obtén en vivo desde la cadena:
O desde la fuente del SDK: src/raydium/*/idl/*.json.

Estructura del IDL

Generar un cliente desde el IDL

La CLI de Anchor anchor genera tipos de TypeScript y Rust:
Herramientas de terceros como Kinobi pueden generar clientes de Rust, Python, C o Go desde un IDL.

Cuándo el IDL es tu aliado

Si quieres construir una integración personalizada que no pase por el SDK de Raydium:
  1. Obtén el IDL (en vivo desde la cadena o desde la fuente del SDK).
  2. Busca la instrucción que deseas (p. ej., swap_base_input).
  3. Construye los datos de instrucción: discriminador de 8 bytes + argumentos codificados.
  4. Pasa cuentas en el orden que especifica el IDL.
Consulta sdk-api/anchor-idl para ejemplos trabajados.

Programas anteriores a Anchor: AMM v4 y Farm v3/v5

Estos programas son anteriores a Anchor. Utilizan:
  • Envío manual de instrucciones: una etiqueta u8 en instruction_data con una declaración match.
  • Validación manual de cuentas: if accounts[0].owner != &expected_program { ... }.
  • Argumentos de instrucción serializados con Borsh: sin discriminador, solo instruction_data[1..].
  • Diseño mediante #[repr(C, packed)]: diseño binario de estructura C.
El SDK de Raydium v2 envía diseños de TypeScript para las instrucciones de AMM v4 que no son de Anchor, de modo que los clientes pueden codificar/decodificar sin Anchor:
El patrón de integración es el mismo — simplemente no obtienes la generación automática impulsada por IDL de Anchor.

Mecánica de actualización de programas

Solo la upgrade_authority de ProgramData puede actualizar. Pasos:
  1. Compilar el nuevo bytecode.
  2. Escribirlo en una cuenta buffer (solana program write-buffer).
  3. Enviar una instrucción de actualización: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. El tiempo de ejecución reemplaza atómicamente el bytecode del programa con el contenido del buffer.
Raydium cierra esto detrás de un timelock de 24 horas implementado en la configuración del multisig de Squads. Una transacción de actualización debe esperar 24 horas después de la aprobación del multisig antes de la ejecución. Esto protege contra actualizaciones apresuradas / coercionadas. Consulta security/admin-and-multisig.

Hacer un programa inmutable

Una autoridad de actualización puede establecerse en None, momento en el cual el programa se vuelve permanentemente inmutable. Raydium no ha hecho esto para ningún producto — el equipo retiene la capacidad de enviar correcciones de seguridad. Compensación: los usuarios deben confiar en el proceso de multisig + timelock.

Programas y renta

Desplegar un programa consume lamports exentos de renta:
  • Un programa de 50 KB: ~0.35 SOL en renta.
  • Un programa de 200 KB: ~1.4 SOL en renta.
Cerrar un programa (mediante solana program close) devuelve los lamports. Los programas de Raydium permanecen activos y no están programados para cierre.

Depuración de programas de Anchor

Salida de registro

La macro msg! de Anchor escribe en el registro de la transacción. Simula una transacción para ver registros:
Los registros incluyen:
  • Invocación de programa (Program CPMMoo8... invoke [1]).
  • Llamadas msg! desde el código del programa.
  • Consumo de unidades de cómputo (consumed 137842 of 400000 compute units).
  • Éxito o error del programa.

Códigos de error

Si un programa de Anchor falla, el registro muestra:
0x1770 = 6000 decimal = el primer error de Anchor (p. ej., SlippageExceeded). Haz referencia cruzada con el array errors del IDL. Consulta reference/error-codes para la tabla completa de errores de Raydium.

Desajustes de diseño de cuenta

Si pasas la cuenta incorrecta en la ranura incorrecta, las macros de validación de cuenta de Anchor devuelven errores como:
Los números de error por debajo de 6000 son los errores integrados de Anchor (consulta el enum ErrorCode de Anchor); los errores ≥6000 son los códigos personalizados del programa.

Referencias

Fuentes: