Instalação
Adicione solana-keychain ao seu Cargo.toml com apenas os backends que você
precisa:
[dependencies]# Memory signer only (default)solana-keychain = "1.2"# Or specify backends explicitlysolana-keychain = { version = "1.2", default-features = false, features = ["vault", "aws_kms"] }# All backendssolana-keychain = { version = "1.2", features = ["all"] }
Flags de Funcionalidades
| Funcionalidade | Descrição |
|---|---|
memory | Assinatura de keypair local (padrão) |
vault | Motor Transit do HashiCorp Vault |
aws_kms | AWS KMS com Ed25519 |
gcp_kms | GCP Cloud KMS com Ed25519 |
privy | Carteiras incorporadas Privy |
turnkey | API Turnkey |
fireblocks | MPC Fireblocks |
cdp | Plataforma de Desenvolvedor Coinbase |
crossmint | Carteiras gerenciadas Crossmint |
dfns | Infraestrutura de carteiras Dfns |
openfort | Carteiras incorporadas Openfort |
para | Carteiras MPC Para |
all | Ativar todos os backends |
Uso Básico
Todos os signatários implementam a
trait SolanaSigner:
use solana_keychain::{SolanaSigner, Signer, SignerError, SignTransactionResult};use solana_sdk::transaction::Transaction;async fn sign_transaction(signer: &impl SolanaSigner,tx: &mut Transaction,) -> Result<(), SignerError> {// Get the signer's public keylet pubkey = signer.pubkey();println!("Signing with: {}", pubkey);// Check availability (useful for remote signers)if !signer.is_available().await {return Err(SignerError::NotAvailable("Signer offline".into()));}// Sign the transaction — returns Complete or Partiallet result = signer.sign_transaction(tx).await?;let (base64_tx, signature) = result.into_signed_transaction();println!("Signature: {}", signature);Ok(())}
Configuração de Backends
Signatário de Memória
Para desenvolvimento e testes com keypairs locais:
use solana_keychain::Signer;// From base58 private keylet signer = Signer::from_memory("base58_private_key")?;// From JSON file pathlet signer = Signer::from_memory("/path/to/keypair.json")?;// From byte array stringlet signer = Signer::from_memory("[1,2,3,...]")?;
HashiCorp Vault
Para HSM auto-hospedado com motor Transit:
use solana_keychain::Signer;let signer = Signer::from_vault("https://vault.example.com:8200".to_string(), // Vault address"hvs.xxxxx".to_string(), // Vault token"my-solana-key".to_string(), // Key name in Transit"base58_public_key".to_string(), // Expected public keyNone, // Default HTTP timeouts)?;
AWS KMS
Para assinatura nativa em nuvem com chaves Ed25519 do AWS KMS:
use solana_keychain::Signer;let signer = Signer::from_aws_kms("alias/my-solana-key".to_string(), // KMS key ID or alias"base58_public_key".to_string(), // Expected public keySome("us-east-1".to_string()), // Region (optional)).await?;
Privy
Para assinatura com carteira incorporada:
use solana_keychain::Signer;let signer = Signer::from_privy("app_id".to_string(), // Privy app ID"app_secret".to_string(), // Privy app secret"wallet_id".to_string(), // Wallet IDNone, // Default HTTP timeouts).await?;
Turnkey
Para assinatura não-custodial:
use solana_keychain::Signer;let signer = Signer::from_turnkey("api_public_key".to_string(), // Turnkey API public key"api_private_key".to_string(), // Turnkey API private key"org_id".to_string(), // Organization ID"private_key_id".to_string(), // Private key ID in Turnkey"base58_public_key".to_string(),// Expected public keyNone, // Default HTTP timeouts)?;
Fireblocks
Para assinatura MPC institucional:
use solana_keychain::{Signer, FireblocksSignerConfig};let config = FireblocksSignerConfig {api_key: "api_key".to_string(),private_key_pem: "-----BEGIN RSA PRIVATE KEY-----\n...".to_string(),vault_account_id: "0".to_string(),asset_id: "SOL".to_string(), // or "SOL_TEST" for devnet};let signer = Signer::from_fireblocks(config).await?;
GCP KMS
Para assinatura nativa na nuvem com chaves Ed25519 do GCP Cloud KMS:
use solana_keychain::Signer;let signer = Signer::from_gcp_kms("projects/my-project/locations/us-east1/keyRings/my-ring/cryptoKeys/my-key/cryptoKeyVersions/1".to_string(),"base58_public_key".to_string(),).await?;
CDP (Coinbase Developer Platform)
Para assinatura com carteira gerenciada pela Coinbase:
use solana_keychain::Signer;let signer = Signer::from_cdp("api_key_id".to_string(), // CDP API key ID"api_key_secret".to_string(), // CDP API private key (base64 Ed25519)"wallet_secret".to_string(), // CDP wallet secret (base64 PKCS#8 DER)"base58_address".to_string(), // Solana account addressNone, // Default HTTP timeouts)?;
Crossmint
Para assinatura com carteira gerenciada pela Crossmint:
use solana_keychain::{Signer, CrossmintSignerConfig};let config = CrossmintSignerConfig {api_key: "api_key".to_string(),wallet_locator: "wallet_locator".to_string(),signer_secret: None,signer: None,api_base_url: None,poll_interval_ms: None,max_poll_attempts: None,};let signer = Signer::from_crossmint(config).await?;
Dfns
Para assinatura com infraestrutura de carteira Dfns:
use solana_keychain::{Signer, DfnsSignerConfig};let config = DfnsSignerConfig {auth_token: "auth_token".to_string(),cred_id: "cred_id".to_string(),private_key_pem: "-----BEGIN EC PRIVATE KEY-----\n...".to_string(),app_id: "app_id".to_string(),wallet_id: "wallet_id".to_string(),api_base_url: None,http_client_config: None,};let signer = Signer::from_dfns(config).await?;
Para
Para assinatura com carteira MPC Para:
use solana_keychain::Signer;let signer = Signer::from_para("api_key".to_string(), // Para API key"wallet_id".to_string(), // Para wallet IDNone, // Default API base URL).await?;
Enum de Assinante Unificado
Use o enum Signer para selecionar backends em tempo de execução:
use solana_keychain::{Signer, SolanaSigner, SignerError};async fn get_signer(backend: &str) -> Result<Signer, SignerError> {match backend {"memory" => Signer::from_memory("base58_key"),"vault" => Signer::from_vault(/* ... */),"kms" => Signer::from_aws_kms(/* ... */).await,_ => Err(SignerError::ConfigError("Unknown backend".into())),}}// Use it genericallylet signer = get_signer("kms").await?;let pubkey = signer.pubkey();
Adicionando Assinantes Personalizados
Consulte o guia de Adição de Assinantes para integrar serviços adicionais de gerenciamento de chaves.
Is this page helpful?