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:

  1. Übertragen von SOL zwischen Konten
  2. 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.

Transfer SOL
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}`);
Console
Click to execute the code.

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.

Connection
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
Generate Keypairs
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 requestAirdropMethode verwenden, um SOL für Tests zu erhalten.

Airdrop
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.

Transfer Instruction
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.

Transaction
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.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Die Transaktionssignatur ist eine eindeutige Kennung, die verwendet werden kann, um die Transaktion im Solana Explorer nachzuschlagen.

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.

Connection
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
Generate Keypairs
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 requestAirdropMethode verwenden, um SOL für Tests zu erhalten.

Airdrop
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.

Transfer Instruction
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.

Transaction
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.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Die Transaktionssignatur ist eine eindeutige Kennung, die verwendet werden kann, um die Transaktion im Solana Explorer nachzuschlagen.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Token erstellen

In diesem Beispiel lernst du, wie man einen neuen Token auf Solana mit dem Token Extensions Program erstellt. Dies erfordert zwei Anweisungen:

  1. Rufe das System Program auf, um ein neues Konto zu erstellen.
  2. Rufe das Token Extensions Program auf, um dieses Konto als Mint zu initialisieren.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

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
Connection & Wallet Setup
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.

Mint Keypair
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.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Die erste Anweisung ruft die createAccount Anweisung des System Programs auf, um:

  1. Die erforderlichen Bytes zuzuweisen zum Speichern von Mint-Daten
  2. Lamports zu übertragen vom Wallet zur Finanzierung des neuen Konten
  3. Die Eigentümerschaft zuzuweisen des Konten an das Token Extensions Program (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
Initialize Mint Instruction
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.

Transaction
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
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Die zurückgegebene Transaktionssignatur kann verwendet werden, um die Transaktion im Solana Explorer zu überprüfen.

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
Connection & Wallet Setup
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.

Mint Keypair
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.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Die erste Anweisung ruft die createAccount Anweisung des System Programs auf, um:

  1. Die erforderlichen Bytes zuzuweisen zum Speichern von Mint-Daten
  2. Lamports zu übertragen vom Wallet zur Finanzierung des neuen Konten
  3. Die Eigentümerschaft zuzuweisen des Konten an das Token Extensions Program (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
Initialize Mint Instruction
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.

Transaction
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
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Die zurückgegebene Transaktionssignatur kann verwendet werden, um die Transaktion im Solana Explorer zu überprüfen.

Create Mint Account
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();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten