linera-io/linera-protocol · warning

Keystore already exists

Error message

Keystore already exists: {}

What it means

create_keystore() refuses to overwrite an existing keystore file at the resolved path (from --keystore-path or the default honoring env vars and the --with-wallet suffix). The keystore holds the wallet's private keys, so creation is deliberately blocked when the file exists to prevent destroying keys.

Solutions

  1. If the existing keystore is valid for your setup, reuse it instead of creating a new one.
  2. Create the new keystore under a distinct identity: --with-wallet NAME (suffixed paths) or --keystore-path <new-path>.
  3. If truly starting over: back up and remove the file at the printed path first (it holds private keys).
  4. In scripts, check for the keystore's existence and skip creation when present.

Example fix

# before
$ linera wallet create ...
Error: Keystore already exists: /home/user/.config/linera/keystore.json

# after (separate identity)
$ linera wallet create --with-wallet testnet2 ...
# or scripted guard
$ test -f ~/.config/linera/keystore.json || linera wallet create ...
Defensive patterns

Strategy: validation

Validate before calling

// Before create_keystore:
if options.keystore_path()?.exists() {
    // reuse via options.keystore()?, or pick a new --keystore-path / --with-wallet suffix
}

Try / catch

match options.create_keystore(seed) {
    Ok(k) => k,
    Err(e) if e.to_string().contains("Keystore already exists") => options.keystore()?,
    Err(e) => return Err(e.into()),
}

Prevention

When it happens

Trigger: Running a command that initializes the keystore (wallet/project creation flows) after one already exists at the same path; leftover keystore from a previous network or test run; LINERA_KEYSTORE pointing at an existing file.

Common situations: Re-running setup tooling on a non-clean environment; parallel processes using the same HOME; switching between wallets without the --with-wallet suffix so both resolve the same keystore path.

Understand the failure class

Background: "already exists" / EEXIST / FileAlreadyExistsException: what the 'file already exists' error means and how to fix it — this error's family across 37 libraries.

Related errors


AI-assisted analysis of linera-io/linera-protocol@6c226ddcb3 (2026-08-22). Data as JSON: /api/errors/905f1708c3a5873f. Report an issue: GitHub.

Appendix: source

Thrown at linera-service/src/cli/common_options.rs:137

    /// Creates and saves a new wallet from the given genesis configuration.
    pub fn create_wallet(&self, genesis_config: GenesisConfig) -> Result<Wallet, Error> {
        let wallet_path = self.wallet_path()?;
        if wallet_path.exists() {
            bail!("Wallet already exists: {}", wallet_path.display());
        }
        let wallet = Wallet::create(&wallet_path, genesis_config)?;
        wallet.save()?;
        Ok(wallet)
    }

    /// Creates and saves a new keystore, optionally seeded for deterministic testing.
    pub fn create_keystore(
        &self,
        testing_prng_seed: Option<u64>,
    ) -> Result<linera_wallet_json::Keystore, Error> {
        let keystore_path = self.keystore_path()?;
        if keystore_path.exists() {
            bail!("Keystore already exists: {}", keystore_path.display());
        }
        Ok(linera_wallet_json::Keystore::create(
            &keystore_path,
            testing_prng_seed,
        )?)
    }
}

View on GitHub (pinned to 6c226ddcb3)