Schrijven naar het netwerk

In het vorige gedeelte hebt u geleerd hoe u gegevens van het Solana-netwerk kunt lezen door accounts op te halen. Het schrijven van gegevens naar het Solana-netwerk vereist een transactie. Een transactie bevat een of meer instructies, en elke instructie roept een programma aan.

Programma's definiëren de bedrijfslogica voor elke instructie. Wanneer u een transactie verzendt, voert de Solana-runtime de instructies van de transactie op volgorde uit. Transacties zijn atomair. Ofwel slaagt elke instructie in de transactie, ofwel mislukt de gehele transactie.

De voorbeelden in dit gedeelte laten zien hoe u:

  1. SOL overdraagt tussen accounts
  2. Een nieuwe token mint aanmaakt

SOL overdragen

Het onderstaande voorbeeld draagt SOL over van het ene account naar het andere. Alleen het programma dat is aangewezen als eigenaar van een account kan de gegevens van dat account wijzigen of lamports van het saldo aftrekken. Wallet-accounts zijn eigendom van het System Program, dus voor het overdragen van SOL tussen wallet-accounts is een instructie vereist die het System Program's transfer instructie aanroept. Het bronaccount moet de transactie ook ondertekenen.

Transfer SOL
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";
import { getTransferSolInstruction } from "@solana-program/system";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));
const receiver = await generateKeyPairSigner();
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
console.log("Sender Balance:", senderBalance);
console.log("Receiver Balance:", receiverBalance);
Console
Click to execute the code.

Maak een Kit-client aan voor de lokale test-validator. Dit fragment voegt een betalende ondertekenaar toe, maakt verbinding met het lokale RPC-eindpunt, schakelt airdrops in en financiert de betaler met test-SOL voor de overdracht.

Client setup
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));

Genereer een ondertekenaar voor de ontvanger. De verzender is client.payer, die werd aangemaakt door generatedPayer() en gefinancierd door airdropPayer().

Receiver signer
const receiver = await generateKeyPairSigner();

De getTransferSolInstruction() helper maakt een System Program instructie aan. De instructie draagt SOL over van de source ondertekenaar naar het destination adres voor het opgegeven amount aan lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

Roep client.sendTransaction() aan met een reeks instructies. De Kit-client zet de instructies om in één transactie, ondertekent met de ondertekenaars die aan de instructies zijn gekoppeld, verstuurt de transactie en wacht op bevestiging.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Nadat de transactie is bevestigd, haal je beide saldi op met client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();

Maak een Kit-client aan voor de lokale test-validator. Dit fragment voegt een betalende ondertekenaar toe, maakt verbinding met het lokale RPC-eindpunt, schakelt airdrops in en financiert de betaler met test-SOL voor de overdracht.

Client setup
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));

Genereer een ondertekenaar voor de ontvanger. De verzender is client.payer, die werd aangemaakt door generatedPayer() en gefinancierd door airdropPayer().

Receiver signer
const receiver = await generateKeyPairSigner();

De getTransferSolInstruction() helper maakt een System Program instructie aan. De instructie draagt SOL over van de source ondertekenaar naar het destination adres voor het opgegeven amount aan lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

Roep client.sendTransaction() aan met een reeks instructies. De Kit-client zet de instructies om in één transactie, ondertekent met de ondertekenaars die aan de instructies zijn gekoppeld, verstuurt de transactie en wacht op bevestiging.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Nadat de transactie is bevestigd, haal je beide saldi op met client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
Transfer SOL
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";
import { getTransferSolInstruction } from "@solana-program/system";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));

Een token aanmaken

Het onderstaande voorbeeld maakt een nieuwe token mint aan met behulp van het Token Extensions Program. Een mint account is het account dat de algemene instellingen van een token definieert, zoals decimalen, aanbod, mint authoriteit en bevriezingsauthoriteit.

