Eine Überweisung senden

Ü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 RPC
const privateChannelRpc = createSolanaRpc("http://localhost:8899");
// Derive source and destination associated token accounts
const [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 yet
const 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?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.