Πλήρης Ροή Συναλλαγών Kora

Τελευταία Ενημέρωση: 2025-10-31

Τι Θα Δημιουργήσετε

Στον Οδηγό Γρήγορης Εκκίνησης, μάθατε πώς να ρυθμίσετε το Kora RPC και να κάνετε βασικές κλήσεις. Τώρα θα δημιουργήσουμε ένα πλήρες σύστημα συναλλαγών χωρίς τέλη gas που επιδεικνύει τις πλήρεις δυνατότητες του Kora. Μέχρι το τέλος αυτού του οδηγού, θα έχετε υλοποιήσει μια ροή συναλλαγών που:

  • Δημιουργεί πολλαπλές οδηγίες μεταφοράς (SPL tokens και SOL)
  • Λαμβάνει οδηγίες πληρωμής από το Kora για την κάλυψη των τελών
  • Υπογράφει συναλλαγές με κλειδιά χρήστη ενώ το Kora χειρίζεται τα τέλη gas
  • Υποβάλλει πλήρως υπογεγραμμένες συναλλαγές στο δίκτυο Solana

Το τελικό αποτέλεσμα θα είναι ένα λειτουργικό σύστημα συναλλαγών χωρίς τέλη gas:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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

Ας το δημιουργήσουμε βήμα προς βήμα!

Προαπαιτούμενα

Πριν ξεκινήσετε αυτό το σεμινάριο, βεβαιωθείτε ότι έχετε:

Ροή Συναλλαγών Kora

Το Kora επιτρέπει συναλλαγές χωρίς τέλη gas λειτουργώντας ως πληρωτής τελών για τις συναλλαγές των χρηστών σας. Η ροή συναλλαγών χωρίς τέλη gas αποτελείται από τα ακόλουθα κύρια βήματα:

  1. Δημιουργία Συναλλαγής - Δημιουργήστε την επιθυμητή συναλλαγή του χρήστη (μεταφορές, κλήσεις προγράμματος, κ.λπ.)
  2. Εκτίμηση Τελών - Δημιουργήστε μια συναλλαγή εκτίμησης για να υπολογίσετε τα απαιτούμενα τέλη
  3. Οδηγία Πληρωμής - Λάβετε μια οδηγία πληρωμής από το Kora που καθορίζει το ποσό των τελών
  4. Υπογραφή Χρήστη - Ο χρήστης υπογράφει τη συναλλαγή συμπεριλαμβανομένης της οδηγίας πληρωμής
  5. Συν-υπογραφή Kora - Το Kora επικυρώνει την πληρωμή και συν-υπογράφει ως πληρωτής τελών
  6. Υποβολή - Υποβάλετε την πλήρως υπογεγραμμένη συναλλαγή στο Solana

*Σημείωση: Το Kora μπορεί να ρυθμιστεί ώστε να μην απαιτεί πληρωμή, αλλά θα το χρησιμοποιήσουμε για να επιδείξουμε την πλήρη ροή.

Ρύθμιση Έργου

Παράμετροι Διακομιστή Kora

  • Λίστα Επιτρεπόμενων Tokens - Μόνο τα tokens που έχουν ρυθμιστεί στο kora.toml μπορούν να χρησιμοποιηθούν για πληρωμή - βεβαιωθείτε ότι το token που ορίζεται στο .env περιλαμβάνεται στη kora.toml λίστα επιτρεπόμενων.
  • Περιορισμοί Προγραμμάτων - Οι συναλλαγές μπορούν να αλληλεπιδρούν μόνο με προγράμματα που βρίσκονται στη λευκή λίστα. Έχουμε προκαθορίσει το kora.toml ώστε να επιτρέπεται η αλληλεπίδραση με το System Program, το Token Program, το Compute Unit Program και το πρόγραμμα Memo.

Ρύθμιση Πελάτη

