diem/diem · error · Error

Error (de)serializing '{0}': {1}

Error message

Error (de)serializing '{0}': {1}

What it means

This is the BCS variant of the error enum in config/management/src/error.rs. It wraps bcs::Error (via #[source]) and is thrown when (de)serializing config data with the BCS codec fails — typically because the bytes on disk or over the wire do not match the expected Rust type layout. The first argument labels what was being (de)serialized.

Source

Thrown at config/management/src/error.rs:20

// SPDX-License-Identifier: Apache-2.0

use thiserror::Error;

#[derive(Debug, Error)]
pub enum Error {
    #[error("Invalid key value found in backend: {0}")]
    BackendInvalidKeyValue(String),
    #[error("Backend is missing the backend key")]
    BackendMissingBackendKey,
    #[error("Backend parsing error: {0}")]
    BackendParsingError(String),
    #[error("Invalid arguments: {0}")]
    CommandArgumentError(String),
    #[error("Unable to load config: {0}")]
    ConfigError(String),
    #[error("Error accessing '{0}': {1}")]
    IO(String, #[source] std::io::Error),
    #[error("Error (de)serializing '{0}': {1}")]
    BCS(String, #[source] bcs::Error),
    #[error("Failed to read '{0}' from JSON-RPC: {1}")]
    JsonRpcReadError(&'static str, String),
    #[error("Failed to write '{0}' from JSON-RPC: {1}")]
    JsonRpcWriteError(&'static str, String),
    #[error("Unable to decode network address: {0}")]
    NetworkAddressDecodeError(String),
    #[error("{0} storage unavailable, please check your configuration: {1}")]
    StorageUnavailable(&'static str, String),
    #[error("Failed to read '{1}' from {0} storage: {2}")]
    StorageReadError(&'static str, &'static str, String),
    #[error("Failed to sign '{1}' with '{2}' using {0} storage: {2}")]
    StorageSigningError(&'static str, &'static str, &'static str, String),
    #[error("Failed to write '{1}' to {0} storage: {2}")]
    StorageWriteError(&'static str, &'static str, String),
    #[error("{0} timed out: {1}")]
    Timeout(&'static str, String),
    #[error("Unable to parse '{0}': error: {1}")]

View on GitHub (pinned to fc4714a8ea)

Solutions

  1. Delete and regenerate the corrupt binary artifact (keystore/config) from source of truth
  2. Confirm producer and consumer use the same struct definition / library version
  3. If the format changed intentionally, migrate or re-encode the data rather than loading raw BCS bytes
  4. Keep binary config files out of hand-editing; use the CLI/JSON config instead

Example fix

// before
let keystore: FileBasedKeystore = bcs::from_bytes(&stale_bytes)?; // BCS mismatch
// after
// regenerate from the source of truth instead of loading incompatible bytes
let keystore = FileBasedKeystore::new(&keystore_path)?;
Defensive patterns

Strategy: try-catch

Validate before calling

fn looks_like_bcs_artifact(bytes: &[u8]) -> bool {
    !bytes.is_empty() && !bytes.starts_with(b"{") // reject JSON hand-edited files
}

Try / catch

match bcs::from_bytes::<MyConfig>(&bytes) {
    Ok(cfg) => cfg,
    Err(e) => {
        eprintln!("BCS decode failed: {e}; artifact may be from an incompatible version");
        // fall back to regenerating the artifact
        regenerate_config()? 
    }
}

Prevention

When it happens

Trigger: Loading a BCS-encoded file (e.g. a serialized keystore or persisted config) whose bytes are corrupt, truncated, or were written by a different struct definition; serializing a struct containing types BCS cannot encode (e.g. non-fixed-size floats or maps without deterministic ordering).

Common situations: Manual edits or corruption of binary config artifacts, upgrading the node/client so the struct layout changed while old BCS blobs remain on disk, or mixing versions in shared config directories.

Related errors


AI-assisted analysis of diem/diem@fc4714a8ea (2026-09-04). Data as JSON: /api/errors/3b5f070d09e8f62d. Report an issue: GitHub.