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:41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCEView 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 Hızlı Başlangıç Kılavuzu'nu tamamladınız - hızlı başlangıç kılavuzuyla aynı test ortamını kullanacağız.
- Node.js (LTS veya sonrası)
- Solana CLI v2.2.x veya daha yeni
- Solana işlemleri ve SPL token'ları hakkında bilgi sahibi olmak
- Yapılandırılmış imzalayıcılarla çalışan bir Kora RPC sunucusu (talimatlar için Hızlı Başlangıç Kılavuzu'na bakın)
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:
- İşlem Oluşturma - Kullanıcının amaçlanan işlemini oluşturun (transferler, program çağrıları vb.)
- Ücret Tahmini - Gerekli ücretleri hesaplamak için bir tahmin işlemi oluşturun
- Ödeme Talimatı - Ücret tutarını belirten Kora'dan bir ödeme talimatı alın
- Kullanıcı İmzalama - Kullanıcı, ödeme talimatını içeren işlemi imzalar
- Kora Ortak İmzalama - Kora ödemeyi doğrular ve ücret ödeyici olarak ortak imza atar
- 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.tomliçinde yapılandırılan tokenler ödeme için kullanılabilir -.enviç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 transferconst transferSol = await client.transferTransaction({amount: 10_000_000, // 0.01 SOL (9 decimals)token: "11111111111111111111111111111111", // SOL mint addresssource: testSenderKeypair.address,destination: destinationKeypair.address});console.log(" ✓ SOL transfer instruction created");// Add memo instructionconst 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:
- Kora'nın yapılandırmasından ödeme tokenını almak için
getConfigkullanı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. - Kora İstemcisinin
transferTransactionmetodunu kullanarak bir token transfer talimatı oluşturuyoruz. Bu, token transfer talimatı oluşturmayı kolaylaştıran bir yardımcı metoddur. - Kora İstemcisinin
transferTransactionmetodunu 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 mint11111111111111111111111111111111kullandığımızı unutmayın. - @solana/programs kütüphanesinin
getAddMemoInstructionfonksiyonunu kullanarak bir memo talimatı ekliyoruz. - 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 instructionconst 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 Koraconst 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:
- İlk olarak, istediğimiz talimatları içeren bir
estimateTransactionoluşturuyoruz--bu işlem, işlem için gereken ücretleri tahmin etmek üzere Kora sunucusunda simüle edilecektir. - Daha sonra, base64 kodlu bir wire dizesi elde etmek için işlemi kısmen imzalıyoruz.
- Base64 kodlu wire işlemimizi, ödeme tokeni ve ödeme kaynağı ile birlikte
getPaymentInstructionmetoduna iletiyoruz. Bu, işlemimize ekleyebileceğimiz birInstructionnesnesi döndürecektir.
Buradaki temel kavramlar:
- Geçerli Blockhash - İşlemimiz için geçerli bir blockhash elde etmek üzere
getBlockhashmetodunu 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 instructionconst 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 keypairconst 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 signatureconst { signed_transaction } = await client.signTransaction({transaction: signedTransaction,signer_key: signer_address});console.log(" ✓ Transaction co-signed by Kora");// Submit to Solana networkconst 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:
- Kora düğümünün işlemi imzalamasını sağlamak için Kora istemcisi üzerinde
signTransactionmetodunu ç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 gerektirmeyensignTransactionözelliğini etkinleştirebilir. Düğümünüzün yapılandırmasını kontrol etmek içingetConfig()komutunu çalıştırabilirsiniz. - Tamamen imzalanmış işlemi Solana RPC istemcisini kullanarak Solana ağına gönderiyoruz.
- İş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 clientsconst { client, rpc, confirmTransaction } = await initializeClients();// Step 2: Setup keysconst { testSenderKeypair, destinationKeypair, signer_address } =await setupKeys(client);// Step 3: Create demo instructionsconst { instructions, paymentToken } = await createInstructions(client,testSenderKeypair,destinationKeypair);// Step 4: Get payment instruction from Koraconst { paymentInstruction } = await getPaymentInstruction(client,instructions,testSenderKeypair,paymentToken);// Step 5: Create and partially sign final transactionconst finalSignedTransaction = await getFinalTransaction(client,paymentInstruction,testSenderKeypair,instructions,signer_address);// Step 6: Get Kora's signature and submit to Solana clusterawait 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:
- Yerel test validator'ünüzü başlatın:
solana-test-validator -r
- Kora RPC sunucunuzu başlatın (examples/getting-started/demo/server dizininden):
kora rpc start --signers-config signers.toml
- 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 directorypnpm 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:
- Kullanıcı Amacı - Kullanıcı, yürütmek istediği çeşitli talimatları içeren bir işlem oluşturdu.
- Ücret Tahmini - Kora, işlem maliyetini kullanıcının tercih ettiği token cinsinden hesapladı ve bir ödeme talimatı oluşturdu.
- İşlem Oluşturma - Kullanıcı, kendi amaçladığı talimatları ve Kora ödeme talimatını içeren nihai bir işlem oluşturdu.
- İş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.
- 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.tomliçinde beyaz listeye alındığını doğrulayın - Token mint'lerinin
allowed_spl_paid_tokensiçinde olduğunu kontrol edin - İşlemin
max_allowed_lamportsdeğ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
- Yardıma mı ihtiyacınız var?
Koraetiketi ile Solana Stack Exchange üzerinde soru sorun - Kora Yapılandırma Kılavuzu - Detaylı yapılandırma seçenekleri
- İmzalayanlar Kılavuzu - Farklı imzalayan türlerini yönetme
- API Referansı - Eksiksiz RPC metod dokümantasyonu
- GitHub Deposu - Kaynak kodu ve örnekler
- Kora SDK - Kora RPC uç noktaları ile etkileşim için SDK
Is this page helpful?