Schreiben ins Netzwerk
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}`);
Erstelle einen Connection, um das Senden von Transaktionen und das Abrufen von
Kontendaten zu verwalten.
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üge SOL zum Senderkonto hinzu. Auf anderen Netzwerken als dem Mainnet kannst du
die requestAirdropMethode verwenden, um SOL für Tests 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););
Die Erstellung eines Tokens erfordert die Verwendung der @solana/web3.js und
@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 minimalen lamports, die für ein mint account erforderlich sind. Die
getMinimumBalanceForRentExemptMint Funktion berechnet, wie viele lamport für
die Daten auf einem mint account zugewiesen werden müssen.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Die erste Anweisung ruft die createAccount Anweisung des System Programs 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 Anweisung ruft die createInitializeMint2Instruction Anweisung des
Token Extensions Program auf, um das Mint-Konto mit
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?