Αυτός ο οδηγός προϋποθέτει ότι έχετε ολοκληρώσει την Γρήγορη Έναρξη και έχετε ρυθμίσει το demo έργο. Εάν όχι, παρακαλούμε ολοκληρώστε πρώτα αυτό.

Μεταβείτε στον κατάλογο του demo πελάτη σας:

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

Σημείωση: Τα αρχεία demo βρίσκονται στο αποθετήριο GitHub καθώς απαιτούν πλήρη περιβάλλον ανάπτυξης.

Υλοποίηση

Πριν ξεκινήσουμε το demo, ας εξετάσουμε την πλήρη υλοποίηση του demo βήμα προς βήμα:

Εισαγωγές και Διαμόρφωση

Το demo μας ξεκινά με τις απαραίτητες εισαγωγές και διαμόρφωση:

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 Client από το Kora SDK και μερικούς τύπους/βοηθητικές συναρτήσεις από τη βιβλιοθήκη Solana Kit για τη δημιουργία συναλλαγών.

Επίσης δημιουργούμε ένα καθολικό αντικείμενο διαμόρφωσης που ορίζει:

  • Προϋπολογισμός Υπολογισμού - Μονάδες και τιμή για την ιεράρχηση προτεραιότητας συναλλαγών
  • Έκδοση Συναλλαγής - Χρήση V0 για υποστήριξη πίνακα αναζήτησης διευθύνσεων
  • Τελικά Σημεία RPC - Τοπικοί διακομιστές RPC Solana και Kora

Αφήστε αυτές τις προεπιλεγμένες τιμές προς το παρόν--μετά το demo, μπορείτε να πειραματιστείτε με διαφορετικές τιμές για να δείτε πώς επηρεάζουν τη ροή των συναλλαγών.

Βοηθητικές Συναρτήσεις

Η επίδειξη περιλαμβάνει μια βοηθητική συνάρτηση για τη φόρτωση ζευγών κλειδιών από μεταβλητές περιβάλλοντος:

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);
}

Αυτή η συνάρτηση:

  • Διαβάζει ιδιωτικά κλειδιά κωδικοποιημένα σε base58 από μεταβλητές περιβάλλοντος
  • Κωδικοποιεί το αλφαριθμητικό του ιδιωτικού κλειδιού σε έναν πίνακα byte U8
  • Τα μετατρέπει σε αντικείμενα υπογράφοντος ζεύγους κλειδιών

Βήμα 1: Αρχικοποίηση Πελατών

Πρώτα, ρυθμίζουμε τη σύνδεσή μας τόσο με το Kora όσο και με το Solana:

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 };
}

Αυτή η συνάρτηση:

  • Δημιουργεί μια παρουσία πελάτη Kora περνώντας το URL του Kora RPC μας.
  • Δημιουργεί μια σύνδεση Solana RPC με υποστήριξη εγγραφής (θα τη χρησιμοποιήσουμε για την αποστολή και επιβεβαίωση συναλλαγών στο σύμπλεγμα Solana)
  • Ρυθμίζει τα εργαλεία επιβεβαίωσης συναλλαγών

Σημείωση: Το αρχείο μας kora.toml δεν περιλαμβάνει κανέναν έλεγχο ταυτότητας, επομένως δεν χρειάζεται να περάσουμε api key ή hmac secret, αλλά έχουμε αφήσει τον κώδικα σε σχόλια για αναφορά.

Βήμα 2: Ρύθμιση Κλειδιών

Φορτώστε τα απαιτούμενα ζεύγη κλειδιών από τις μεταβλητές περιβάλλοντος και ανακτήστε τη διεύθυνση υπογράφοντος του Kora:

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 };
}

Εδώ χρησιμοποιούμε τη συνάρτησή μας getEnvKeyPair για να φορτώσουμε τα ζεύγη κλειδιών από τις μεταβλητές περιβάλλοντος. Τα ζεύγη κλειδιών αντιπροσωπεύουν:

  • Αποστολέας - Ο χρήστης που ξεκινά τη συναλλαγή και είναι υπεύθυνος για την πληρωμή του κόμβου Kora στο διακριτικό πληρωμής.
  • Προορισμός - Ο παραλήπτης των μεταφορών.

