Introduction

Unified Solana signing across multiple key management backends

Solana Keychain provides a unified interface for signing Solana transactions across multiple key management backends. Use it to integrate enterprise-grade signing into your backend services.

Why Keychain?

  • Single Interface: One SolanaSigner trait works across all backends
  • Swap Backends: Change key management providers without rewriting code
  • Zero-Cost Abstraction: Feature flags include only what you need

Architecture

  • Languages: Rust + TypeScript
  • Trait: Unified SolanaSigner interface
  • Backends: Memory, Vault, AWS KMS, GCP KMS, Privy, Turnkey, Fireblocks, CDP, Crossmint, Dfns, Para
  • Compatibility: @solana/kit and @solana/signers compatible (TypeScript) | solana-sdk and solana-sdk-v3 compatible (Rust)

Supported Backends

BackendUse CaseRustTypeScript
MemoryDevelopment, testingvia @solana/signers (or kit)
HashiCorp VaultSelf-hosted HSM
AWS KMSCloud-native (AWS)
GCP KMSCloud-native (GCP)
PrivyEmbedded wallets
TurnkeyNon-custodial
FireblocksInstitutional MPC
CDPCoinbase Developer Platform
CrossmintCrossmint managed wallets
DfnsDfns wallet infrastructure
ParaPara MPC wallets

Quick Start

Rust

Install the Rust crate:

cargo add solana-keychain

Basic usage:

use solana_keychain::{Signer, SolanaSigner};

// Create a signer from any backend
let signer = Signer::from_memory("base58_private_key")?;

// All signers share the same interface
let pubkey = signer.pubkey();
let signature = signer.sign_transaction(&mut tx).await?;

TypeScript

Install the TypeScript package:

pnpm add @solana/keychain

Basic usage:

import { createKeychainSigner } from "@solana/keychain";
import { signTransactionWithSigners } from "@solana/signers";

// Create any signer via the unified factory
const signer = await createKeychainSigner({
  backend: "vault",
  vaultAddr: "https://vault.example.com:8200",
  vaultToken: "hvs.xxxxx",
  keyName: "my-solana-key",
  publicKey: "base58_public_key",
});

// Sign an already-compiled transaction
const signedTx = await signTransactionWithSigners(
  [signer],
  compiledTransaction,
);

Other Resources

Source

GitHub Repository

Built and maintained by the Solana Foundation.

Licensed under MIT. See LICENSE for details.