Tiempo y Reloj
La sysvar Clock proporciona slot, epoch y unix_timestamp para reglas basadas en tiempo: expiraciones, acantilados de vesting y límites de tasa. Los slots son discretos; las marcas de tiempo son aproximaciones del reloj de pared.
Receta
let clock = Clock::get()?;
if clock.unix_timestamp > deadline { return Err(ProgramError::InvalidAccountData); }Cuándo recurrir a esto:
- Expiración de depósito en garantía (escrow).
- Desbloqueo de vesting.
- Período de enfriamiento entre acciones.
Ejemplo de Trabajo
pub fn assert_not_expired(deadline: i64) -> Result<(), ProgramError> {
let now = Clock::get()?.unix_timestamp;
if now > deadline { return Err(ProgramError::InvalidAccountData); }
Ok(())
}Lo que esto demuestra:
- Llamada al sistema
Clock::get(). - Comparación de
unix_timestamp. - La expiración devuelve un error.
Análisis Profundo
Slot vs Tiempo
| Campo | Uso |
|---|---|
| slot | Relativo al horario del líder |
| unix_timestamp | Expiración humana |
| epoch | Períodos de staking |
Manipulación
Los validadores tienen una deriva de marca de tiempo limitada: diseñe períodos de gracia.
Notas de Rust
// Almacenar la fecha límite i64 al inicializar desde el cliente o administrador.Errores Comunes
- Confiar solo en el argumento de marca de tiempo del cliente - Forjado si no proviene de
Clock. Solución: Siempre usarClock::get(). - Asumir que el slot es tiempo preciso - La duración del slot varía ligeramente. Solución: Usar
unix_timestamppara el reloj de pared. - Sin expiración en el depósito en garantía - Bloqueado para siempre. Solución: Fecha límite obligatoria o cancelación.
- Desbordamiento de marca de tiempo - Límites de
i64. Solución: Comprobación de cordura de las fechas límite. - Fecha límite pasada al inicializar - Inmediatamente expirado. Solución: Validar al crear.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Cron fuera de la cadena | No vinculante | Clock en la cadena |
| Solo basado en slots | Predecible | Confusión del usuario |
| Tiempo de oráculo | Excesivo | Específico de DeFi |
Preguntas Frecuentes
ID de la sysvar Clock?
Constante conocida - Sysvar::get.
¿Cuenta de reloj falsa?
No aceptar la cuenta pasada - usar get.
¿i64 negativo?
Antes de 1970 es raro - rechazar.
¿Bloqueo de duración?
Almacenar inicio + duración.
¿Vesting lineal?
Calcular desbloqueado = f(ahora).
¿Anchor `Sysvar<Clock>`?
Envoltorio.
¿Tiempo de prueba?
LiteSVM modifica el reloj.
¿Deriva en Mainnet?
Pequeña - no explotable a gran escala.
¿Hash de slot?
Sysvar diferente.
¿Límite de tasa?
last_action_ts en la cuenta.
¿Bots de Crank?
Cualquiera puede llamar a la ix de expiración.
¿Agave 4.1.1?
El diseño de Clock es estable.
Relacionado
- Máquinas de Estado en Cadena - Tiempos de espera
- Vault y Escrow - Expiración de depósito en garantía
- Conceptos Básicos de Programas - Contexto de tiempo de ejecución
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.