Pumpkin-MC/Pumpkin · error · VineError
Vine timestamp expired or desynchronized: skew of
Error message
Vine timestamp expired or desynchronized: skew of {0}s exceeds limit of {1}s What it means
VineError::TimestampExpired is returned when the absolute difference between the current server time and the u64 big-endian Unix timestamp in the Vine payload exceeds MAX_TIMESTAMP_DRIFT_SECS (30 seconds) (vine.rs:180-194). This replay-protection check rejects old or future-dated responses. The error reports the observed skew and the allowed limit.
Solutions
- Enable NTP/time synchronization on both the proxy and server hosts and confirm both report the same UTC time
- Check for long-lived queued/delayed connections and eliminate replayed packets
- Fix the server's system clock/timezone (timestamps must be Unix epoch seconds)
- If drift is persistent, investigate virtualization clock skew (VM pause, guest additions)
Defensive patterns
Strategy: retry
Validate before calling
// check clock health before accepting logins let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); // `now` should be within a few seconds of a trusted time source (NTP); alert if not
Try / catch
match receive_vine_plugin_response(port, &config, response, challenge) {
Err(VineError::TimestampExpired(drift, limit)) => {
tracing::warn!("Vine timestamp skew {}s > {}s — sync clocks via NTP", drift, limit);
disconnect(DisconnectReason::ForwardingTimestamp);
}
result => result?,
} Prevention
- Run NTP/chrony on both proxy and server hosts and monitor clock offset
- Avoid VM suspensions or configure clock resync after resume
- Keep proxy-to-server latency well under the 30-second drift window (rarely an issue in practice)
- Alert when TimestampExpired occurs — usually the first symptom of clock drift
When it happens
Trigger: The computed drift (now - payload timestamp) has abs() > 30 in receive_vine_plugin_response: the proxy's clock is skewed, the packet was delayed/replayed, or the server clock is wrong.
Common situations: Proxy host clock drifts (no NTP, VM suspended/resumed); network delay plus clock skew combined push the payload past 30s; server was restored from a snapshot with a stale clock; timezone/UTC misconfiguration on either host.
Related errors
- Vine challenge nonce mismatch
- JWT chain validation failed
- Cannot accept self-signed token. Authentication is enforced…
- Failed to verify Ed25519 signature
- The validated username is invalid
AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09).
Data as JSON: /api/errors/5597e66c473907db.
Report an issue: GitHub.
Appendix: source
Thrown at crates/pumpkin/src/net/proxy/vine.rs:40
pub const MAX_TIMESTAMP_DRIFT_SECS: i64 = 30;
#[derive(Error, Debug)]
pub enum VineError {
#[error("No response data received")]
NoData,
#[error("Vine response data too short (minimum 89 bytes)")]
DataTooShort,
#[error("No public key or secret configured for Vine proxy")]
MissingKeyConfig,
#[error("Invalid Ed25519 public key")]
InvalidPublicKey,
#[error("Failed to verify Ed25519 signature")]
InvalidSignature,
#[error("Failed to read forward version")]
FailedReadForwardVersion,
#[error("Unsupported forwarding version {0}. Expected {1}")]
UnsupportedForwardVersion(i32, i32),
#[error("Vine timestamp expired or desynchronized: skew of {0}s exceeds limit of {1}s")]
TimestampExpired(i64, i64),
#[error("Vine challenge nonce mismatch")]
ChallengeMismatch,
#[error("Missing expected challenge from pending connection")]
MissingChallenge,
#[error("Failed to read address")]
FailedReadAddress,
#[error("Failed to parse address")]
FailedParseAddress,
#[error("Failed to read game profile name")]
FailedReadProfileName,
#[error("Failed to read game profile UUID")]
FailedReadProfileUUID,
#[error("Failed to read game profile properties")]
FailedReadProfileProperties,
}
/// Initiates Vine modern forwarding handshake by sending a `CLoginPluginRequest`View on GitHub (pinned to 8d4639e25a)