Kora Tam İşlem Akışı

Son Güncelleme: 2025-10-31

Neleri Oluşturacaksınız

Hızlı Başlangıç Kılavuzu'nda Kora RPC'yi nasıl kuracağınızı ve temel çağrıları nasıl yapacağınızı öğrendiniz. Şimdi Kora'nın tüm yeteneklerini gösteren eksiksiz bir gazsız işlem sistemi oluşturacağız. Bu kılavuzun sonunda, aşağıdakileri gerçekleştiren bir işlem akışı uygulamış olacaksınız:

  • Birden fazla transfer talimatı oluşturma (SPL token'ları ve SOL)
  • Ücret karşılama için Kora'dan ödeme talimatları alma
  • Kora gaz ücretlerini yönetirken kullanıcı anahtarlarıyla işlemleri imzalama
  • Tam olarak imzalanmış işlemleri Solana ağına gönderme

Son sonuç, çalışan bir gazsız işlem sistemi olacaktır:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
KORA GASLESS TRANSACTION DEMO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[1/6] Initializing clients
Kora RPC: http://localhost:8080/
Solana RPC: http://127.0.0.1:8899
[2/6] Setting up keypairs
Sender: BYJVBqQ2xV9GECc84FeoPQy2DpgoonZQFQu97MMWTbBc
Destination: C8MC9E6nf9Am1rVqdDedDavm53uCJMiSwarEko1aXmny
Kora signer address: 3Z1Ef7YaxK8oUMoi6exf7wYZjZKWJJsrzJXSt1c3qrDE
[3/6] Creating demonstration instructions
Payment token: 9BgeTKqmFsPVnfYscfM6NvsgmZxei7XfdciShQ6D3bxJ
Token transfer instruction created
SOL transfer instruction created
Memo instruction created
Total: 3 instructions
[4/6] Estimating Kora fee and assembling payment instruction
Fee payer: 3Z1Ef7Ya...
Blockhash: 7HZUaMqV...
Estimate transaction built
Payment instruction received from Kora
[5/6] Creating and signing final transaction (with payment)
Final transaction built with payment
Transaction signed by user
[6/6] Signing transaction with Kora and sending to Solana cluster
Transaction co-signed by Kora
Transaction submitted to network
Awaiting confirmation...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SUCCESS: Transaction confirmed on Solana
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Transaction signature:
41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCE
View on explorer:
https://explorer.solana.com/tx/41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCE?cluster=custom&customUrl=http%3A%2F%2Flocalhost%3A8899

Haydi adım adım oluşturalım!

Ön Koşullar

Bu eğitime başlamadan önce, aşağıdakilere sahip olduğunuzdan emin olun:

Kora İşlem Akışı

Kora, kullanıcılarınızın işlemleri için ücret ödeyici olarak hareket ederek gazsız işlemleri mümkün kılar. Gazsız işlem akışı şu ana adımlardan oluşur:

  1. İşlem Oluşturma - Kullanıcının amaçlanan işlemini oluşturun (transferler, program çağrıları vb.)
  2. Ücret Tahmini - Gerekli ücretleri hesaplamak için bir tahmin işlemi oluşturun
  3. Ödeme Talimatı - Ücret tutarını belirten Kora'dan bir ödeme talimatı alın
  4. Kullanıcı İmzalama - Kullanıcı, ödeme talimatını içeren işlemi imzalar
  5. Kora Ortak İmzalama - Kora ödemeyi doğrular ve ücret ödeyici olarak ortak imza atar
  6. Gönderim - Tam olarak imzalanmış işlemi Solana'ya gönderin

*Not: Kora ödeme gerektirmeyecek şekilde yapılandırılabilir, ancak tam akışı göstermek için ödeme kullanacağız.

Proje Kurulumu

Kora Sunucusu Hususları

  • Token İzin Listesi - kora.toml içinde yapılandırılan tokenler ödeme için kullanılabilir - .env içinde tanımladığınız tokenin kora.toml izin listenize dahil olduğundan emin olun.
  • Program Kısıtlamaları - İşlemler yalnızca beyaz listeye alınmış programlarla etkileşime girebilir. kora.toml dosyasını System Program, Token Program, Compute Unit Program ve Memo programıyla etkileşime izin verecek şekilde önceden ayarladık.

İstemci Kurulumu

Bu kılavuz, Hızlı Başlangıç bölümünü tamamladığınızı ve demo projesini kurduğunuzu varsayar. Eğer tamamlamadıysanız, lütfen önce onu tamamlayın.

Demo istemci dizininize gidin:

cd kora/examples/getting-started/demo/client

Not: Demo dosyaları tam bir geliştirme kurulumu gerektirdiğinden GitHub deposunda bulunmaktadır.

Uygulama

Demoyu çalıştırmaya başlamadan önce, tam demo uygulamasını adım adım inceleyelim:

İçe Aktarmalar ve Yapılandırma

Demomuz gerekli içe aktarmalar ve yapılandırma ile başlar:

import { KoraClient } from "@solana/kora";
import {
createKeyPairSignerFromBytes,
getBase58Encoder,
createNoopSigner,
address,
getBase64EncodedWireTransaction,
partiallySignTransactionMessageWithSigners,
Blockhash,
Base64EncodedWireTransaction,
partiallySignTransaction,
TransactionVersion,
Instruction,
KeyPairSigner,
Rpc,
SolanaRpcApi,
createSolanaRpc,
createSolanaRpcSubscriptions,
pipe,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
MicroLamports,
appendTransactionMessageInstructions
} from "@solana/kit";
import { getAddMemoInstruction } from "@solana-program/memo";
import { createRecentSignatureConfirmationPromiseFactory } from "@solana/transaction-confirmation";
import {
updateOrAppendSetComputeUnitLimitInstruction,
updateOrAppendSetComputeUnitPriceInstruction
} from "@solana-program/compute-budget";
import dotenv from "dotenv";
import path from "path";
dotenv.config({ path: path.join(process.cwd(), "..", ".env") });
const CONFIG = {
computeUnitLimit: 200_000,
computeUnitPrice: 1_000_000n as MicroLamports,
solanaRpcUrl: "http://127.0.0.1:8899",
solanaWsUrl: "ws://127.0.0.1:8900",
koraRpcUrl: "http://localhost:8080/"
};

Kora SDK'dan Kora Client'ı ve işlem oluşturma için Solana Kit kütüphanesinden birkaç tip/yardımcıyı içe aktarıyoruz.

Ayrıca şunları tanımlayan global bir yapılandırma nesnesi oluşturuyoruz:

  • Compute Budget - İşlem önceliklendirmesi için birimler ve fiyat
  • Transaction Version - Adres arama tablosu desteği için V0 kullanımı
  • RPC Endpoints - Yerel Solana ve Kora RPC sunucuları

Şimdilik bu varsayılan değerleri bırakın--demodan sonra, farklı değerlerle denemeler yaparak bunların işlem akışını nasıl etkilediğini görebilirsiniz.

Yardımcı Fonksiyonlar

Demo, ortam değişkenlerinden keypair yüklemek için bir yardımcı fonksiyon içerir:

async function getEnvKeyPair(envKey: string) {
if (!process.env[envKey]) {
throw new Error(`Environment variable ${envKey} is not set`);
}
const base58Encoder = getBase58Encoder();
const b58SecretEncoded = base58Encoder.encode(process.env[envKey]);
return await createKeyPairSignerFromBytes(b58SecretEncoded);
}

Bu fonksiyon:

  • Ortam değişkenlerinden base58 kodlu özel anahtarları okur
  • Özel anahtar dizesini U8 bayt dizisine kodlar
  • Bunları keypair imzalayıcı nesnelerine dönüştürür

Adım 1: İstemcileri Başlatma

İlk olarak, hem Kora hem de Solana ile bağlantımızı kuruyoruz:

async function initializeClients() {
console.log("\n[1/6] Initializing clients");
console.log(" → Kora RPC:", CONFIG.koraRpcUrl);
console.log(" → Solana RPC:", CONFIG.solanaRpcUrl);
const client = new KoraClient({
rpcUrl: CONFIG.koraRpcUrl
// apiKey: process.env.KORA_API_KEY, // Uncomment if authentication is enabled
// hmacSecret: process.env.KORA_HMAC_SECRET, // Uncomment if HMAC is enabled
});
const rpc = createSolanaRpc(CONFIG.solanaRpcUrl);
const rpcSubscriptions = createSolanaRpcSubscriptions(CONFIG.solanaWsUrl);
const confirmTransaction = createRecentSignatureConfirmationPromiseFactory({
rpc,
rpcSubscriptions
});
return { client, rpc, confirmTransaction };
}

Bu fonksiyon:

  • Kora RPC URL'mizi ileterek bir Kora istemci örneği oluşturur.
  • Abonelik desteğiyle bir Solana RPC bağlantısı kurar (bunu Solana kümesine işlem göndermek ve onaylamak için kullanacağız)
  • İşlem onaylama yardımcı programlarını ayarlar

Not: kora.toml dosyamız herhangi bir kimlik doğrulama içermediğinden, bir api anahtarı veya hmac gizli anahtarı iletmemize gerek yok, ancak referans olması için kodun yorum satırı halini bıraktık.

Adım 2: Anahtarları Ayarlama

Gerekli keypair'leri ortam değişkenlerinden yükleyin ve Kora imzalayıcı adresini alın:

async function setupKeys(client: KoraClient) {
console.log("\n[2/6] Setting up keypairs");
const testSenderKeypair = await getEnvKeyPair("TEST_SENDER_KEYPAIR");
const destinationKeypair = await getEnvKeyPair("DESTINATION_KEYPAIR");
const { signer_address } = await client.getPayerSigner();
console.log(" → Sender:", testSenderKeypair.address);
console.log(" → Destination:", destinationKeypair.address);
console.log(" → Kora signer address:", signer_address);
return { testSenderKeypair, destinationKeypair, signer_address };
}

Burada keypair'leri ortam değişkenlerinden yüklemek için getEnvKeyPair fonksiyonumuzu kullanıyoruz. Keypair'ler şunları temsil eder:

  • Gönderen - İşlemi başlatan ve ödeme tokenında Kora düğümüne ödeme yapmaktan sorumlu kullanıcı.
  • Hedef - Transferlerin alıcısı.

Ayrıca Kora imzalayıcı adresini almak için getPayerSigner metodunu kullanıyoruz. Bu, işlemi Kora'nın imzasıyla imzalamak için kullanılacak adrestir. Kora düğümünden geçerli bir imzalayıcı almamız ve bunu işlem akışımız boyunca tutarlı bir şekilde kullanmamız önemlidir.

Adım 3: Demo Talimatlarını Oluşturma

Ardından, testSender'ımızın ağa göndermek istediği bir dizi talimat oluşturuyoruz. Bu talimatlardan bazılarını oluşturmak için Kora İstemcisini, diğerlerini ise her ikisinin nasıl kullanılacağını göstermek için @solana/programs kütüphanesini kullanacağız.

async function createInstructions(
client: KoraClient,
testSenderKeypair: KeyPairSigner,
destinationKeypair: KeyPairSigner
) {
console.log("\n[3/6] Creating demonstration instructions");
const paymentToken = await client
.getConfig()
.then((config) => config.validation_config.allowed_spl_paid_tokens[0]);
console.log(" → Payment token:", paymentToken);
// Create token transfer (will initialize ATA if needed)
const transferTokens = await client.transferTransaction({
amount: 10_000_000, // 10 USDC (6 decimals)
token: paymentToken,
source: testSenderKeypair.address,
destination: destinationKeypair.address
});
console.log(" ✓ Token transfer instruction created");
// Create SOL transfer
const transferSol = await client.transferTransaction({
amount: 10_000_000, // 0.01 SOL (9 decimals)
token: "11111111111111111111111111111111", // SOL mint address
source: testSenderKeypair.address,
destination: destinationKeypair.address
});
console.log(" ✓ SOL transfer instruction created");
// Add memo instruction
const memoInstruction = getAddMemoInstruction({
memo: "Hello, Kora!"
});
console.log(" ✓ Memo instruction created");
const instructions = [
...transferTokens.instructions,
...transferSol.instructions,
memoInstruction
];
console.log(` → Total: ${instructions.length} instructions`);
return { instructions, paymentToken };
}

Burada oldukça fazla şey oluyor, bu yüzden adım adım inceleyelim:

  1. Kora'nın yapılandırmasından ödeme tokenını almak için getConfig kullanıyoruz. Sunucumuzu kurduğumuz için, izin listesinde yalnızca bir token olduğunu biliyoruz, bu nedenle ona doğrudan 1. konumdan (config.validation_config.allowed_spl_paid_tokens[0]) erişebiliriz.
  2. Kora İstemcisinin transferTransaction metodunu kullanarak bir token transfer talimatı oluşturuyoruz. Bu, token transfer talimatı oluşturmayı kolaylaştıran bir yardımcı metoddur.
  3. Kora İstemcisinin transferTransaction metodunu kullanarak bir SOL transfer talimatı oluşturuyoruz. Bunu burada, Kora İstemcisini kullanarak SOL transferlerinin nasıl oluşturulacağını göstermek için ekliyoruz--SPL token transferi yerine SOL transfer etmek istediğimizi belirtmek için Native SOL mint 11111111111111111111111111111111 kullandığımızı unutmayın.
  4. @solana/programs kütüphanesinin getAddMemoInstruction fonksiyonunu kullanarak bir memo talimatı ekliyoruz.
  5. Tüm talimatları tek bir dizi halinde birleştiriyoruz. Bu diziyi bir sonraki adımda tahmin işlemimizi oluşturmak için kullanacağız.

Adım 4: Kora'dan Ödeme Talimatı Alın

İşlemi yürütmek için gereken ücretler karşılığında Kora'ya bir ödeme talimatı oluşturacak bir işlem oluşturun.

async function getPaymentInstruction(
client: KoraClient,
instructions: Instruction[],
testSenderKeypair: KeyPairSigner,
paymentToken: string
): Promise<{ paymentInstruction: Instruction }> {
console.log("\n[4/6] Estimating Kora fee and assembling payment instruction");
const { signer_address } = await client.getPayerSigner();
const noopSigner = createNoopSigner(address(signer_address));
const latestBlockhash = await client.getBlockhash();
console.log(" → Fee payer:", signer_address.slice(0, 8) + "...");
console.log(" → Blockhash:", latestBlockhash.blockhash.slice(0, 8) + "...");
// Create estimate transaction to get payment instruction
const estimateTransaction = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(noopSigner, tx),
(tx) =>
setTransactionMessageLifetimeUsingBlockhash(
{
blockhash: latestBlockhash.blockhash as Blockhash,
lastValidBlockHeight: 0n
},
tx
),
(tx) => appendTransactionMessageInstructions(instructions, tx),
(tx) =>
updateOrAppendSetComputeUnitPriceInstruction(CONFIG.computeUnitPrice, tx),
(tx) =>
updateOrAppendSetComputeUnitLimitInstruction(CONFIG.computeUnitLimit, tx)
);
const signedEstimateTransaction =
await partiallySignTransactionMessageWithSigners(estimateTransaction);
const base64EncodedWireTransaction = getBase64EncodedWireTransaction(
signedEstimateTransaction
);
console.log(" ✓ Estimate transaction built");
// Get payment instruction from Kora
const paymentInstruction = await client.getPaymentInstruction({
transaction: base64EncodedWireTransaction,
fee_token: paymentToken,
source_wallet: testSenderKeypair.address
});
console.log(" ✓ Payment instruction received from Kora");
return { paymentInstruction: paymentInstruction.payment_instruction };
}