Χρησιμοποιούμε επίσης τη μέθοδο getPayerSigner για να ανακτήσουμε τη διεύθυνση υπογράφοντος του Kora. Αυτή είναι η διεύθυνση που θα χρησιμοποιηθεί για την υπογραφή της συναλλαγής με την υπογραφή του Kora. Είναι σημαντικό να ανακτήσουμε έναν έγκυρο υπογράφοντα από τον κόμβο Kora και να τον χρησιμοποιούμε συνεχώς σε όλη τη ροή της συναλλαγής μας.

Βήμα 3: Δημιουργία Οδηγιών Επίδειξης

Στη συνέχεια, δημιουργούμε ένα σύνολο εντολών που το testSender θέλει να στείλει στο δίκτυο. Θα χρησιμοποιήσουμε το Kora Client για να δημιουργήσουμε ορισμένες από αυτές τις εντολές και τη βιβλιοθήκη @solana/programs για να δημιουργήσουμε άλλες, ώστε να δείξουμε πώς να χρησιμοποιήσετε και τις δύο.

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 };
}

Συμβαίνουν αρκετά πράγματα εδώ, οπότε ας τα εξετάσουμε βήμα προς βήμα:

  1. Χρησιμοποιούμε το getConfig για να λάβουμε το token πληρωμής από τη διαμόρφωση του Kora. Επειδή έχουμε ρυθμίσει τον διακομιστή μας, γνωρίζουμε ότι υπάρχει μόνο ένα token στη λίστα επιτρεπόμενων, οπότε μπορούμε να το προσπελάσουμε απευθείας στην 1η θέση (config.validation_config.allowed_spl_paid_tokens[0]).
  2. Δημιουργούμε μια εντολή μεταφοράς token χρησιμοποιώντας τη μέθοδο transferTransaction του Kora Client. Αυτή είναι μια βοηθητική μέθοδος που διευκολύνει τη δημιουργία εντολής μεταφοράς token.
  3. Δημιουργούμε μια εντολή μεταφοράς SOL χρησιμοποιώντας τη μέθοδο transferTransaction του Kora Client. Το συμπεριλαμβάνουμε εδώ για να δείξουμε πώς να δημιουργείτε μεταφορές SOL χρησιμοποιώντας το Kora Client--σημειώστε ότι χρησιμοποιούμε το Native SOL mint 11111111111111111111111111111111 για να υποδείξουμε ότι θέλουμε να μεταφέρουμε SOL αντί για μεταφορά SPL token.
  4. Προσθέτουμε μια εντολή memo χρησιμοποιώντας τη συνάρτηση getAddMemoInstruction της βιβλιοθήκης @solana/programs.
  5. Συνδυάζουμε όλες τις εντολές σε έναν μόνο πίνακα. Θα χρησιμοποιήσουμε αυτόν τον πίνακα για να δημιουργήσουμε τη συναλλαγή εκτίμησης στο επόμενο βήμα.

Βήμα 4: Λάβετε την Εντολή Πληρωμής από το Kora

Δημιουργήστε μια συναλλαγή που θα παράγει μια εντολή πληρωμής προς το Kora σε αντάλλαγμα για τα τέλη που απαιτούνται για την εκτέλεση της συναλλαγής.

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 διαθέτει μια βοηθητική μέθοδο getPaymentInstruction που θα υπολογίσει τα ακριβή τέλη που απαιτούνται για τη συναλλαγή και θα δημιουργήσει μια εντολή μεταφοράς πληρωμής. Δείτε πώς τη χρησιμοποιούμε:

  1. Αρχικά, δημιουργούμε ένα estimateTransaction που περιλαμβάνει τις επιθυμητές οδηγίες μας--αυτή η συναλλαγή θα προσομοιωθεί στον διακομιστή Kora για να εκτιμηθούν τα απαιτούμενα τέλη για τη συναλλαγή.
  2. Στη συνέχεια, υπογράφουμε μερικώς τη συναλλαγή για να λάβουμε μια κωδικοποιημένη σε base64 συμβολοσειρά.
  3. Περνάμε την κωδικοποιημένη σε base64 συναλλαγή μας στη μέθοδο getPaymentInstruction με το διακριτικό πληρωμής και την πηγή της πληρωμής. Αυτό θα επιστρέψει ένα αντικείμενο Instruction που μπορούμε να προσθέσουμε στη συναλλαγή μας.

