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

  1. Enable NTP/time synchronization on both the proxy and server hosts and confirm both report the same UTC time
  2. Check for long-lived queued/delayed connections and eliminate replayed packets
  3. Fix the server's system clock/timezone (timestamps must be Unix epoch seconds)
  4. 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

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


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)