Scrivere sulla rete

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:

  1. Trasferire SOL tra account
  2. 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.

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.

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.

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)));

Genera un firmatario per il destinatario. Il mittente è client.payer, che è stato creato da generatedPayer() e finanziato da airdropPayer().

Receiver signer
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.

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

Send transaction
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.

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

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.

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)));

Genera un firmatario per il destinatario. Il mittente è client.payer, che è stato creato da generatedPayer() e finanziato da airdropPayer().

Receiver signer
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.

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

Send transaction
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.

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)));

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:

  1. Invocare il System Program per creare un nuovo account di proprietà del Token Extensions Program.
  2. Invocare il Token Extensions Program per inizializzare quell'account come 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.

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.

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();

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.

Mint account size and 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.

Create account instruction
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.

Initialize mint instruction
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.

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

Dopo la conferma della transazione, recupera il mint account.

Fetch mint account
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.

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();

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.

Mint account size and 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.

Create account instruction
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.

Initialize mint instruction
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.

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

Dopo la conferma della transazione, recupera il mint account.

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?

Indice dei contenuti

Modifica pagina
© 2026 Solana Foundation. Tutti i diritti riservati.