Nella sezione precedente, hai imparato come leggere i dati dalla rete Solana tramite il recupero degli account. Per scrivere dati sulla rete Solana è necessaria una transazione. Una transazione contiene una o più istruzioni, e ogni istruzione invoca un programma.
I programmi definiscono la logica di business per ogni istruzione. Quando invii una transazione, il runtime di Solana esegue le istruzioni della transazione in ordine. Le transazioni sono atomiche: o tutte le istruzioni della transazione hanno successo, oppure l'intera transazione fallisce.
Gli esempi in questa sezione mostrano come:
- Trasferire SOL tra account
- Creare un nuovo token mint
Trasferire SOL
L'esempio seguente trasferisce SOL da un account a un altro. Solo il programma designato come proprietario di un account può modificare i dati dell'account o detrarre lamport dal suo saldo. Gli account wallet sono di proprietà del System Program, quindi trasferire SOL tra account wallet richiede un'istruzione che invochi l'istruzione transfer del System Program. Anche l'account di origine deve firmare la transazione.
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);
Crea un client Kit per il validator di test locale. Questo frammento aggiunge un firmatario pagatore, si connette all'endpoint RPC locale, abilita gli airdrop e finanzia il pagatore con SOL di test per il trasferimento.
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)));
Genera un firmatario per il destinatario. Il mittente è client.payer, che è
stato creato da generatedPayer() e finanziato da airdropPayer().
const receiver = await generateKeyPairSigner();
L'helper getTransferSolInstruction() crea un'istruzione System Program.
L'istruzione trasferisce SOL dal firmatario source
all'indirizzo destination per la quantità specificata
di amount lamport.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
Chiama client.sendTransaction() con un array di istruzioni. Il client Kit
trasforma le istruzioni in un'unica transazione, firma con i firmatari associati
alle istruzioni, invia la transazione e attende la conferma.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
Dopo la conferma della transazione, recupera entrambi i saldi utilizzando
client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Crea un token
L'esempio seguente crea un nuovo mint token utilizzando il Token Extensions Program. Un mint account è l'account che definisce le impostazioni globali di un token, come decimali, fornitura, autorità di mint e autorità di blocco.
La creazione di un mint account richiede due istruzioni:
- Invocare il System Program per creare un nuovo account di proprietà del Token Extensions Program.
- Invocare il Token Extensions Program per inizializzare quell'account come mint.
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);
Crea e finanzia un client Kit, quindi genera un signer da utilizzare come indirizzo del nuovo mint account. Il pagante del client finanzia la creazione dell'account e paga la commissione di transazione.
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();
Calcola la dimensione del mint account in byte, quindi effettua una richiesta RPC per calcolare i lamport necessari per archiviare quei dati nell'account. Questo saldo richiesto è denominato rent.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
La prima istruzione invoca il System Program. L'istruzione utilizza il
payer per finanziare un newAccount,
alloca lo space del mint account, trasferisce i
lamports rent-exempt e assegna la proprietà al
programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
La seconda istruzione invoca il Token Extensions Program. L'istruzione
inizializza l'indirizzo del mint con un valore
decimals, un mintAuthority, un
freezeAuthority e specifica il
tokenProgram che possiede il mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Invia entrambe le istruzioni in un'unica transazione. L'istruzione di creazione dell'account deve venire prima dell'istruzione di inizializzazione del mint, poiché il mint account deve esistere prima che il Token Extensions Program possa scrivere i dati del mint sull'account.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
Dopo la conferma della transazione, recupera il mint account.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?