Scrivere sulla rete

Nella sezione precedente, hai imparato come leggere i dati dalla rete Solana. Ora imparerai come scrivere dati su di essa. Scrivere sulla rete Solana comporta l'invio di transazioni che contengono una o più istruzioni.

I programmi definiscono la logica di business per ciò che ogni istruzione fa. Quando invii una transazione, il runtime di Solana esegue ogni istruzione in sequenza e in modo atomico. Gli esempi in questa sezione mostrano come costruire e inviare transazioni per invocare i programmi Solana, tra cui:

  1. Trasferimento di SOL tra account
  2. Creazione di un nuovo token

Trasferire SOL

L'esempio seguente trasferisce SOL tra due account. Ogni account ha un programma proprietario, che è l'unico programma che può detrarre il saldo SOL dell'account.

Tutti gli account wallet sono di proprietà del System Program. Per trasferire SOL, devi invocare l'istruzione transfer del System Program.

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.

Crea un Connection per gestire l'invio di transazioni e il recupero dei dati dell'account.

In questo esempio, ci stiamo connettendo al validator di test locale che viene eseguito su localhost:8899.

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

Genera nuove coppie di chiavi da utilizzare come account mittente e destinatario.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Aggiungi SOL all'account mittente. Su reti diverse dalla mainnet, puoi utilizzare il metodo requestAirdrop per ottenere SOL per i test.

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

Il metodo SystemProgram.transfer() crea un'istruzione che trasferisce SOL dall'account fromPubkey all'account toPubkey per il numero specificato di lamports.

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

Crea una transazione e aggiungi l'istruzione alla transazione. In questo esempio, stiamo creando una transazione con una singola istruzione. Tuttavia, puoi aggiungere più istruzioni a una transazione.

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

Firma e invia la transazione alla rete. Il keypair del mittente è richiesto nell'array dei firmatari per autorizzare il trasferimento di SOL dal proprio account.

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

La firma della transazione è un identificatore unico che può essere utilizzato per cercare la transazione su Solana Explorer.

Crea un Connection per gestire l'invio di transazioni e il recupero dei dati dell'account.

In questo esempio, ci stiamo connettendo al validator di test locale che viene eseguito su localhost:8899.

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

Genera nuove coppie di chiavi da utilizzare come account mittente e destinatario.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Aggiungi SOL all'account mittente. Su reti diverse dalla mainnet, puoi utilizzare il metodo requestAirdrop per ottenere SOL per i test.

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

Il metodo SystemProgram.transfer() crea un'istruzione che trasferisce SOL dall'account fromPubkey all'account toPubkey per il numero specificato di lamports.

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

Crea una transazione e aggiungi l'istruzione alla transazione. In questo esempio, stiamo creando una transazione con una singola istruzione. Tuttavia, puoi aggiungere più istruzioni a una transazione.

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

Firma e invia la transazione alla rete. Il keypair del mittente è richiesto nell'array dei firmatari per autorizzare il trasferimento di SOL dal proprio account.

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

La firma della transazione è un identificatore unico che può essere utilizzato per cercare la transazione su 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");

Creare un token

L'esempio seguente crea un nuovo token su Solana utilizzando il Token Extensions Program. Questo richiede due istruzioni:

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

La creazione di un token richiede l'utilizzo delle librerie @solana/web3.js e @solana/spl-token. Il codice nell'esempio seguente:

  • Creerà una connessione
  • Genererà un keypair per pagare la transazione
  • Richiederà un airdrop per finanziare il keypair
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");

Genera un keypair per il mint account. La chiave pubblica sarà utilizzata come indirizzo del mint account.

Mint keypair
const mint = new Keypair();

Calcola i lamport minimi richiesti per un mint account. La funzione getMinimumBalanceForRentExemptMint calcola quanti lamport devono essere allocati per i dati su un mint account.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La prima istruzione invoca l'istruzione createAccount del System Program per:

  1. Alloca il numero di byte necessari per memorizzare i dati del mint.
  2. Trasferisci lamports dal wallet per finanziare il nuovo account.
  3. Assegna la proprietà dell'account al Token Extensions Program.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

La seconda istruzione invoca l'istruzione createInitializeMint2Instruction del Token Extensions Program per inizializzare il mint account con i seguenti dati:

  • 2 decimali
  • Wallet come autorità di mint e autorità di congelamento
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Aggiungi entrambe le istruzioni a una singola transazione. Questo garantisce che la creazione dell'account e l'inizializzazione avvengano in modo atomico. (O entrambe le istruzioni hanno successo, o nessuna delle due).

Questo approccio è comune quando si costruiscono transazioni complesse su Solana, poiché garantisce che tutte le istruzioni vengano eseguite insieme.

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

Firma e invia la transazione. Sono richieste due firme:

  • L'account wallet firma come pagatore per le commissioni di transazione e la creazione dell'account
  • L'account mint firma per autorizzare l'uso del suo indirizzo per il nuovo account
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

La firma della transazione restituita può essere utilizzata per ispezionare la transazione su Solana Explorer.

La creazione di un token richiede l'utilizzo delle librerie @solana/web3.js e @solana/spl-token. Il codice nell'esempio seguente:

  • Creerà una connessione
  • Genererà un keypair per pagare la transazione
  • Richiederà un airdrop per finanziare il keypair
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");

Genera un keypair per il mint account. La chiave pubblica sarà utilizzata come indirizzo del mint account.

Mint keypair
const mint = new Keypair();

Calcola i lamport minimi richiesti per un mint account. La funzione getMinimumBalanceForRentExemptMint calcola quanti lamport devono essere allocati per i dati su un mint account.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La prima istruzione invoca l'istruzione createAccount del System Program per:

  1. Alloca il numero di byte necessari per memorizzare i dati del mint.
  2. Trasferisci lamports dal wallet per finanziare il nuovo account.
  3. Assegna la proprietà dell'account al Token Extensions Program.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

La seconda istruzione invoca l'istruzione createInitializeMint2Instruction del Token Extensions Program per inizializzare il mint account con i seguenti dati:

  • 2 decimali
  • Wallet come autorità di mint e autorità di congelamento
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Aggiungi entrambe le istruzioni a una singola transazione. Questo garantisce che la creazione dell'account e l'inizializzazione avvengano in modo atomico. (O entrambe le istruzioni hanno successo, o nessuna delle due).

Questo approccio è comune quando si costruiscono transazioni complesse su Solana, poiché garantisce che tutte le istruzioni vengano eseguite insieme.

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

Firma e invia la transazione. Sono richieste due firme:

  • L'account wallet firma come pagatore per le commissioni di transazione e la creazione dell'account
  • L'account mint firma per autorizzare l'uso del suo indirizzo per il nuovo account
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

La firma della transazione restituita può essere utilizzata per ispezionare la transazione su 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?

Indice

Modifica Pagina

Gestito da

© 2025 Solana Foundation.
Tutti i diritti riservati.
Rimani Connesso