Kora SDK'sı, işlem için gereken tam ücretleri hesaplayacak ve bir ödeme transfer talimatı oluşturacak getPaymentInstruction yardımcı metoduna sahiptir. İşte bunu nasıl kullandığımız:

  1. İlk olarak, istediğimiz talimatları içeren bir estimateTransaction oluşturuyoruz--bu işlem, işlem için gereken ücretleri tahmin etmek üzere Kora sunucusunda simüle edilecektir.
  2. Daha sonra, base64 kodlu bir wire dizesi elde etmek için işlemi kısmen imzalıyoruz.
  3. Base64 kodlu wire işlemimizi, ödeme tokeni ve ödeme kaynağı ile birlikte getPaymentInstruction metoduna iletiyoruz. Bu, işlemimize ekleyebileceğimiz bir Instruction nesnesi döndürecektir.

Buradaki temel kavramlar:

  • Geçerli Blockhash - İşlemimiz için geçerli bir blockhash elde etmek üzere getBlockhash metodunu kullanıyoruz. Bu, işlemi sunucuda simüle edeceği için işlem tahmininde bulunmak için gereklidir.
  • Noop İmzalayıcı - Kora imzalamadan önce işlemler oluşturulurken kullanılan yer tutucu imzalayıcı. Bu, Kora'nın imzasına sahip olmadan önce işlemimizde bir ücret ödeyicisi belirtmemize olanak tanır. Noop İmzalayıcılar hakkında daha fazla bilgi için Solana Kit Belgeleri'ne bakın.
  • Kısmi İmzalama - İşlemimizi base64 kodlu bir wire dizesi olarak elde etmek için (işlemi Kora RPC üzerinden göndermek için buna ihtiyacımız var), işlemi kısmen imzalamamız gerekir. Kısmi İmzalayıcılar hakkında daha fazla bilgi için Solana Kit Belgeleri'ne bakın.

