CPI al Programa del Sistema
El Programa del Sistema maneja la creación, asignación, asignación de espacio y transferencias de lamports de cuentas. La mayoría de los programas hacen CPI a él para el pago de alquiler y el movimiento de SOL.
Receta
invoke(
&system_instruction::transfer(from.key, to.key, amount),
&[from.clone(), to.clone()],
)?;Cuándo usar esto:
- Pagar el alquiler de nuevas cuentas.
- Mover SOL a la tesorería o a usuarios.
- Cerrar cuentas y devolver el alquiler.
Ejemplo de Trabajo
let rent = Rent::get()?;
let lamports = rent.minimum_balance(space);
invoke(
&system_instruction::create_account(payer.key, new.key, lamports, space as u64, owner),
&[payer.clone(), new.clone(), system_program.clone()],
)?;Lo que esto demuestra:
- Sysvar de alquiler para el saldo mínimo.
create_accountestablece el programa propietario.- El pagador firma la transferencia/creación.
Análisis Profundo
Instrucciones Comunes
| IX | Propósito |
|---|---|
| transfer | Mover lamports |
| create_account | Asignar espacio + asignar |
| allocate | Añadir espacio |
| assign | Cambiar propietario (restringido) |
Notas de Rust
use solana_program::system_program;Errores Comunes
- Transferencia desde PDA sin firma - Falla. Solución:
invoke_signed. - Crear en existente - Falla si
lamports > 0. Solución: Comprobar cuenta vacía. - Lamports insuficientes - La transferencia/creación falla. Solución: Comprobaciones de saldo.
- Parámetro de propietario incorrecto - La cuenta queda con el propietario incorrecto. Solución: Pasar el ID de tu programa.
- Alquiler no exento - La cuenta se desasigna. Solución: Financiar
minimum_balance.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| El cliente crea la cuenta | Programa más simple | Flujos de PDA |
Anchor init | Abstrae | Nativo |
transfer_with_seed | Direcciones derivadas | Se prefiere PDA |
Preguntas Frecuentes
ID del programa del sistema?
11111111111111111111111111111111
¿Crear + inicializar misma tx?
Sí.
¿Cerrar cuenta?
Transferir todos los lamports.
¿CPI de asignación?
Raro - sensible a la seguridad.
¿`allocate` vs `create`?
create para claves nuevas.
¿Crear PDA?
invoke_signed.
¿Sysvar de alquiler?
Rent::get() en el programa.
¿Transferencia de cero lamports?
Permitido pero inútil.
¿Signatario para transferencia?
Cuenta de origen como signatario.
¿Transferencia múltiple?
Múltiples CPIs están bien.
¿Agave 4.1.1?
Coincidir con los ayudantes de system_instruction.
¿Surfpool?
Probar las matemáticas del alquiler.
Relacionado
- Creación de Cuentas vía CPI - Patrones
- Vault y Escrow - Custodia
- Patrones de Tarifas y Tesorería - Tarifas
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.