Het aanmaken van een mint account vereist twee instructies:

  1. Roep het System Program aan om een nieuw account te maken dat eigendom is van het Token Extensions Program.
  2. Roep het Token Extensions Program aan om dat account te initialiseren als een mint.
Create mint account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";
import { getCreateAccountInstruction } from "@solana-program/system";
import {
fetchMint,
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS
} from "@solana-program/token-2022";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));
const mint = await generateKeyPairSigner();
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
const createAccountInstruction = getCreateAccountInstruction({
payer: client.payer,
newAccount: mint,
space,
lamports: rent,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 2,
mintAuthority: client.payer.address,
freezeAuthority: client.payer.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", result.context.signature);
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Console
Click to execute the code.

Maak een Kit-client aan en financier deze, genereer vervolgens een ondertekenaar om te gebruiken als adres van het nieuwe mint account. De betalende client financiert het aanmaken van het account en betaalt de transactiekosten.

Client and mint setup
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));
const mint = await generateKeyPairSigner();

Bereken de grootte van het mint account in bytes en doe vervolgens een RPC-verzoek om de benodigde lamports te berekenen voor het opslaan van die gegevens in het account. Dit vereiste saldo wordt rent genoemd.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

De eerste instructie roept het System Program aan. De instructie gebruikt de payer om een newAccount te financieren, wijst de mint account space toe, draagt de rent-vrijgestelde lamports over en wijst het eigendom toe aan het programAddress.

Create account instruction
const createAccountInstruction = getCreateAccountInstruction({
payer: client.payer,
newAccount: mint,
space,
lamports: rent,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});

De tweede instructie roept het Token Extensions Program aan. De instructie initialiseert het mint adres met een decimals waarde, een mintAuthority, een freezeAuthority, en specificeert het tokenProgram dat eigenaar is van het mint account.

Initialize mint instruction
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 2,
mintAuthority: client.payer.address,
freezeAuthority: client.payer.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});

Verstuur beide instructies in één transactie. De instructie voor het aanmaken van de account moet komen vóór de instructie voor het initialiseren van de mint, omdat de mint account moet bestaan voordat het Token Extensions Program mint-gegevens naar de account kan schrijven.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Nadat de transactie is bevestigd, haal je de mint account op.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);

Maak een Kit-client aan en financier deze, genereer vervolgens een ondertekenaar om te gebruiken als adres van het nieuwe mint account. De betalende client financiert het aanmaken van het account en betaalt de transactiekosten.

Client and mint setup
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));
const mint = await generateKeyPairSigner();

Bereken de grootte van het mint account in bytes en doe vervolgens een RPC-verzoek om de benodigde lamports te berekenen voor het opslaan van die gegevens in het account. Dit vereiste saldo wordt rent genoemd.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

De eerste instructie roept het System Program aan. De instructie gebruikt de payer om een newAccount te financieren, wijst de mint account space toe, draagt de rent-vrijgestelde lamports over en wijst het eigendom toe aan het programAddress.

Create account instruction
const createAccountInstruction = getCreateAccountInstruction({
payer: client.payer,
newAccount: mint,
space,
lamports: rent,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});

De tweede instructie roept het Token Extensions Program aan. De instructie initialiseert het mint adres met een decimals waarde, een mintAuthority, een freezeAuthority, en specificeert het tokenProgram dat eigenaar is van het mint account.

Initialize mint instruction
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 2,
mintAuthority: client.payer.address,
freezeAuthority: client.payer.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});

Verstuur beide instructies in één transactie. De instructie voor het aanmaken van de account moet komen vóór de instructie voor het initialiseren van de mint, omdat de mint account moet bestaan voordat het Token Extensions Program mint-gegevens naar de account kan schrijven.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Nadat de transactie is bevestigd, haal je de mint account op.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Create mint account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";
import { getCreateAccountInstruction } from "@solana-program/system";
import {
fetchMint,
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS
} from "@solana-program/token-2022";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop())
.use(airdropPayer(lamports(1_000_000_000n)));
const mint = await generateKeyPairSigner();

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.