Adım 5: Son İşlemi Oluşturma ve İmzalama

Artık ödeme talimatımıza sahip olduğumuza göre, orijinal talimatlarımızı ve ödeme talimatını içeren son bir işlem oluşturabiliriz.

async function getFinalTransaction(
client: KoraClient,
paymentInstruction: Instruction,
testSenderKeypair: KeyPairSigner,
instructions: Instruction[],
signer_address: string
): Promise<Base64EncodedWireTransaction> {
console.log("\n[5/6] Creating and signing final transaction (with payment)");
const noopSigner = createNoopSigner(address(signer_address));
// Build final transaction with payment instruction
const newBlockhash = await client.getBlockhash();
const fullTransaction = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(noopSigner, tx),
(tx) =>
setTransactionMessageLifetimeUsingBlockhash(
{
blockhash: newBlockhash.blockhash as Blockhash,
lastValidBlockHeight: 0n
},
tx
),
(tx) =>
appendTransactionMessageInstructions(
[...instructions, paymentInstruction],
tx
),
(tx) =>
updateOrAppendSetComputeUnitPriceInstruction(CONFIG.computeUnitPrice, tx),
(tx) =>
updateOrAppendSetComputeUnitLimitInstruction(CONFIG.computeUnitLimit, tx)
);
console.log(" ✓ Final transaction built with payment");
// Sign with user keypair
const signedFullTransaction =
await partiallySignTransactionMessageWithSigners(fullTransaction);
const userSignedTransaction = await partiallySignTransaction(
[testSenderKeypair.keyPair],
signedFullTransaction
);
const base64EncodedWireFullTransaction = getBase64EncodedWireTransaction(
userSignedTransaction
);
console.log(" ✓ Transaction signed by user");
return base64EncodedWireFullTransaction;
}