Βασικές έννοιες εδώ:

  • Έγκυρο Blockhash - Χρησιμοποιούμε τη μέθοδο getBlockhash για να λάβουμε ένα έγκυρο blockhash για τη συναλλαγή μας. Αυτό απαιτείται για την εκτίμηση της συναλλαγής καθώς θα προσομοιώσει τη συναλλαγή στον διακομιστή.
  • Noop Signer - Προσωρινός υπογράφων που χρησιμοποιείται κατά τη δημιουργία συναλλαγών πριν την υπογραφή του Kora. Αυτό θα μας επιτρέψει να καθορίσουμε έναν πληρωτή τελών στη συναλλαγή μας πριν έχουμε την υπογραφή του Kora. Για περισσότερες πληροφορίες σχετικά με τους Noop Signers, δείτε Τεκμηρίωση Solana Kit.
  • Μερική Υπογραφή - Για να λάβουμε τη συναλλαγή μας ως κωδικοποιημένη σε base64 συμβολοσειρά (χρειαζόμαστε αυτό για να στείλουμε τη συναλλαγή μέσω του Kora RPC), πρέπει να υπογράψουμε μερικώς τη συναλλαγή. Για περισσότερες πληροφορίες σχετικά με τους Partial Signers, δείτε Τεκμηρίωση Solana Kit.

Βήμα 5: Δημιουργία και Υπογραφή Τελικής Συναλλαγής

Τώρα που έχουμε την οδηγία πληρωμής μας, μπορούμε να δημιουργήσουμε μια τελική συναλλαγή που περιλαμβάνει τις αρχικές μας οδηγίες και την οδηγία πληρωμής.

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;
}

Χρησιμοποιούμε την ίδια συνάρτηση pipe για να συναρμολογήσουμε τη συναλλαγή μας. Η τελική μας συναλλαγή περιλαμβάνει:

  • Τις αρχικές μας οδηγίες
  • Την οδηγία πληρωμής
  • Ένα νέο blockhash
  • Τον ίδιο noop signer που χρησιμοποιήθηκε προηγουμένως για τη δημιουργία της συναλλαγής εκτίμησης

Στη συνέχεια καλούμε την ίδια συνάρτηση partiallySignTransactionMessageWithSigners για να λάβουμε μια κωδικοποιημένη σε base64 συμβολοσειρά wire της συναλλαγής. Αυτή τη φορά, ωστόσο, εκτελούμε επίσης την partiallySignTransaction για να υπογράψουμε τη συναλλαγή με τον testSenderKeypair μας. Παρόλο που ο κόμβος Kora πληρώνει τα τέλη δικτύου, ο testSender μας χρειάζεται ακόμα να υπογράψει για να εξουσιοδοτήσει την πληρωμή token και τις άλλες οδηγίες μεταφοράς που δημιουργήσαμε. Για κόμβους Kora που δεν απαιτούν πληρωμή, ορισμένες οδηγίες ενδέχεται να μην απαιτούν αυτό το βήμα υπογραφής. Τέλος, επιστρέφουμε την κωδικοποιημένη σε base64 συμβολοσειρά wire της συναλλαγής.

Βήμα 6: Υποβολή Συναλλαγής

Τέλος, πρέπει να κάνουμε τον κόμβο Kora να υπογράψει τη συναλλαγή ώστε να μπορέσουμε να στείλουμε μια πλήρως υπογεγραμμένη συναλλαγή στο δίκτυο. Αυτό το κάνουμε καλώντας τη μέθοδο signTransaction στον πελάτη Kora.

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;
}

Εδώ κάνουμε τρία πράγματα:

  1. Καλούμε τη μέθοδο signTransaction στον πελάτη Kora για να κάνουμε τον κόμβο Kora να υπογράψει τη συναλλαγή. Ο κόμβος θα εξετάσει τη συναλλαγή για να διασφαλίσει ότι η πληρωμή είναι επαρκής και στη συνέχεια θα υπογράψει τη συναλλαγή. Σημείωση: ορισμένοι κόμβοι Kora ενδέχεται να ενεργοποιούν signTransaction που δεν απαιτούν πληρωμή. Μπορείτε να ελέγξετε τη διαμόρφωση του κόμβου σας για να δείτε αν αυτό είναι ενεργοποιημένο εκτελώντας την getConfig().
  2. Στέλνουμε την πλήρως υπογεγραμμένη συναλλαγή στο δίκτυο Solana χρησιμοποιώντας τον πελάτη Solana RPC.
  3. Περιμένουμε να επιβεβαιωθεί η συναλλαγή στο δίκτυο.

Κύρια Συνάρτηση Ενορχήστρωσης

Η κύρια συνάρτηση συνδέει τα πάντα και καλεί κάθε μία από τις συναρτήσεις μας με σειρά:

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);
}
}

Εκτέλεση της Πλήρους Επίδειξης

Για να εκτελέσετε την πλήρη επίδειξη συναλλαγής χωρίς gas:

1. Διασφαλίστε τις Προϋποθέσεις

Ρυθμίστε τρία παράθυρα τερματικού:

  1. Εκκινήστε τον τοπικό σας validator δοκιμών:
solana-test-validator -r
  1. Εκκινήστε τον διακομιστή Kora RPC (από τον κατάλογο examples/getting-started/demo/server):
kora rpc start --signers-config signers.toml
  1. Αρχικοποιήστε το περιβάλλον σας (από τον κατάλογο examples/getting-started/demo/client):
pnpm init-env

2. Εκτελέστε τη Επίδειξη

# From the client directory
pnpm full-demo

3. Αναμενόμενο Αποτέλεσμα

Θα πρέπει να δείτε την εκτέλεση βήμα προς βήμα με μια επιτυχημένη συναλλαγή στο τέλος. Η συναλλαγή θα:

  • Μεταφέρει tokens από τον αποστολέα στον προορισμό
  • Μεταφέρει SOL από τον αποστολέα στον προορισμό
  • Περιλαμβάνει ένα μήνυμα σημείωσης "Hello, Kora!"
  • Πληρώνει τέλη στον χειριστή κόμβου Kora στο διαμορφωμένο SPL token σας
  • Έχει τα τέλη gas της συναλλαγής να πληρώνονται από τον χειριστή κόμβου Kora

Ανακεφαλαίωση: Κατανόηση της Ροής

Ας επανεξετάσουμε τι συμβαίνει σε αυτή την επίδειξη:

  1. Πρόθεση Χρήστη - Ο χρήστης συνέθεσε μια συναλλαγή που περιλάμβανε μια ποικιλία εντολών που ήθελε να εκτελέσει.
  2. Εκτίμηση Τελών - Το Kora υπολόγισε το κόστος συναλλαγής στο προτιμώμενο token του χρήστη και δημιούργησε μια εντολή πληρωμής.
  3. Σύνθεση Συναλλαγής - Ο χρήστης συνέθεσε μια τελική συναλλαγή που περιλάμβανε τις προτιθέμενες εντολές του χρήστη και την εντολή πληρωμής Kora.
  4. Υπογραφή Συναλλαγής - Ο χρήστης υπέγραψε μερικώς τη συναλλαγή με το keypair του και την έστειλε στον κόμβο Kora για υπογραφή αφού επαλήθευσε ότι η πληρωμή ήταν επαρκής.
  5. Ατομική Εκτέλεση - Ο χρήστης στέλνει τη συναλλαγή στο Solana και όλα συμβαίνουν σε μία μόνο συναλλαγή:
    • Οι προτιθέμενες μεταφορές του χρήστη εκτελούνται
    • Η πληρωμή για τα τέλη μεταφέρεται στο Kora
    • Το Kora πληρώνει τα τέλη δικτύου Solana και υπογράφει τη συναλλαγή

