Übersicht
Channel-Überweisungen sind standardmäßige SPL-Token-Überweisungen, die an das Gateway übermittelt werden – es gibt keine dedizierte Private Channels-Überweisungs Anweisungen. Das Gateway leitet die Transaktion an den Write Node weiter, der sie gegen die Off-Chain-Konten-Schicht des Channels ausführt. Überweisungen werden bestätigt, wenn der Sequencer sie verarbeitet, nicht wenn ein Solana-Block bestätigt wird, und erscheinen nicht im Mainnet.
Wallet-RPC wechseln
Bevor Sie eine Überweisung senden, wechseln Sie den RPC-Endpunkt Ihres Wallets zur Gateway-URL anstelle von Solana Devnet:
http://localhost:8899
Transaktionen, die an einen öffentlichen Solana-RPC gesendet werden, landen im Mainnet, nicht im Channel.
Authentifizierung
Wenn Sie den Stack ohne --profile auth gestartet haben (die Standard-Devnet-
Konfiguration), läuft das Gateway im offenen Modus und es ist kein Token erforderlich –
überspringen Sie diesen Abschnitt.
Wenn der Auth-Service aktiviert ist (JWT_SECRET ist am Gateway gesetzt), erfordern alle
Anfragen ein JWT-Bearer-Token im Authorization-Header:
Authorization: Bearer <JWT_TOKEN>
Siehe Authentifizierung & Rollen für Informationen zur Registrierung, Anmeldung und zum Erhalt eines Tokens.
Überweisung erstellen und senden
Wenn das associated token account des Empfängers noch nicht im Channel existiert,
fügen Sie eine createAssociatedTokenAccountIdempotent Anweisungen vor der Überweisung hinzu.
Der folgende Code behandelt beide Fälle:
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);
Überweisung überprüfen
Fragen Sie den Channel-Saldo des Empfängers über das Gateway ab, um zu bestätigen, dass die Überweisung angekommen ist:
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);
Nächste Schritte
Guthaben abheben – Token zurück in Ihr Solana-Wallet abheben
Is this page helpful?