İşlemimizi bir araya getirmek için aynı pipe fonksiyonunu kullanıyoruz. Son işlemimiz şunları içerir:

  • Orijinal talimatlarımız
  • Ödeme talimatı
  • Taze bir blockhash
  • Tahmin işlemini oluşturmak için daha önce kullanılan aynı noop imzalayıcı

Ardından, işlemin base64 kodlu wire string'ini almak için aynı partiallySignTransactionMessageWithSigners fonksiyonunu çağırıyoruz. Ancak bu sefer, işlemi testSenderKeypair ile imzalamak için partiallySignTransaction komutunu da çalıştırıyoruz. Kora düğümümüz ağ ücretlerini ödese de, testSender'mızın token ödemesini ve oluşturduğumuz diğer transfer talimatlarını yetkilendirmek için yine de imzalaması gerekir. Ödeme gerektirmeyen Kora düğümleri için belirli talimatlar bu imzalama adımını gerektirmeyebilir. Son olarak, işlemin base64 kodlu wire string'ini döndürüyoruz.

Adım 6: İşlemi Gönderme

Son olarak, tamamen imzalanmış bir işlemi ağa gönderebilmemiz için Kora düğümünün işlemi imzalamasını sağlamamız gerekiyor. Bunu, Kora istemcisi üzerinde signTransaction metodunu çağırarak yapıyoruz.

