realloc y Cuentas en Crecimiento
Los programas pueden crecer (o reducir) los datos de la cuenta a través de la llamada al sistema/CPI realloc, pagando alquiler adicional de un pagador. Requerido cuando los esquemas crecen o las colecciones dinámicas se expanden.
Receta
account.realloc(new_len, false)?;
account.transfer_required_rent(payer)?; // conceptualmente - usa el patrón CPI de reallocCuándo usar esto:
- Al añadir campos en una actualización de programa.
- Al crecer el almacenamiento de vectores dinámicos.
- Al reducir por poda de datos.
Ejemplo de Trabajo
// Nativo: usa solana_program::program::realloc o patrones de CPI del sistema por SDK
// Después de realloc, inicializa los nuevos bytes y los nuevos campos
let new_len = old_len + 8;
// realloc la cuenta a new_len con el pagador financiando la diferencia de alquilerLo que esto demuestra:
- El delta de alquiler debe ser financiado.
- Los nuevos bytes deben ser inicializados.
- La reducción devuelve el alquiler al destino.
Inmersión Profunda
Seguridad
- Rechazar la reducción si trunca campos activos.
- Poner a cero la nueva región para evitar fugas de bytes obsoletos.
Anchor
Restricción de realloc en 0.32.1.
Notas de Rust
// Documentar max_len para limitar el griefing.Errores Comunes
- Realloc sin fondos del pagador - Falla a mitad de la actualización. Solución: Asegurar que el pagador firme con lamports.
- Nuevos bytes no inicializados - Deserializa basura. Solución: Inicializar a cero.
- Reducir datos activos - Corrupción. Solución: Prohibir o migrar primero.
- Crecimiento ilimitado - Griefing de alquiler. Solución: Limitar
max_len. - Realloc en bucle - Costoso en CU. Solución: Agrupar el crecimiento.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Migración de cuenta nueva | Más seguro | Fricción para el usuario |
| Tamaño máximo fijo por adelantado | Desperdicia alquiler temprano | Simple |
| Almacenamiento fuera de la cadena | Barato | Modelo de confianza |
Preguntas Frecuentes
¿Quién paga el aumento de alquiler?
El firmante pagador que especifiques.
¿Crecimiento máximo?
Límite de cuenta de 10 MB.
¿La reducción devuelve alquiler?
Al destinatario elegido.
¿Realloc de Anchor?
Atributo en la cuenta.
¿Realloc concurrente?
Serialización de transacciones por cuenta.
¿Espacio nuevo a cero?
Práctica de seguridad requerida.
¿Ix de migración?
Ruta de actualización común.
¿Realloc de LiteSVM?
Soportado.
¿Costo de CU?
Perfil de ix de realloc.
¿El cliente debe firmar?
El pagador sí.
¿Realloc parcial?
Establecer la longitud nueva absoluta.
¿Programa inmutable?
Planificar espacio adicional temprano.
Relacionado
- Versionado y Migración de Datos - Esquema
- Cálculo de Espacio - Planificación
- Diseño de Datos Seguro ante Actualizaciones - Compatibilidad futura
Versiones de la pila: 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.