Schrijven naar het netwerk

In de vorige sectie heb je geleerd hoe je gegevens kunt lezen van het Solana-netwerk. Nu ga je leren hoe je er gegevens naar kunt schrijven. Schrijven naar het Solana-netwerk houdt in dat je transacties verstuurt die één of meer instructies bevatten.

Programma's (smart contracts) definiëren de bedrijfslogica voor wat elke instructie doet. Wanneer je een transactie indient, voert de Solana-runtime elke instructie opeenvolgend en atomisch uit (wat betekent dat ofwel alle instructies slagen of de hele transactie mislukt).

Deze sectie behandelt de volgende voorbeelden:

  1. SOL overmaken tussen accounts
  2. Een nieuwe token creëren

Deze voorbeelden laten zien hoe je transacties kunt bouwen en verzenden om Solana- programma's aan te roepen. Voor meer details, raadpleeg de Transacties en instructies en Kosten op Solana pagina's.

SOL overmaken

In dit voorbeeld leer je hoe je SOL kunt overmaken tussen twee accounts.

Op Solana heeft elk account een specifiek programma als eigenaar. Alleen de programma- eigenaar kan het SOL (lamport) saldo van een account verminderen.

Het System Program is de eigenaar van alle "wallet" accounts. Om SOL over te maken, moet je de transfer instructie van het System Program aanroepen.

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.

Maak een Connection om transacties te verzenden en accountgegevens op te halen.

In dit voorbeeld maken we verbinding met de lokale testvalidator die draait op localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Genereer nieuwe keypairs om te gebruiken als de verzender- en ontvangeraccounts.

Een Keypair bevat:

  • Een publieke sleutel die dient als het accountadres
  • Een privésleutel die wordt gebruikt voor het ondertekenen van transacties
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Voordat we SOL kunnen overmaken, moet het verzenderaccount een SOL-saldo hebben.

Op andere netwerken dan het mainnet kun je de requestAirdrop methode gebruiken om SOL voor testen te krijgen.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

De SystemProgram.transfer() methode creëert een instructie die SOL overboekt van het fromPubkey account naar het toPubkey account voor het gespecificeerde lamports bedrag.

Transfer Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Maak een transactie en voeg de instructie toe aan de transactie.

In dit voorbeeld maken we een transactie met een enkele instructie. Je kunt echter meerdere instructies aan een transactie toevoegen.

Transaction
const transaction = new Transaction().add(transferInstruction);

Onderteken en verstuur de transactie naar het netwerk.

Het keypair van de afzender is vereist in de signers array om de overdracht van SOL vanaf hun account te autoriseren.

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

De transactiehandtekening is een unieke identificatie die gebruikt kan worden om de transactie op te zoeken in Solana Explorer.

Maak een Connection om transacties te verzenden en accountgegevens op te halen.

In dit voorbeeld maken we verbinding met de lokale testvalidator die draait op localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Genereer nieuwe keypairs om te gebruiken als de verzender- en ontvangeraccounts.

Een Keypair bevat:

  • Een publieke sleutel die dient als het accountadres
  • Een privésleutel die wordt gebruikt voor het ondertekenen van transacties
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Voordat we SOL kunnen overmaken, moet het verzenderaccount een SOL-saldo hebben.

Op andere netwerken dan het mainnet kun je de requestAirdrop methode gebruiken om SOL voor testen te krijgen.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

De SystemProgram.transfer() methode creëert een instructie die SOL overboekt van het fromPubkey account naar het toPubkey account voor het gespecificeerde lamports bedrag.

Transfer Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Maak een transactie en voeg de instructie toe aan de transactie.

In dit voorbeeld maken we een transactie met een enkele instructie. Je kunt echter meerdere instructies aan een transactie toevoegen.

Transaction
const transaction = new Transaction().add(transferInstruction);

Onderteken en verstuur de transactie naar het netwerk.

Het keypair van de afzender is vereist in de signers array om de overdracht van SOL vanaf hun account te autoriseren.

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

De transactiehandtekening is een unieke identificatie die gebruikt kan worden om de transactie op te zoeken in Solana Explorer.

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

Een token maken