async function submitTransaction(
client: KoraClient,
rpc: Rpc<SolanaRpcApi>,
confirmTransaction: ReturnType<
typeof createRecentSignatureConfirmationPromiseFactory
>,
signedTransaction: Base64EncodedWireTransaction,
signer_address: string
) {
console.log(
"\n[6/6] Signing transaction with Kora and sending to Solana cluster"
);
// Get Kora's signature
const { signed_transaction } = await client.signTransaction({
transaction: signedTransaction,
signer_key: signer_address
});
console.log(" ✓ Transaction co-signed by Kora");
// Submit to Solana network
const signature = await rpc
.sendTransaction(signed_transaction as Base64EncodedWireTransaction, {
encoding: "base64"
})
.send();
console.log(" ✓ Transaction submitted to network");
console.log(" ⏳ Awaiting confirmation...");
await confirmTransaction({
commitment: "confirmed",
signature,
abortSignal: new AbortController().signal
});
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.log("SUCCESS: Transaction confirmed on Solana");
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.log("\nTransaction signature:");
console.log(signature);
return signature;
}

Burada üç şey yapıyoruz:

  1. Kora düğümünün işlemi imzalamasını sağlamak için Kora istemcisi üzerinde signTransaction metodunu çağırıyoruz. Düğüm, ödemenin yeterli olduğundan emin olmak için işlemi inceleyecek ve ardından işlemi imzalayacaktır. Not: bazı Kora düğümleri ödeme gerektirmeyen signTransaction özelliğini etkinleştirebilir. Düğümünüzün yapılandırmasını kontrol etmek için getConfig() komutunu çalıştırabilirsiniz.
  2. Tamamen imzalanmış işlemi Solana RPC istemcisini kullanarak Solana ağına gönderiyoruz.
  3. İşlemin ağda onaylanmasını bekliyoruz.

