Schreiben ins Netzwerk
Im vorherigen Abschnitt haben Sie gelernt, wie man Daten aus dem Solana-Netzwerk liest. Jetzt lernen Sie, wie man Daten darin schreibt. Das Schreiben in das Solana-Netzwerk beinhaltet das Senden von Transaktionen, die eine oder mehrere Anweisungen enthalten.
Programme (Smart Contracts) definieren die Geschäftslogik für das, was jede Anweisung tut. Wenn Sie eine Transaktion einreichen, führt die Solana-Laufzeit jede Anweisung der Reihe nach und atomar aus (das bedeutet, entweder alle Anweisungen sind erfolgreich oder die gesamte Transaktion schlägt fehl).
Dieser Abschnitt behandelt die folgenden Beispiele:
- Übertragen von SOL zwischen Konten
- Erstellen eines neuen Tokens
Diese Beispiele zeigen, wie man Transaktionen erstellt und sendet, um Solana-Programme aufzurufen. Weitere Details finden Sie auf den Seiten Transaktionen und Anweisungen und Fee auf Solana.
SOL übertragen
In diesem Beispiel lernen Sie, wie man SOL zwischen zwei Konten überträgt.
Auf Solana hat jedes Konto ein bestimmtes Programm als Eigentümer. Nur der Programm- Eigentümer kann das SOL-Guthaben (Lamport) eines Kontos verringern.
Das System Program ist der Eigentümer aller "Wallet"-Konten. Um SOL zu übertragen, müssen Sie 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 eine Connection
, um Transaktionen zu senden und Kontendaten
abzurufen.
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 Keypairs, die als Sender- und Empfängerkonten verwendet werden.
Ein Keypair
beinhaltet:
- Einen öffentlichen Schlüssel, der als Kontoadresse dient
- Einen privaten Schlüssel, der zum Signieren von Transaktionen verwendet wird
const sender = new Keypair();const receiver = new Keypair();
Bevor wir SOL übertragen können, muss das Senderkonto über ein SOL-Guthaben verfügen.
Auf anderen Netzwerken als dem Mainnet kannst du die requestAirdrop
Methode
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 den
angegebenen lamports
Betrag ü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 ihrem 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.
Token erstellen
In diesem Beispiel lernst du, wie man einen neuen Token auf Solana mit dem Token Extensions Program erstellt. Dies erfordert zwei Anweisungen:
- Rufe das System Program auf, um ein neues Konto zu erstellen.
- Rufe das Token Extensions Program auf, 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 auf Solana erfordert die Verwendung der Bibliotheken
@solana/web3.js
und @solana/spl-token
.
- Erstelle eine Verbindung
- Generiere ein keypair um für die Transaktion zu bezahlen
- Fordere einen Airdrop an 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 dieses keypairs wird als Adresse für das mint account verwendet.
const mint = new Keypair();
Berechne die minimale Anzahl an lamports, die für ein mint account erforderlich sind.
Die getMinimumBalanceForRentExemptMint
Funktion berechnet genau, wie viel SOL
(in lamports) für die Daten auf einem mint account zugewiesen werden muss.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Die erste Anweisung ruft die createAccount
Anweisung des System Programs auf,
um:
- Die erforderlichen Bytes zuzuweisen zum Speichern von Mint-Daten
- Lamports zu übertragen vom Wallet zur Finanzierung des neuen Konten
- Die Eigentümerschaft zuzuweisen des Konten an das Token
Extensions Program (
TOKEN_2022_PROGRAM_ID
)
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 Token Extensions Program's
createInitializeMint2Instruction
Anweisung auf, um das mint account mit den
folgenden Daten zu initialisieren:
- 2 Dezimalstellen
- Wallet als sowohl Mint-Autorität als auch 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.
Durch die Kombination beider Anweisungen in einer einzigen Transaktion stellst du sicher, dass die Kontoerstellung und -initialisierung atomar erfolgen. Entweder beide Anweisungen werden erfolgreich ausgeführt oder keine.
Dieser Ansatz ist üblich beim Aufbau komplexerer 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:
- Wallet signiert als Zahler für Transaktionsgebühren und Kontoerstellung
- Mint 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?