Overzicht
Kanaaloverdrachten zijn standaard SPL-tokenoverdrachten die naar de gateway worden gestuurd – er is geen speciale Private Channels-overdrachtsinstruction. De gateway stuurt de transactie door naar het write node, dat deze uitvoert tegen de off-chain accountslaag van het kanaal. Overdrachten worden bevestigd wanneer de sequencer ze verwerkt, niet wanneer een Solana-blok wordt bevestigd, en verschijnen niet op Mainnet.
De RPC van je wallet aanpassen
Voordat je een overdracht verstuurt, moet je het RPC-eindpunt van je wallet wijzigen naar de gateway-URL in plaats van Solana Devnet:
http://localhost:8899
Transacties die naar een openbare Solana RPC worden gestuurd, komen terecht op Mainnet, niet op het kanaal.
Authenticatie
Als je de stack hebt gestart zonder --profile auth (de standaard devnet-configuratie),
werkt de gateway in de open modus en is er geen token vereist –
sla deze sectie over.
Wanneer de Auth Service is ingeschakeld (JWT_SECRET is ingesteld op de gateway), vereisen alle
verzoeken een JWT bearer-token in de Authorization-header:
Authorization: Bearer <JWT_TOKEN>
Zie Authenticatie & Rollen voor informatie over hoe je je kunt registreren, inloggen en een token kunt verkrijgen.
Een overdracht opbouwen en versturen
Als de associated token account van de ontvanger nog niet op het kanaal bestaat,
voeg dan een createAssociatedTokenAccountIdempotent-instruction toe vóór de overdracht.
De onderstaande code verwerkt beide gevallen:
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);
De overdracht verifiëren
Vraag het kanaalsaldo van de ontvanger op via de gateway om te bevestigen dat de overdracht is verwerkt:
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);
Volgende stappen
Fondsen opnemen – tokens terug opnemen naar je Solana-wallet
Is this page helpful?