Последнее обновление: 2025-10-31
Что вы создадите
В руководстве по быстрому старту вы узнали, как настроить Kora RPC и выполнять базовые вызовы. Теперь мы создадим полную систему транзакций без комиссий, демонстрирующую все возможности Kora. К концу этого руководства вы реализуете поток транзакций, который:
- Создаёт несколько инструкций перевода (SPL-токены и SOL)
- Получает инструкции по оплате от Kora для покрытия комиссий
- Подписывает транзакции ключами пользователя, пока Kora обрабатывает комиссии за газ
- Отправляет полностью подписанные транзакции в сеть Solana
Конечным результатом станет рабочая система транзакций без комиссий:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━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 версии 2.2.x или выше
- Знакомство с транзакциями Solana и SPL-токенами
- Работающий сервер Kora RPC с настроенными подписантами (см. руководство по быстрому старту для получения инструкций)
Поток транзакций Kora
Kora обеспечивает транзакции без комиссий, выступая в качестве плательщика комиссий для транзакций ваших пользователей. Поток транзакций без комиссий состоит из следующих основных шагов:
- Создание транзакции — формирование предполагаемой транзакции пользователя (переводы, вызовы программ и т.д.)
- Оценка комиссии — создание оценочной транзакции для расчёта необходимых комиссий
- Инструкция по оплате — получение от Kora инструкции по оплате, указывающей размер комиссии
- Подписание пользователем — пользователь подписывает транзакцию, включая инструкцию по оплате
- Совместное подписание Kora — Kora проверяет оплату и подписывает в качестве плательщика комиссии
- Отправка — отправка полностью подписанной транзакции в Solana
*Примечание: Kora можно настроить так, чтобы не требовалась оплата, но мы будем использовать её для демонстрации полного процесса.
Настройка проекта
Особенности сервера Kora
- Список разрешённых токенов — Для оплаты можно использовать только токены,
настроенные в
kora.toml— убедитесь, что токен, определённый в вашем.env, включён в список разрешённых токенов в файле kora.toml. - Ограничения программ — Транзакции могут взаимодействовать только с программами из белого списка. Мы предварительно настроили kora.toml для разрешения взаимодействия с System Program, Token Program, программой Compute Unit и программой Memo.
Настройка клиента
Это руководство предполагает, что вы завершили Быстрый старт и настроили демонстрационный проект. Если нет, пожалуйста, сначала выполните его.
Перейдите в директорию демонстрационного клиента:
cd kora/examples/getting-started/demo/client
Примечание: Демонстрационные файлы находятся в репозитории GitHub, поскольку они требуют полной настройки среды разработки.
Реализация
Прежде чем мы начнём запускать демонстрацию, давайте пошагово рассмотрим реализацию полной демонстрации:
Импорты и конфигурация
Наша демонстрация начинается с необходимых импортов и конфигурации:
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 из Kora SDK и несколько типов и вспомогательных функций из библиотеки Solana Kit для построения транзакций.
Мы также создаём глобальный объект конфигурации, который определяет:
- Вычислительный бюджет — Единицы и цена для приоритизации транзакций
- Версия транзакции — Используется V0 для поддержки таблиц поиска адресов
- Конечные точки RPC — Локальные серверы Solana и Kora RPC
Оставьте эти значения по умолчанию на данный момент — после демонстрации вы можете поэкспериментировать с различными значениями, чтобы увидеть, как они влияют на процесс транзакции.
Вспомогательные функции
Демонстрация включает вспомогательную функцию для загрузки keypair из переменных окружения:
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 из переменных окружения
- Кодирует строку приватного ключа в массив байтов U8
- Преобразует их в объекты подписанта keypair
Шаг 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-ключ или hmac-секрет, но мы оставили закомментированный код для справки.
Шаг 2: Настройка ключей
Загрузите необходимые keypair из переменных окружения и получите адрес подписанта 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 для загрузки keypair из
переменных окружения. Keypair представляют:
- Отправитель - пользователь, инициирующий транзакцию и отвечающий за оплату узлу 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для получения платежного токена из конфигурации Kora. Поскольку мы настроили наш сервер, мы знаем, что в белом списке есть только один токен, поэтому мы можем обратиться к нему напрямую по 1-й позиции (config.validation_config.allowed_spl_paid_tokens[0]). - Мы создаем инструкцию перевода токенов, используя метод
transferTransactionKora Client. Это вспомогательный метод, который упрощает создание инструкции перевода токенов. - Мы создаем инструкцию перевода SOL, используя метод
transferTransactionKora Client. Мы включили это здесь, чтобы показать, как создавать переводы SOL с помощью Kora Client — обратите внимание, что мы используем нативный минт SOL11111111111111111111111111111111, чтобы указать, что хотим перевести SOL вместо перевода SPL-токена. - Мы добавляем инструкцию 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, который мы можем добавить к нашей транзакции.
Ключевые концепции:
- Действительный блокхеш — Мы используем метод
getBlockhashдля получения действительного блокхеша для нашей транзакции. Это необходимо для оценки транзакции, поскольку она будет смоделирована на сервере. - Фиктивный подписант (Noop Signer) — Подписант-заполнитель, используемый при построении транзакций до подписания Kora. Это позволяет нам указать плательщика комиссии в транзакции до получения подписи Kora. Подробнее о фиктивных подписантах см. в документации Solana Kit.
- Частичное подписание — Чтобы получить нашу транзакцию в виде закодированной в base64 строки (это необходимо для отправки транзакции через Kora RPC), нам нужно частично подписать транзакцию. Подробнее о частичных подписантах см. в документации 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 для сборки нашей транзакции. Финальная
транзакция включает:
- Наши исходные инструкции
- Платёжную инструкцию
- Свежий блокхеш
- Того же фиктивного подписанта, что использовался ранее для построения оценочной транзакции
Затем мы вызываем ту же функцию partiallySignTransactionMessageWithSigners,
чтобы получить строку транзакции в формате base64. Однако на этот раз мы также
запускаем partiallySignTransaction для подписи транзакции с помощью нашего
testSenderKeypair. Хотя наш узел Kora оплачивает сетевые комиссии, наш
testSender всё равно должен подписать транзакцию, чтобы авторизовать платёж
токенами и другие созданные нами инструкции передачи. Для узлов Kora, которые не
требуют оплаты, некоторые инструкции могут не требовать этого шага подписи.
Наконец, мы возвращаем строку транзакции в формате base64.
Шаг 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, используя RPC-клиент Solana.
- Мы ожидаем подтверждения транзакции в сети.
Основная функция оркестрации
Основная функция связывает всё воедино и последовательно вызывает каждую из наших функций:
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);}}
Запуск полной демонстрации
Чтобы запустить полную демонстрацию беспошлинных транзакций:
1. Убедитесь в наличии необходимых условий
Настройте три окна терминала:
- Запустите локальный тестовый validator:
solana-test-validator -r
- Запустите ваш RPC-сервер Kora (из директории 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. Ожидаемый результат
Вы должны увидеть пошаговое выполнение с успешной транзакцией в конце. Транзакция будет:
- Переводить токены от отправителя к получателю
- Переводить SOL от отправителя к получателю
- Включать сообщение-памятку "Hello, Kora!"
- Оплачивать комиссии оператору узла Kora в вашем настроенном SPL-токене
- Иметь комиссии за газ транзакции, оплаченные оператором узла Kora
Краткое повторение: понимание процесса
Давайте рассмотрим, что происходит в этой демонстрации:
- Намерение пользователя — Пользователь составил транзакцию, которая включала различные инструкции, которые он хотел выполнить.
- Расчет комиссии — Kora рассчитал стоимость транзакции в предпочитаемом пользователем токене и создал инструкцию оплаты.
- Сборка транзакции — Пользователь собрал финальную транзакцию, которая включала предполагаемые пользователем инструкции и инструкцию оплаты Kora.
- Подписание транзакции — Пользователь частично подписал транзакцию своим keypair и отправил узлу Kora для подписания после проверки достаточности оплаты.
- Атомарное выполнение — Пользователь отправляет транзакцию в Solana, и всё
происходит в одной транзакции:
- Выполняются предполагаемые пользователем переводы
- Оплата комиссий переводится на Kora
- Kora оплачивает комиссии сети Solana и подписывает транзакцию
И вот так пользователям не нужно держать SOL для оплаты комиссий за газ — они могут оплачивать всё токенами, которые уже имеют!
Устранение неполадок
Распространённые проблемы
Проверка транзакции не проходит
- Убедитесь, что все программы добавлены в белый список в
kora.toml - Проверьте, что минты токенов находятся в
allowed_spl_paid_tokens - Убедитесь, что транзакция не превышает
max_allowed_lamports
Не удаётся сгенерировать инструкцию оплаты
- Убедитесь, что расчётная транзакция имеет свежий блокхеш для симуляции
- Проверьте, что адрес оплаты Kora имеет инициализированные ATA
- Убедитесь, что платёжный токен правильно настроен
Проверка подписи не проходит
- Убедитесь, что включены все необходимые подписанты (Kora и любые подписанты, требуемые для платежей токенами или других инструкций, включённых в вашу транзакцию)
- Проверьте, что транзакция не была изменена после подписания
- Убедитесь, что пары ключей загружены правильно
Заключение
Поздравляем! Вы успешно реализовали полный процесс бесплатных транзакций с помощью Kora.
Kora даёт возможность предоставить пользователям бесшовный опыт работы с Web3, где им никогда не нужно беспокоиться о комиссиях за газ или владении SOL. Независимо от того, создаёте ли вы NeoBank, игровую платформу или платформу ликвидного стейкинга, бесплатные транзакции Kora устраняют серьёзный барьер для привлечения пользователей.
Совет: Для более простой интеграции ознакомьтесь с Руководством по Kit Client. API
createKitKoraClient()автоматически обрабатывает управление блокхешами, оценку комиссий, внедрение инструкций оплаты и отправку транзакций — сокращая ручные шаги, показанные в этом руководстве, до нескольких строк кода.
Дополнительные ресурсы
- Нужна помощь? Задавайте вопросы на
Solana Stack Exchange с тегом
Kora - Руководство по конфигурации Kora - Подробные параметры конфигурации
- Руководство по подписантам - Управление различными типами подписантов
- Справочник API - Полная документация методов RPC
- Репозиторий GitHub - Исходный код и примеры
- Kora SDK - SDK для взаимодействия с RPC-эндпоинтами Kora
Is this page helpful?