Im vorherigen Abschnitt hast du gelernt, wie man Daten aus dem Solana-Netzwerk liest. Jetzt lernst du, wie man Daten in das Netzwerk schreibt. Das Schreiben ins Solana-Netzwerk beinhaltet das Senden von Transaktionen, die eine oder mehrere Anweisungen enthalten.
Programme definieren die Geschäftslogik für das, was jede Anweisung tut. Wenn du eine Transaktion übermittelst, führt die Solana-Laufzeitumgebung jede Anweisung sequentiell und atomar aus. Die Beispiele in diesem Abschnitt zeigen, wie man Transaktionen erstellt und sendet, um Solana-Programme aufzurufen, darunter:
- Übertragen von SOL zwischen Konten
- Erstellen eines neuen Tokens
SOL übertragen
Das folgende Beispiel überträgt SOL zwischen zwei Konten. Jedes Konto hat ein Eigentümer- Programm, welches das einzige Programm ist, das den SOL-Kontostand des Kontos verringern kann.
Alle Wallet-Konten gehören dem System Program. Um SOL zu übertragen, musst du die transfer-Anweisung des System Programs aufrufen.
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,sendAndConfirmTransaction,Keypair,Connection} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = new Keypair();const receiver = new Keypair();const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});const transaction = new Transaction().add(transferInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);console.log("Transaction Signature:", `${transactionSignature}`);const senderBalance = await connection.getBalance(sender.publicKey);const receiverBalance = await connection.getBalance(receiver.publicKey);console.log("Sender Balance:", `${senderBalance}`);console.log("Receiver Balance:", `${receiverBalance}`);
Erstellen Sie einen Connection, um das Senden von Transaktionen und das
Abrufen von Kontodaten zu verarbeiten.
In diesem Beispiel verbinden wir uns mit dem lokalen Test-Validator, der auf
localhost:8899 läuft.
const connection = new Connection("http://localhost:8899", "confirmed");
Generiere neue Schlüsselpaare, die als Sender- und Empfängerkonten verwendet werden sollen.
const sender = new Keypair();const receiver = new Keypair();
Fügen Sie dem Sender-Konto SOL hinzu. In anderen Netzwerken als Mainnet können
Sie die requestAirdrop-Methode verwenden, um SOL zum Testen zu erhalten.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Die SystemProgram.transfer()-Methode erstellt eine Anweisung, die SOL vom
fromPubkey-Konto zum toPubkey-Konto für die
angegebene Anzahl von lamports überträgt.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Erstelle eine Transaktion und füge die Anweisung zur Transaktion hinzu. In diesem Beispiel erstellen wir eine Transaktion mit einer einzelnen Anweisung. Du kannst jedoch mehrere Anweisungen zu einer Transaktion hinzufügen.
const transaction = new Transaction().add(transferInstruction);
Signiere und sende die Transaktion an das Netzwerk. Das Sender keypair wird im signers-Array benötigt, um die Überweisung von SOL von seinem Konto zu autorisieren.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Die Transaktionssignatur ist eine eindeutige Kennung, die verwendet werden kann, um die Transaktion im Solana Explorer nachzuschlagen.
Einen Token erstellen
Das folgende Beispiel erstellt einen neuen Token auf Solana mit dem Token Extensions Program. Dies erfordert zwei Anweisungen:
- Aufruf des System Programs, um ein neues Konto zu erstellen.
- Aufruf des Token Extensions Programs, um dieses Konto als Mint zu initialisieren.
import {Connection,Keypair,SystemProgram,Transaction,sendAndConfirmTransaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {MINT_SIZE,TOKEN_2022_PROGRAM_ID,createInitializeMint2Instruction,getMinimumBalanceForRentExemptMint,getMint} from "@solana/spl-token";const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();// Fund the wallet with SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
Das Erstellen eines Tokens erfordert die Verwendung sowohl der
@solana/web3.js- als auch der @solana/spl-token-Bibliotheken. Der Code im
folgenden Beispiel wird:
- Eine Verbindung erstellen
- Ein keypair generieren, um die Transaktion zu bezahlen
- Einen Airdrop anfordern, um das keypair zu finanzieren
const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();const signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Generiere ein keypair für das mint account. Der öffentliche Schlüssel wird als Adresse des mint accounts verwendet.
const mint = new Keypair();
Berechne die minimal erforderlichen lamports für ein mint account. Die
getMinimumBalanceForRentExemptMint-Funktion berechnet, wie viele lamports für
die Daten auf einem mint account zugewiesen werden müssen.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Die erste Instruktion ruft die createAccount-Instruktion des System Program
auf, um:
- Anzahl der Bytes zuweisen, die zum Speichern der Mint-Daten benötigt werden.
- Lamports übertragen vom Wallet, um das neue Konto zu finanzieren.
- Eigentümerschaft zuweisen des Kontos an das Token Extensions Program.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Die zweite Instruktion ruft die createInitializeMint2Instruction-Instruktion
des Token Extensions Program auf, um das mint account mit
den folgenden Daten zu initialisieren:
- 2 Dezimalstellen
- Wallet sowohl als Mint-Autorität als auch als Freeze-Autorität
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Füge beide Anweisungen zu einer einzigen Transaktion hinzu. Dies stellt sicher, dass die Kontoerstellung und -initialisierung atomar erfolgen. (Entweder sind beide Anweisungen erfolgreich oder keine.)
Dieser Ansatz ist üblich beim Erstellen komplexer Solana-Transaktionen, da er garantiert, dass alle Anweisungen zusammen ausgeführt werden.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Signiere und sende die Transaktion. Zwei Signaturen sind erforderlich:
- Das Wallet Konto signiert als Zahler für Transaktionsgebühren und Kontoerstellung
- Das Mint Konto signiert, um die Verwendung seiner Adresse für das neue Konto zu autorisieren
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Die zurückgegebene Transaktionssignatur kann verwendet werden, um die Transaktion im Solana Explorer zu überprüfen.
Is this page helpful?