In dit voorbeeld leer je hoe je een nieuw token op Solana kunt maken met behulp van het Token Extensions Program. Dit vereist twee instructies:

  1. Roep het System Program aan om een nieuw account te maken.
  2. Roep het Token Extensions Program aan om dat account te initialiseren als een Mint.
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.

Het creëren van een token op Solana vereist het gebruik van zowel de @solana/web3.js als de @solana/spl-token bibliotheken.

  • Maak een verbinding
  • Genereer een keypair om te betalen voor de transactie
  • Vraag een airdrop aan om de keypair te financieren
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");

Genereer een keypair voor de mint account.

De publieke sleutel van deze keypair zal worden gebruikt als het adres voor de mint account.

Mint Keypair
const mint = new Keypair();

Bereken de minimale hoeveelheid lamports die nodig is voor een mint account.

De getMinimumBalanceForRentExemptMint functie berekent precies hoeveel SOL (in lamports) er moet worden toegewezen voor de gegevens op een mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

De eerste instructie roept de createAccount instructie van het System Program aan om:

  1. De vereiste bytes toe te wijzen voor het opslaan van mint gegevens
  2. Lamports over te maken van de wallet om de nieuwe account te financieren
  3. Eigendom toe te wijzen van de account aan het Token Extensions programma (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
});

De tweede instructie roept de Token Extensions Program's createInitializeMint2Instruction instructie aan om de mint account te initialiseren met de volgende gegevens:

  • 2 decimalen
  • Wallet als zowel mint autoriteit als freeze autoriteit
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Voeg beide instructies toe aan een enkele transactie.

Door beide instructies te combineren in één transactie, zorg je ervoor dat het aanmaken en initialiseren van de account atomisch gebeurt. Ofwel beide instructies slagen, ofwel geen van beide.

Deze aanpak is gebruikelijk bij het bouwen van complexere Solana-transacties, omdat het garandeert dat alle instructies samen worden uitgevoerd.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Onderteken en verstuur de transactie. Twee handtekeningen zijn vereist:

  • Wallet ondertekent als betaler voor transactiekosten en het aanmaken van de account
  • Mint ondertekent om het gebruik van zijn adres voor de nieuwe account te autoriseren
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

De geretourneerde transactiehandtekening kan worden gebruikt om de transactie te inspecteren op Solana Explorer.

Het creëren van een token op Solana vereist het gebruik van zowel de @solana/web3.js als de @solana/spl-token bibliotheken.

  • Maak een verbinding
  • Genereer een keypair om te betalen voor de transactie
  • Vraag een airdrop aan om de keypair te financieren
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");

Genereer een keypair voor de mint account.

De publieke sleutel van deze keypair zal worden gebruikt als het adres voor de mint account.

Mint Keypair
const mint = new Keypair();

Bereken de minimale hoeveelheid lamports die nodig is voor een mint account.

De getMinimumBalanceForRentExemptMint functie berekent precies hoeveel SOL (in lamports) er moet worden toegewezen voor de gegevens op een mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

De eerste instructie roept de createAccount instructie van het System Program aan om:

  1. De vereiste bytes toe te wijzen voor het opslaan van mint gegevens
  2. Lamports over te maken van de wallet om de nieuwe account te financieren
  3. Eigendom toe te wijzen van de account aan het Token Extensions programma (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
});

De tweede instructie roept de Token Extensions Program's createInitializeMint2Instruction instructie aan om de mint account te initialiseren met de volgende gegevens:

  • 2 decimalen
  • Wallet als zowel mint autoriteit als freeze autoriteit
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Voeg beide instructies toe aan een enkele transactie.

Door beide instructies te combineren in één transactie, zorg je ervoor dat het aanmaken en initialiseren van de account atomisch gebeurt. Ofwel beide instructies slagen, ofwel geen van beide.

Deze aanpak is gebruikelijk bij het bouwen van complexere Solana-transacties, omdat het garandeert dat alle instructies samen worden uitgevoerd.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Onderteken en verstuur de transactie. Twee handtekeningen zijn vereist:

  • Wallet ondertekent als betaler voor transactiekosten en het aanmaken van de account
  • Mint ondertekent om het gebruik van zijn adres voor de nieuwe account te autoriseren
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

De geretourneerde transactiehandtekening kan worden gebruikt om de transactie te inspecteren op Solana Explorer.

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?

Inhoudsopgave

Pagina Bewerken