Genel Bakış
Kanal transferleri, ağ geçidine gönderilen standart SPL token transferleridir — özel bir Private Channels transfer talimatı yoktur. Ağ geçidi, işlemi yazma düğümüne yönlendirir; bu düğüm işlemi kanalın zincir dışı hesaplar katmanına karşı çalıştırır. Transferler, bir Solana bloğu onaylandığında değil, sıralayıcı onları işlediğinde onaylanır ve Mainnet üzerinde görünmez.
Cüzdan RPC'nizi Değiştirin
Transfer göndermeden önce, cüzdanınızın RPC uç noktasını Solana Devnet yerine ağ geçidi URL'siyle değiştirin:
http://localhost:8899
Herkese açık bir Solana RPC'sine gönderilen işlemler kanala değil, Mainnet'e düşer.
Kimlik Doğrulama
Stack'i --profile auth olmadan başlattıysanız (varsayılan devnet yapılandırması),
ağ geçidi açık modda çalışır ve herhangi bir token gerekmez —
bu bölümü atlayabilirsiniz.
Auth Service etkinleştirildiğinde (ağ geçidinde JWT_SECRET ayarlandığında),
tüm istekler Authorization başlığında bir JWT taşıyıcı token gerektirir:
Authorization: Bearer <JWT_TOKEN>
Kayıt olma, giriş yapma ve token edinme hakkında bilgi almak için Kimlik Doğrulama & Roller bölümüne bakın.
Transfer Oluşturun ve Gönderin
Alıcının associated token account'u kanalda henüz mevcut değilse,
transferden önce bir createAssociatedTokenAccountIdempotent talimatı ekleyin.
Aşağıdaki kod her iki durumu da ele alır:
import {address,createSolanaRpc,pipe,createTransactionMessage,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,appendTransactionMessageInstruction,signAndSendTransactionMessageWithSigners,assertIsTransactionMessageWithSingleSendingSigner,getBase58Decoder} from "@solana/kit";import {findAssociatedTokenPda,getCreateAssociatedTokenIdempotentInstruction,getTransferInstruction} from "@solana-program/token";const TOKEN_PROGRAM_ADDRESS = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");// Point to the gateway, not a public Solana RPCconst privateChannelRpc = createSolanaRpc("http://localhost:8899");// Derive source and destination associated token accountsconst [sourceAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(senderAddress),tokenProgram: TOKEN_PROGRAM_ADDRESS});const [destinationAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(recipientAddress),tokenProgram: TOKEN_PROGRAM_ADDRESS});const transferInstruction = getTransferInstruction({source: sourceAta,destination: destinationAta,authority: transactionSigner,amount: 1_000_000n // 1 USDC (6 decimals)});// Create the destination ATA on the channel if it does not exist yetconst destinationAtaInfo = await privateChannelRpc.getAccountInfo(destinationAta, { encoding: "base64" }).send();const { value: latestBlockhash } = await privateChannelRpc.getLatestBlockhash({ commitment: "confirmed" }).send();// Sent to the Private Channels gateway (not Solana RPC directly), which// expects the legacy transaction format - do not switch this to version 0.const transactionMessage = !destinationAtaInfo.value? pipe(createTransactionMessage({ version: "legacy" }),(m) => setTransactionMessageFeePayerSigner(transactionSigner, m),(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),(m) =>appendTransactionMessageInstruction(getCreateAssociatedTokenIdempotentInstruction({payer: transactionSigner,ata: destinationAta,owner: address(recipientAddress),mint: address(mintAddress)}),m),(m) => appendTransactionMessageInstruction(transferInstruction, m)): pipe(createTransactionMessage({ version: "legacy" }),(m) => setTransactionMessageFeePayerSigner(transactionSigner, m),(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),(m) => appendTransactionMessageInstruction(transferInstruction, m));assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);const signatureBytes =await signAndSendTransactionMessageWithSigners(transactionMessage);const signature = getBase58Decoder().decode(signatureBytes);console.log("Transfer signature:", signature);
Transferi Doğrulayın
Transferin başarıyla gerçekleştiğini onaylamak için alıcının kanal bakiyesini ağ geçidi aracılığıyla sorgulayın:
const [recipientAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(recipientAddress),tokenProgram: TOKEN_PROGRAM_ADDRESS});const balance = await privateChannelRpc.getTokenAccountBalance(recipientAta).send();console.log(balance.value.uiAmountString);
Sonraki Adımlar
Fonları Çek — tokens'ları Solana cüzdanınıza geri çekin
Is this page helpful?