Τελευταία Ενημέρωση: 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:41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCEView on explorer:https://explorer.solana.com/tx/41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCE?cluster=custom&customUrl=http%3A%2F%2Flocalhost%3A8899
Ας το δημιουργήσουμε βήμα προς βήμα!
Προαπαιτούμενα
Πριν ξεκινήσετε αυτό το σεμινάριο, βεβαιωθείτε ότι έχετε:
- Ολοκληρώσει τον Οδηγό Γρήγορης Εκκίνησης Kora - θα χρησιμοποιήσουμε το ίδιο περιβάλλον δοκιμών με τον οδηγό γρήγορης εκκίνησης.
- Node.js (LTS ή νεότερη έκδοση)
- Solana CLI v2.2.x ή νεότερη
- Εξοικείωση με τις συναλλαγές Solana και τα SPL tokens
- Έναν εν λειτουργία διακομιστή Kora RPC με διαμορφωμένους υπογράφοντες (δείτε τον Οδηγό Γρήγορης Εκκίνησης για οδηγίες)
Ροή Συναλλαγών Kora
Το Kora επιτρέπει συναλλαγές χωρίς τέλη gas λειτουργώντας ως πληρωτής τελών για τις συναλλαγές των χρηστών σας. Η ροή συναλλαγών χωρίς τέλη gas αποτελείται από τα ακόλουθα κύρια βήματα:
- Δημιουργία Συναλλαγής - Δημιουργήστε την επιθυμητή συναλλαγή του χρήστη (μεταφορές, κλήσεις προγράμματος, κ.λπ.)
- Εκτίμηση Τελών - Δημιουργήστε μια συναλλαγή εκτίμησης για να υπολογίσετε τα απαιτούμενα τέλη
- Οδηγία Πληρωμής - Λάβετε μια οδηγία πληρωμής από το Kora που καθορίζει το ποσό των τελών
- Υπογραφή Χρήστη - Ο χρήστης υπογράφει τη συναλλαγή συμπεριλαμβανομένης της οδηγίας πληρωμής
- Συν-υπογραφή Kora - Το Kora επικυρώνει την πληρωμή και συν-υπογράφει ως πληρωτής τελών
- Υποβολή - Υποβάλετε την πλήρως υπογεγραμμένη συναλλαγή στο 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 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 };}
Συμβαίνουν αρκετά πράγματα εδώ, οπότε ας τα εξετάσουμε βήμα προς βήμα:
- Χρησιμοποιούμε το
getConfigγια να λάβουμε το token πληρωμής από τη διαμόρφωση του Kora. Επειδή έχουμε ρυθμίσει τον διακομιστή μας, γνωρίζουμε ότι υπάρχει μόνο ένα token στη λίστα επιτρεπόμενων, οπότε μπορούμε να το προσπελάσουμε απευθείας στην 1η θέση (config.validation_config.allowed_spl_paid_tokens[0]). - Δημιουργούμε μια εντολή μεταφοράς token χρησιμοποιώντας τη μέθοδο
transferTransactionτου Kora Client. Αυτή είναι μια βοηθητική μέθοδος που διευκολύνει τη δημιουργία εντολής μεταφοράς token. - Δημιουργούμε μια εντολή μεταφοράς SOL χρησιμοποιώντας τη μέθοδο
transferTransactionτου Kora Client. Το συμπεριλαμβάνουμε εδώ για να δείξουμε πώς να δημιουργείτε μεταφορές SOL χρησιμοποιώντας το Kora Client--σημειώστε ότι χρησιμοποιούμε το Native SOL mint11111111111111111111111111111111για να υποδείξουμε ότι θέλουμε να μεταφέρουμε SOL αντί για μεταφορά SPL token. - Προσθέτουμε μια εντολή memo χρησιμοποιώντας τη συνάρτηση
getAddMemoInstructionτης βιβλιοθήκης @solana/programs. - Συνδυάζουμε όλες τις εντολές σε έναν μόνο πίνακα. Θα χρησιμοποιήσουμε αυτόν τον πίνακα για να δημιουργήσουμε τη συναλλαγή εκτίμησης στο επόμενο βήμα.
Βήμα 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 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 διαθέτει μια βοηθητική μέθοδο getPaymentInstruction που θα
υπολογίσει τα ακριβή τέλη που απαιτούνται για τη συναλλαγή και θα δημιουργήσει
μια εντολή μεταφοράς πληρωμής. Δείτε πώς τη χρησιμοποιούμε:
- Αρχικά, δημιουργούμε ένα
estimateTransactionπου περιλαμβάνει τις επιθυμητές οδηγίες μας--αυτή η συναλλαγή θα προσομοιωθεί στον διακομιστή Kora για να εκτιμηθούν τα απαιτούμενα τέλη για τη συναλλαγή. - Στη συνέχεια, υπογράφουμε μερικώς τη συναλλαγή για να λάβουμε μια κωδικοποιημένη σε base64 συμβολοσειρά.
- Περνάμε την κωδικοποιημένη σε 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 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;}
Χρησιμοποιούμε την ίδια συνάρτηση 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 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;}
Εδώ κάνουμε τρία πράγματα:
- Καλούμε τη μέθοδο
signTransactionστον πελάτη Kora για να κάνουμε τον κόμβο Kora να υπογράψει τη συναλλαγή. Ο κόμβος θα εξετάσει τη συναλλαγή για να διασφαλίσει ότι η πληρωμή είναι επαρκής και στη συνέχεια θα υπογράψει τη συναλλαγή. Σημείωση: ορισμένοι κόμβοι Kora ενδέχεται να ενεργοποιούνsignTransactionπου δεν απαιτούν πληρωμή. Μπορείτε να ελέγξετε τη διαμόρφωση του κόμβου σας για να δείτε αν αυτό είναι ενεργοποιημένο εκτελώντας τηνgetConfig(). - Στέλνουμε την πλήρως υπογεγραμμένη συναλλαγή στο δίκτυο Solana χρησιμοποιώντας τον πελάτη Solana RPC.
- Περιμένουμε να επιβεβαιωθεί η συναλλαγή στο δίκτυο.
Κύρια Συνάρτηση Ενορχήστρωσης
Η κύρια συνάρτηση συνδέει τα πάντα και καλεί κάθε μία από τις συναρτήσεις μας με σειρά:
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);}}
Εκτέλεση της Πλήρους Επίδειξης
Για να εκτελέσετε την πλήρη επίδειξη συναλλαγής χωρίς gas:
1. Διασφαλίστε τις Προϋποθέσεις
Ρυθμίστε τρία παράθυρα τερματικού:
- Εκκινήστε τον τοπικό σας validator δοκιμών:
solana-test-validator -r
- Εκκινήστε τον διακομιστή Kora RPC (από τον κατάλογο examples/getting-started/demo/server):
kora rpc start --signers-config signers.toml
- Αρχικοποιήστε το περιβάλλον σας (από τον κατάλογο examples/getting-started/demo/client):
pnpm init-env
2. Εκτελέστε τη Επίδειξη
# From the client directorypnpm full-demo
3. Αναμενόμενο Αποτέλεσμα
Θα πρέπει να δείτε την εκτέλεση βήμα προς βήμα με μια επιτυχημένη συναλλαγή στο τέλος. Η συναλλαγή θα:
- Μεταφέρει tokens από τον αποστολέα στον προορισμό
- Μεταφέρει SOL από τον αποστολέα στον προορισμό
- Περιλαμβάνει ένα μήνυμα σημείωσης "Hello, Kora!"
- Πληρώνει τέλη στον χειριστή κόμβου Kora στο διαμορφωμένο SPL token σας
- Έχει τα τέλη gas της συναλλαγής να πληρώνονται από τον χειριστή κόμβου Kora
Ανακεφαλαίωση: Κατανόηση της Ροής
Ας επανεξετάσουμε τι συμβαίνει σε αυτή την επίδειξη:
- Πρόθεση Χρήστη - Ο χρήστης συνέθεσε μια συναλλαγή που περιλάμβανε μια ποικιλία εντολών που ήθελε να εκτελέσει.
- Εκτίμηση Τελών - Το Kora υπολόγισε το κόστος συναλλαγής στο προτιμώμενο token του χρήστη και δημιούργησε μια εντολή πληρωμής.
- Σύνθεση Συναλλαγής - Ο χρήστης συνέθεσε μια τελική συναλλαγή που περιλάμβανε τις προτιθέμενες εντολές του χρήστη και την εντολή πληρωμής Kora.
- Υπογραφή Συναλλαγής - Ο χρήστης υπέγραψε μερικώς τη συναλλαγή με το keypair του και την έστειλε στον κόμβο Kora για υπογραφή αφού επαλήθευσε ότι η πληρωμή ήταν επαρκής.
- Ατομική Εκτέλεση - Ο χρήστης στέλνει τη συναλλαγή στο 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, την εκτίμηση χρεώσεων, την εισαγωγή οδηγιών πληρωμής και την υποβολή συναλλαγών — μειώνοντας τα χειροκίνητα βήματα που εμφανίζονται σε αυτόν τον οδηγό σε λίγες γραμμές κώδικα.
Επιπλέον Πόροι
- Χρειάζεστε βοήθεια; Κάντε ερωτήσεις στο
Solana Stack Exchange με ετικέτα
Kora - Οδηγός Διαμόρφωσης Kora - Λεπτομερείς επιλογές διαμόρφωσης
- Οδηγός Υπογραφόντων - Διαχείριση διαφορετικών τύπων υπογραφόντων
- Αναφορά API - Πλήρης τεκμηρίωση μεθόδων RPC
- Αποθετήριο GitHub - Πηγαίος κώδικας και παραδείγματα
- Kora SDK - SDK για αλληλεπίδραση με τα RPC endpoints της Kora
Is this page helpful?