Ana Orkestrasyon Fonksiyonu

Ana fonksiyon her şeyi bir araya getirir ve fonksiyonlarımızın her birini sırayla çağırır:

async function main() {
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.log("KORA GASLESS TRANSACTION DEMO");
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
try {
// Step 1: Initialize clients
const { client, rpc, confirmTransaction } = await initializeClients();
// Step 2: Setup keys
const { testSenderKeypair, destinationKeypair, signer_address } =
await setupKeys(client);
// Step 3: Create demo instructions
const { instructions, paymentToken } = await createInstructions(
client,
testSenderKeypair,
destinationKeypair
);
// Step 4: Get payment instruction from Kora
const { paymentInstruction } = await getPaymentInstruction(
client,
instructions,
testSenderKeypair,
paymentToken
);
// Step 5: Create and partially sign final transaction
const finalSignedTransaction = await getFinalTransaction(
client,
paymentInstruction,
testSenderKeypair,
instructions,
signer_address
);
// Step 6: Get Kora's signature and submit to Solana cluster
await submitTransaction(
client,
rpc,
confirmTransaction,
finalSignedTransaction,
signer_address
);
} catch (error) {
console.error("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.error("ERROR: Demo failed");
console.error("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.error("\nDetails:", error);
process.exit(1);
}
}

Tam Demo'yu Çalıştırma

Eksiksiz gassiz işlem demosunu çalıştırmak için:

1. Ön Koşulları Sağlayın

Üç terminal penceresi açın:

  1. Yerel test validator'ünüzü başlatın:
solana-test-validator -r
  1. Kora RPC sunucunuzu başlatın (examples/getting-started/demo/server dizininden):
kora rpc start --signers-config signers.toml
  1. Ortamınızı başlatın (examples/getting-started/demo/client dizininden):
pnpm init-env

2. Demo'yu Çalıştırın

# From the client directory
pnpm full-demo

3. Beklenen Çıktı

Sonunda başarılı bir işlemle birlikte adım adım yürütmeyi görmelisiniz. İşlem şunları yapacaktır:

  • Gönderenden hedefe token transfer eder
  • Gönderenden hedefe SOL transfer eder
  • "Hello, Kora!" not mesajını içerir
  • Yapılandırdığınız SPL token'ı ile Kora düğüm operatörüne ücretleri öder
  • İşlem gas ücretlerini Kora düğüm operatörü tarafından ödenir

Özet: Akışı Anlamak

Bu gösterimde neler olduğunu gözden geçirelim:

  1. Kullanıcı Amacı - Kullanıcı, yürütmek istediği çeşitli talimatları içeren bir işlem oluşturdu.
  2. Ücret Tahmini - Kora, işlem maliyetini kullanıcının tercih ettiği token cinsinden hesapladı ve bir ödeme talimatı oluşturdu.
  3. İşlem Oluşturma - Kullanıcı, kendi amaçladığı talimatları ve Kora ödeme talimatını içeren nihai bir işlem oluşturdu.
  4. İşlem İmzalama - Kullanıcı, işlemi kendi keypair'i ile kısmi olarak imzaladı ve ödemenin yeterli olduğunu doğruladıktan sonra imzalanması için Kora düğümüne gönderdi.
  5. Atomik Yürütme - Kullanıcı işlemi Solana'ya gönderir ve her şey tek bir işlemde gerçekleşir:
    • Kullanıcının amaçladığı transferler yürütülür
    • Ücretler için ödeme Kora'ya transfer edilir
    • Kora, Solana ağ ücretlerini öder ve işlemi imzalar

Ve böylece, kullanıcıların gas ücretlerini ödemek için SOL tutmalarına gerek kalmaz--zaten ellerinde bulunan token'larla her şeyin ödemesini yapabilirler!

Sorun Giderme

Yaygın Sorunlar

İşlem Doğrulaması Başarısız Oluyor

  • Tüm programların kora.toml içinde beyaz listeye alındığını doğrulayın
  • Token mint'lerinin allowed_spl_paid_tokens içinde olduğunu kontrol edin
  • İşlemin max_allowed_lamports değerini aşmadığından emin olun

Ödeme Talimatı Oluşturma Başarısız Oluyor

  • Tahmin işleminin simülasyon için taze bir blockhash'e sahip olduğunu onaylayın
  • Kora'nın ödeme adresinin başlatılmış ATA'lara sahip olduğunu doğrulayın
  • Ödeme token'ının düzgün şekilde yapılandırıldığını kontrol edin

İmza Doğrulaması Başarısız Oluyor

  • Tüm gerekli imzalayanların dahil edildiğinden emin olun (Kora ve token ödemeleri veya işleminize dahil edilen diğer talimatlar için gerekli olan imzalayanlar)
  • İşlemin imzalandıktan sonra değiştirilmediğini doğrulayın
  • Keypair'lerin doğru şekilde yüklendiğini kontrol edin

Tamamlama

Tebrikler! Kora ile eksiksiz bir gazsız işlem akışını başarıyla uyguladınız.

Kora, kullanıcılara gas ücretleri veya SOL tutma konusunda asla endişelenmelerine gerek kalmayan kusursuz bir Web3 deneyimi sunmayı mümkün kılar. İster bir NeoBank, oyun platformu veya likit staking platformu oluşturuyor olun, Kora'nın gazsız işlemleri kullanıcı benimsenmesinin önündeki önemli bir engeli ortadan kaldırır.

İpucu: Daha basit bir entegrasyon için Kit Client Kılavuzu'na göz atın. createKitKoraClient() API, blockhash yönetimi, ücret tahmini, ödeme talimatı enjeksiyonu ve işlem gönderimini otomatik olarak yönetir — bu kılavuzda gösterilen manuel adımları birkaç satır koda indirger.

Ek Kaynaklar

Is this page helpful?

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın