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, Privy, Turnkey, Fireblocks
  • 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
PrivyEmbedded wallets
TurnkeyNon-custodial
FireblocksInstitutional MPC

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 { VaultSigner } from "@solana/keychain-vault";
import { signTransactionMessageWithSigners } from "@solana/signers";
import {
  createTransactionMessage,
  setTransactionMessageFeePayerSigner,
  pipe,
} from "@solana/kit";

async function signWithKeychain() {
  // Create a signer from any backend
  const signer = new VaultSigner({
    vaultAddr: "https://vault.example.com:8200",
    vaultToken: "hvs.xxxxx",
    keyName: "my-solana-key",
    publicKey: "base58_public_key",
  });

  // Use with @solana/kit transaction builder
  const transaction = pipe(
    createTransactionMessage({ version: 0 }),
    tx => setTransactionMessageFeePayerSigner(signer, tx)
    // ... add instructions
  );

  // Sign with the standard signers API
  const signedTx = await signTransactionMessageWithSigners(transaction);
  return signedTx;
}

Other Resources

Source

GitHub Repository

Built and maintained by the Solana Foundation.

Licensed under MIT. See LICENSE for details.