1.x sürümünden mi yükseltiyorsunuz? 2.0 geçiş kılavuzuna bakın.
Kurulum
Şemsiye paketi veya gerektiğinde bireysel imzalayıcıları kurun:
# Umbrella package (includes all signers)pnpm add @solana/keychain# Or install individual packagespnpm add @solana/keychain-core # Core interfaces (required for custom signers)pnpm add @solana/keychain-memory # Local keypair signerpnpm add @solana/keychain-vault # HashiCorp Vaultpnpm add @solana/keychain-aws-kms # AWS KMSpnpm add @solana/keychain-gcp-kms # GCP KMSpnpm add @solana/keychain-privy # Privypnpm add @solana/keychain-turnkey # Turnkeypnpm add @solana/keychain-fireblocks # Fireblockspnpm add @solana/keychain-cdp # Coinbase Developer Platformpnpm add @solana/keychain-crossmint # Crossmintpnpm add @solana/keychain-dfns # Dfnspnpm add @solana/keychain-openfort # Openfortpnpm add @solana/keychain-para # Parapnpm add @solana/keychain-utila # Utilapnpm add @solana/keychain-fordefi # Fordefi# Kit client plugins (keychainSigner / keychainPayer / keychainIdentity)pnpm add @solana/keychain-kit-plugin
@solana/kit 8.1 veya üzeri gerekir. v1 işlemleri
(createTransactionMessage({ version: 1 })) desteklenir; yalnızca
useProgramCall: true ile Fireblocks bunun dışındadır ve yalnızca legacy ile v0 kabul eder.
Temel Kullanım
Birleşik Fabrika (Birden fazla imzalayıcıyı desteklemek isteyen uygulamalar için önerilir)
Herhangi bir arka uç oluşturmak için ayrımlaştırılmış yapılandırmayla
createKeychainSigner kullanın:
import { createKeychainSigner } from "@solana/keychain";import { signTransactionWithSigners } from "@solana/signers"; // requires @solana/signers >= 8.1const signer = await createKeychainSigner({backend: "privy",appId: "your-app-id",appSecret: "your-app-secret",walletId: "your-wallet-id"});// Sign an already-compiled transactionconst signedTx = await signTransactionWithSigners([signer],compiledTransaction);
Veya daha küçük bir bağımlılık ayak izi için bireysel bir imzalayıcı paketi kurun:
import { createPrivySigner } from "@solana/keychain-privy";const signer = await createPrivySigner({appId: "your-app-id",appSecret: "your-app-secret",walletId: "your-wallet-id"});
İşlem Mesajlarıyla Kullanımı
Crossmint ve Fordefi native modu dışındaki her arka uç, bir Kit
TransactionPartialSigner olan ve aşağıdaki @solana/signers kısmi imzalayıcı
yardımcılarıyla çalışan bir SolanaTransactionSigner döndürür. Yönetilen yayın
yapan arka uçlar İmzalayıcı Yetenekleri bölümünde ele alınır.
import type { SolanaTransactionSigner } from "@solana/keychain-core";import { signTransactionMessageWithSigners } from "@solana/signers";import {createTransactionMessage,setTransactionMessageFeePayerSigner,pipe} from "@solana/kit";async function signWithKeychain(signer: SolanaTransactionSigner) {// Check availability (useful for remote signers)if (!(await signer.isAvailable())) {throw new Error("Signer offline");}// Use with @solana/kit transaction builderconst transaction = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayerSigner(signer, tx)// ... set a lifetime and add instructions);// Sign with the standard signers APIconst signedTx = await signTransactionMessageWithSigners(transaction);return signedTx;}
Herhangi Bir İmzalayıcıyla İmzalama ve Gönderme
@solana/keychain-core içindeki signAndSendTransaction, imzalayıcının yapısı
ne olursa olsun bir işlemi zincire ulaştırır. Gönderen imzalayıcılar işlemi
kendi sağlayıcıları üzerinden yayınlar; diğer tüm yapılar sizin ilettiğiniz
sendTransaction işlevini kullanır (core'un herhangi bir RPC bağımlılığı yoktur):
import { signAndSendTransaction } from "@solana/keychain-core";const signature = await signAndSendTransaction(signer, transaction, {sendTransaction: (tx) =>sendAndConfirmTransaction(tx, { commitment: "confirmed" })});
Kit İstemcisiyle Kullanım (keychainSigner eklentisi)
@solana/keychain-kit-plugin, bir keychain imzalayıcıyı doğrudan bir
Kit istemcisine yükler ve onu payer ile
identity olarak bağlayarak yukarıda gösterilen manuel pipe kurulumunu
atlamanızı sağlar:
import { createClient } from "@solana/kit";import { keychainSigner } from "@solana/keychain-kit-plugin";const client = await createClient().use(keychainSigner({backend: "privy",appId: process.env.PRIVY_APP_ID!,appSecret: process.env.PRIVY_APP_SECRET!,walletId: process.env.PRIVY_WALLET_ID!}));client.payer; // SolanaTransactionSigner, also a Kit TransactionPartialSignerclient.identity; // same signer instance
Eklenti, Crossmint ve Fordefi native modu (chain ayarlı) dışında,
createKeychainSigner ile aynı arka uç etiketli yapılandırmayı kabul eder. Bu
arka uçlar işlemi sunucu tarafında yeniden yazdığından istemci payer veya
identity olarak görev yapamaz; eklenti bunları hem derleme zamanında hem de
çalışma zamanında reddeder. Yalnızca yönlendirildiği arka uç pakete dahil edilir
(arka uç paketleri dinamik import() ile yüklenir).
Yalnızca tek bir rol ayarlamak ve tek bir istemcide birden fazla arka ucu
birleştirmek için keychainPayer veya keychainIdentity kullanın:
import { createClient } from "@solana/kit";import { keychainIdentity, keychainPayer } from "@solana/keychain-kit-plugin";const client = await createClient().use(keychainPayer({backend: "memory",privateKeyPath: `${process.env.HOME}/.config/solana/id.json`})).use(keychainIdentity({ backend: "turnkey", ...turnkeyConfig }));
Zaten bir SolanaTransactionSigner nesneniz mi var? Bu, geçerli bir Kit
TransactionPartialSigner olduğundan, bunun yerine
@solana/kit-plugin-signer
ile kurabilirsiniz (pnpm add @solana/kit-plugin-signer):
import { createClient } from "@solana/kit";import { signer } from "@solana/kit-plugin-signer";import { createKeychainSigner } from "@solana/keychain";const mySigner = await createKeychainSigner({backend: "vault",...vaultConfig});const client = createClient().use(signer(mySigner));
İptal ve Onaylanmamış Yayınlar
signTransactions, modifyAndSignTransactions, signAndSendTransactions ve
signMessages işlevlerinin tümü ikinci argüman olarak { abortSignal } kabul
eder. İptal etmek beklemeyi durdurur; bir sağlayıcının zaten kabul ettiği işi
geri almaz.
Crossmint ve Fordefi native otomatik modunda, bir hata hiçbir şeyin zincire
ulaşmadığı anlamına gelmez. Sağlayıcı işlemi kabul etmiş olabileceğinde hata
kodu SignerErrorCode.BROADCAST_UNCONFIRMED ("SIGNER_BROADCAST_UNCONFIRMED")
olur. Oluşturma isteği kabul edildiyse context.providerTransactionId ayarlanır
ve context.idempotencyKey mesajdan türetilen anahtarı taşır. Bayt düzeyinde
aynı işlemi yeniden göndermek güvenlidir; yeniden oluşturulmuş bir işlem (örneğin
yeni bir blockhash ile) yeni bir transferdir. @solana/keychain-core içindeki
providerMayHaveAccepted(error) ve providerStatus(error) hatayı sınıflandırmaya
yardımcı olur. Yeniden denemeden önce sağlayıcıyla mutabakat sağlayın.
Arka Uç Yapılandırması
Bellek
keyPair, privateKey, privateKeyString veya privateKeyPath
seçeneklerinden tam olarak birini sağlayın:
import { createMemorySigner } from "@solana/keychain-memory";const signer = await createMemorySigner({privateKeyPath: "/path/to/id.json"});
HashiCorp Vault
import { createVaultSigner } from "@solana/keychain-vault";const signer = createVaultSigner({vaultAddr: "https://vault.example.com:8200",vaultToken: "hvs.xxxxx",keyName: "my-solana-key",publicKey: "base58_public_key"});
AWS KMS
import { createAwsKmsSigner } from "@solana/keychain-aws-kms";const signer = createAwsKmsSigner({keyId: "alias/my-solana-key",publicKey: "base58_public_key",region: "us-east-1" // optional});
GCP KMS
import { createGcpKmsSigner } from "@solana/keychain-gcp-kms";const signer = createGcpKmsSigner({keyName:"projects/my-project/locations/us-east1/keyRings/my-ring/cryptoKeys/my-key/cryptoKeyVersions/1",publicKey: "base58_public_key"});
Privy
import { createPrivySigner } from "@solana/keychain-privy";const signer = await createPrivySigner({appId: "app_id",appSecret: "app_secret",walletId: "wallet_id"});
Turnkey
import { createTurnkeySigner } from "@solana/keychain-turnkey";const signer = createTurnkeySigner({apiPublicKey: "api_public_key",apiPrivateKey: "api_private_key",organizationId: "org_id",privateKeyId: "private_key_id",publicKey: "base58_public_key"});
Fireblocks
import { createFireblocksSigner } from "@solana/keychain-fireblocks";const signer = await createFireblocksSigner({apiKey: "api_key",privateKeyPem: "-----BEGIN RSA PRIVATE KEY-----\n...",vaultAccountId: "0",assetId: "SOL" // or "SOL_TEST" for devnet});
CDP (Coinbase Geliştirici Platformu)
import { createCdpSigner } from "@solana/keychain-cdp";const signer = await createCdpSigner({cdpApiKeyId: "api_key_id",cdpApiKeySecret: "api_key_secret",cdpWalletSecret: "wallet_secret",address: "base58_address",network: "solana" // or "solana-devnet"; required for address lookup tables});
Crossmint
import { createCrossmintSigner } from "@solana/keychain-crossmint";const signer = await createCrossmintSigner({apiKey: "api_key",walletLocator: "wallet_locator"});
Crossmint yalnızca gönderim yapar. API'si onaylanan bir işlemi her zaman
sunucu tarafında yürütür ve gas ücretini karşılar; bu nedenle imzalayıcı yalnızca
signAndSendTransactions() sunar: signTransactions() veya signMessages()
yoktur ve @solana/keychain-kit-plugin ile kurulamaz. Dönen imza, Crossmint'in
zincire ulaştırdığı işlemi tanımlar.
const [signature] = await signer.signAndSendTransactions([transaction]);// or: await signAndSendTransactionMessageWithSigners(transactionMessage);
Dfns
import { createDfnsSigner } from "@solana/keychain-dfns";const signer = await createDfnsSigner({authToken: "auth_token",credId: "cred_id",privateKeyPem: "-----BEGIN EC PRIVATE KEY-----\n...",walletId: "wallet_id"});
Openfort
import { createOpenfortSigner } from "@solana/keychain-openfort";const signer = await createOpenfortSigner({secretKey: "sk_...",walletSecret: "wallet_secret",accountId: "account_id"});
Para
import { createParaSigner } from "@solana/keychain-para";const signer = await createParaSigner({apiKey: "api_key",walletId: "wallet_id"});
Utila
Utila yalnızca işlem imzalar; signMessages() yoktur.
import { createUtilaSigner } from "@solana/keychain-utila";const signer = await createUtilaSigner({serviceAccountEmail: "sa@example.com",serviceAccountPrivateKeyPem: "-----BEGIN PRIVATE KEY-----\n...",vaultId: "vault_id",walletId: "wallet_id",network: "networks/solana-devnet"});
Fordefi
Fordefi'nin, oluşturma sırasında chain ve pushMode ile belirlenen üç imzalama
modu vardır. Her mod yalnızca bir işlem yöntemi sunar ve üçü de mesaj imzalar:
| Mod | Yapılandırma | Tür | Yöntem |
|---|---|---|---|
| Kara kutu | chain ayarsız | FordefiBlackBoxSigner | signTransactions() |
| Native otomatik | chain ayarlı, pushMode belirtilmemiş veya "auto" | FordefiNativeSigner | signAndSendTransactions() |
| Native manuel | chain ayarlı, pushMode: "manual" | FordefiNativeManualSigner | modifyAndSignTransactions() |
API istekleri bir ECDSA P-256 istek imzasıyla doğrulanır: imzalama anahtarını
privateKeyPem olarak sağlayın veya bir requestSigner ileterek anahtarı bir
KMS/HSM içinde tutun.
Native otomatik mod (zincir üstü kullanım için önerilir): chain ayarlayın;
Fordefi işlemi kendisi imzalar ve yayınlar. Fordefi imzalamadan önce blockhash'i
veya ücretleri değiştirebileceğinden imzalayıcı bir Kit
TransactionSendingSigner olur: bunu yukarıda gösterilen kısmi imzalayıcı akışıyla
değil, signAndSendTransactionMessageWithSigners ile kullanın. Native otomatik
mod yalnızca gerekli tek imzalayanın kasa olduğu imzasız bir işlemi kabul eder ve
@solana/keychain-kit-plugin ile kullanılamaz.
import { createFordefiSigner } from "@solana/keychain-fordefi";import { signAndSendTransactionMessageWithSigners } from "@solana/signers";import { readFileSync } from "node:fs";const signer = await createFordefiSigner({accessToken: process.env.FORDEFI_ACCESS_TOKEN!,vaultId: process.env.FORDEFI_VAULT_ID!,publicKey: process.env.FORDEFI_PUBLIC_KEY!, // Solana vault address (base58)privateKeyPem: readFileSync("./secret/private.pem", "utf8"),chain: "solana_devnet", // or "solana_mainnet"fee: { type: "custom", priority_fee: "1000" } // optional});const signature =await signAndSendTransactionMessageWithSigners(transactionMessage);
Native manuel mod: chain ve pushMode: "manual" ayarlayın. Fordefi
mesajı yeniden yazar (güncel blockhash, Compute Budget ücret talimatları) ve
imzalar, ancak yayınlamaz. modifyAndSignTransactions(), Fordefi'nin imzaladığı
ve sizin gönderdiğiniz işlemin yerini alan işlemi döndürür: her zaman dönen
işlemle devam edin. Fordefi ücret ödeyen taraf olmalı ve gerekli diğer tüm
imzalayanlardan önce imzalamalıdır. Yeniden yazma için fark (diff) çıkarılmaz;
bu yüzden yayınlamadan önce sonucu inceleyin.
import { createFordefiSigner } from "@solana/keychain-fordefi";import { readFileSync } from "node:fs";const signer = await createFordefiSigner({accessToken: process.env.FORDEFI_ACCESS_TOKEN!,vaultId: process.env.FORDEFI_VAULT_ID!,publicKey: process.env.FORDEFI_PUBLIC_KEY!,privateKeyPem: readFileSync("./secret/private.pem", "utf8"),chain: "solana_devnet",pushMode: "manual"});const [signedTransaction] = await signer.modifyAndSignTransactions([transaction]);
Kara kutu modu: chain parametresini atlayın. Fordefi ham baytları imzalar ve yayınlamaz; işlemi kendiniz oluşturup gönderirsiniz. Bunu bir Fordefi kara kutu kasasıyla kullanın.
import { createFordefiSigner } from "@solana/keychain-fordefi";import { readFileSync } from "node:fs";const signer = await createFordefiSigner({accessToken: process.env.FORDEFI_ACCESS_TOKEN!,vaultId: process.env.FORDEFI_BB_VAULT_ID!,publicKey: process.env.FORDEFI_BB_PUBLIC_KEY!,privateKeyPem: readFileSync("./secret/private.pem", "utf8")});
İmzalayıcı Yetenekleri
@solana/keychain-core, her Kit imzalayıcı yapısı için bir arayüz tanımlar. Her
biri, eşleşen @solana/signers arayüzüne isAvailable(): Promise<boolean>
ekler:
SolanaTransactionSigner(KitTransactionPartialSigner): sahibi olduğunuz bir işlem için imzalar döndürür.SolanaModifyingSigner(KitTransactionModifyingSigner): işlemi yeniden yazar, imzalar ve yayınlamadan yeni işlemi döndürür.SolanaSendingSigner(KitTransactionSendingSigner): sağlayıcısı üzerinden imzalar ve yayınlar.SolanaMessageSigner(KitMessagePartialSigner): zincir dışı mesajları imzalar. Bu, işlem yapılarından ayrıdır.
SolanaSigner, üç işlem yapısının birleşimidir. Her fabrikanın dönüş türü, ilgili
arka ucun tam yapısını belirtir. Yapılandırma yalnızca çalışma zamanında
bilindiğinde isSolanaTransactionSigner, isSolanaModifyingSigner,
isSolanaSendingSigner veya isSolanaMessageSigner ile daraltın.
signerCapabilities(signer) dördünü birden bildirir.
| Arka uç | Yapı |
|---|---|
| memory, vault, aws-kms, gcp-kms, privy, turnkey, fireblocks, cdp, dfns, para, openfort, fordefi (kara kutu) | SolanaTransactionSigner & SolanaMessageSigner |
| utila | SolanaTransactionSigner (mesaj imzalama yok) |
| fordefi (native manuel) | SolanaModifyingSigner & SolanaMessageSigner |
| fordefi (native otomatik) | SolanaSendingSigner & SolanaMessageSigner |
| crossmint | SolanaSendingSigner (mesaj imzalama yok) |
import {isSolanaSendingSigner,isSolanaTransactionSigner} from "@solana/keychain-core";if (isSolanaSendingSigner(signer)) {await signer.signAndSendTransactions([transaction]);} else if (isSolanaTransactionSigner(signer)) {await signer.signTransactions([transaction]);}
Özel İmzalayıcılar Oluşturma
Arka ucunuzun desteklediği yetenek arayüzlerini uygulayın:
import type {SolanaMessageSigner,SolanaTransactionSigner} from "@solana/keychain-core";import type { Address } from "@solana/addresses";import type {MessagePartialSignerConfig,SignableMessage,TransactionPartialSignerConfig} from "@solana/signers";import type { Transaction } from "@solana/transactions";class MyCustomSigner implements SolanaTransactionSigner, SolanaMessageSigner {constructor(readonly address: Address) {}async isAvailable(): Promise<boolean> {return await myBackend.healthCheck();}async signMessages(messages: readonly SignableMessage[],config?: MessagePartialSignerConfig) {return await myBackend.signMessages(messages, config?.abortSignal);}async signTransactions(transactions: readonly Transaction[],config?: TransactionPartialSignerConfig) {return await myBackend.signTransactions(transactions, config?.abortSignal);}}
Yalnızca arka ucunuzun desteklediklerini uygulayın. Kit, imzalayıcıları hangi yöntemlere sahip olduklarına göre sınıflandırır; bu yüzden yalnızca hata fırlatan bir yöntemi asla eklemeyin.
Ek anahtar yönetimi hizmetlerini entegre etmek için İmzalayıcı Ekleme rehberine bakın.
Is this page helpful?