nautechsystems/nautilus_trader · error · anyhow::Error

Unsupported execution verification schema version

Error message

Unsupported execution verification schema version {installed}

What it means

Raised in database.rs:3691 (load_execution_verification_position) when the installed execution_verification schema version recorded in execution_schema_version exceeds VERIFICATION_SCHEMA_VERSION compiled into this binary. The library refuses to read verification state produced by a newer, unknown schema because row layouts and semantics may differ, preventing silent data corruption.

Solutions

  1. Run the binary version that supports the installed verification schema version.
  2. Inspect the installed version: SELECT version FROM execution_schema_version WHERE component = 'evm_execution_verification'; and confirm it matches your build's VERIFICATION_SCHEMA_VERSION.
  3. Roll the database back from backup if the upgrade was unintended, or upgrade the application binary instead of downgrading.
  4. Never hand-edit the version row to make an old binary accept new data.

Example fix

// before: mismatched binary
code.examples
// after: deploy the binary compiled against the installed verification schema
// (upgrade application to a release whose VERIFICATION_SCHEMA_VERSION >= installed)
Defensive patterns

Strategy: validation

Validate before calling

let installed: Option<i16> = sqlx::query_scalar(
    "SELECT version FROM execution_schema_version WHERE component = 'evm_execution_verification'",
).fetch_optional(&pool).await?;
if installed.map_or(false, |v| v > VERIFICATION_SCHEMA_VERSION) {
    anyhow::bail!("database verification schema {installed:?} newer than this binary");
}

Try / catch

match db.load_execution_verification_position(chain, wallet, ver, digest).await {
    Err(e) if e.to_string().contains("Unsupported execution verification schema version") => {
        // deploy the newer binary or restore the DB backup
    },
    other => other?,
}

Prevention

When it happens

Trigger: Loading execution verification position when SELECT version ... WHERE component = 'evm_execution_verification' returns a value greater than VERIFICATION_SCHEMA_VERSION (e.g. database was upgraded by a newer build, then an older binary reads it).

Common situations: Downgrading the node to an older release after the verification schema was upgraded; pointing an older binary at a database migrated by a newer deployment; mixed-version blue-green deployment where the old instance reads state the new instance upgraded.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/c9011285b13ff2ed. Report an issue: GitHub.

Appendix: source

Thrown at crates/adapters/blockchain/src/cache/database.rs:3691

    /// Loads the durable finalized-header and nonce position when verification is active.
    pub(crate) async fn load_execution_verification_position(
        &self,
        chain_id: u32,
        wallet_address: &str,
        manifest_version: &str,
        manifest_digest: &str,
    ) -> anyhow::Result<Option<ExecutionVerificationPosition>> {
        let installed = sqlx::query_scalar::<_, i16>(
            "SELECT version FROM execution_schema_version \
             WHERE component = 'evm_execution_verification'",
        )
        .fetch_optional(&self.pool)
        .await
        .context("failed to inspect execution verification schema")?;
        let Some(installed) = installed else {
            return Ok(None);
        };
        anyhow::ensure!(
            installed <= VERIFICATION_SCHEMA_VERSION,
            "Unsupported execution verification schema version {installed}"
        );
        let chain_id =
            i32::try_from(chain_id).context("Verification chain ID exceeds PostgreSQL INTEGER")?;
        let current = sqlx::query_as::<_, (String, String, i64, i64)>(
            "
            SELECT manifest_version, manifest_digest, next_canonical_nonce, revision
            FROM execution_verification_nonce
            WHERE chain_id = $1 AND wallet_address = $2
            ",
        )
        .bind(chain_id)
        .bind(wallet_address)
        .fetch_optional(&self.pool)
        .await
        .context("failed to load execution verification nonce position")?;
        let Some((stored_version, stored_digest, nonce, revision)) = current else {

View on GitHub (pinned to 18893faf8b)