TypeScript

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 packages
pnpm add @solana/keychain-core # Core interfaces (required for custom signers)
pnpm add @solana/keychain-memory # Local keypair signer
pnpm add @solana/keychain-vault # HashiCorp Vault
pnpm add @solana/keychain-aws-kms # AWS KMS
pnpm add @solana/keychain-gcp-kms # GCP KMS
pnpm add @solana/keychain-privy # Privy
pnpm add @solana/keychain-turnkey # Turnkey
pnpm add @solana/keychain-fireblocks # Fireblocks
pnpm add @solana/keychain-cdp # Coinbase Developer Platform
pnpm add @solana/keychain-crossmint # Crossmint
pnpm add @solana/keychain-dfns # Dfns
pnpm add @solana/keychain-openfort # Openfort
pnpm add @solana/keychain-para # Para
pnpm add @solana/keychain-utila # Utila
pnpm 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.1
const signer = await createKeychainSigner({
backend: "privy",
appId: "your-app-id",
appSecret: "your-app-secret",
walletId: "your-wallet-id"
});
// Sign an already-compiled transaction
const 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 builder
const transaction = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(signer, tx)
// ... set a lifetime and add instructions
);
// Sign with the standard signers API
const 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 TransactionPartialSigner
client.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:

ModYapılandırmaTürYöntem
Kara kutuchain ayarsızFordefiBlackBoxSignersignTransactions()
Native otomatikchain ayarlı, pushMode belirtilmemiş veya "auto"FordefiNativeSignersignAndSendTransactions()
Native manuelchain ayarlı, pushMode: "manual"FordefiNativeManualSignermodifyAndSignTransactions()

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 (Kit TransactionPartialSigner): sahibi olduğunuz bir işlem için imzalar döndürür.
  • SolanaModifyingSigner (Kit TransactionModifyingSigner): işlemi yeniden yazar, imzalar ve yayınlamadan yeni işlemi döndürür.
  • SolanaSendingSigner (Kit TransactionSendingSigner): sağlayıcısı üzerinden imzalar ve yayınlar.
  • SolanaMessageSigner (Kit MessagePartialSigner): 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
utilaSolanaTransactionSigner (mesaj imzalama yok)
fordefi (native manuel)SolanaModifyingSigner & SolanaMessageSigner
fordefi (native otomatik)SolanaSendingSigner & SolanaMessageSigner
crossmintSolanaSendingSigner (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?

© 2026 Solana Vakfı. Tüm hakları saklıdır.