Και έτσι απλά, οι χρήστες δεν χρειάζεται να κατέχουν SOL για να πληρώσουν για τέλη gas--μπορούν να πληρώσουν για τα πάντα στα tokens που ήδη κατέχουν!

Αντιμετώπιση Προβλημάτων

Συνήθη Προβλήματα

Η Επικύρωση Συναλλαγής Αποτυγχάνει

  • Βεβαιωθείτε ότι όλα τα προγράμματα βρίσκονται στη λίστα επιτρεπόμενων στο kora.toml
  • Ελέγξτε ότι τα token mints βρίσκονται στο allowed_spl_paid_tokens
  • Βεβαιωθείτε ότι η συναλλαγή δεν υπερβαίνει το max_allowed_lamports

Η Δημιουργία Οδηγίας Πληρωμής Αποτυγχάνει

  • Επιβεβαιώστε ότι η εκτιμώμενη συναλλαγή έχει ένα πρόσφατο blockhash για προσομοίωση
  • Βεβαιωθείτε ότι η διεύθυνση πληρωμής της Kora έχει αρχικοποιημένα ATAs
  • Ελέγξτε ότι το token πληρωμής έχει ρυθμιστεί σωστά

Η Επαλήθευση Υπογραφής Αποτυγχάνει

  • Βεβαιωθείτε ότι συμπεριλαμβάνονται όλοι οι απαιτούμενοι υπογράφοντες (Kora και οποιοιδήποτε υπογράφοντες απαιτούνται για πληρωμές με token ή άλλες οδηγίες που περιλαμβάνονται στη συναλλαγή σας)
  • Επαληθεύστε ότι η συναλλαγή δεν έχει τροποποιηθεί μετά την υπογραφή
  • Ελέγξτε ότι τα keypairs έχουν φορτωθεί σωστά

Ολοκλήρωση

Συγχαρητήρια! Υλοποιήσατε επιτυχώς μια πλήρη ροή συναλλαγών χωρίς χρέωση gas με την Kora.

Η Kora καθιστά δυνατό να παρέχετε στους χρήστες μια απρόσκοπτη εμπειρία Web3 όπου δεν χρειάζεται ποτέ να ανησυχούν για τέλη gas ή να κατέχουν SOL. Είτε δημιουργείτε μια NeoBank, πλατφόρμα gaming ή πλατφόρμα liquid staking, οι συναλλαγές χωρίς χρέωση gas της Kora αφαιρούν ένα σημαντικό εμπόδιο στην υιοθέτηση από χρήστες.

Συμβουλή: Για μια απλούστερη ενσωμάτωση, δείτε τον Οδηγό Kit Client. Το API createKitKoraClient() διαχειρίζεται αυτόματα τη διαχείριση blockhash, την εκτίμηση χρεώσεων, την εισαγωγή οδηγιών πληρωμής και την υποβολή συναλλαγών — μειώνοντας τα χειροκίνητα βήματα που εμφανίζονται σε αυτόν τον οδηγό σε λίγες γραμμές κώδικα.

Επιπλέον Πόροι

Is this page helpful?

Διαχειρίζεται από

© 2026 Ίδρυμα Solana.
Με επιφύλαξη παντός δικαιώματος.
Συνδεθείτε