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 (smart contract) definiscono la logica di business per ciò che ogni istruzione fa. Quando invii una transazione, il runtime di Solana esegue ciascuna istruzione in sequenza e in modo atomico (il che significa che o tutte le istruzioni hanno successo o l'intera transazione fallisce).

Questa sezione copre i seguenti esempi:

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

Questi esempi mostrano come costruire e inviare transazioni per invocare i programmi di Solana. Per maggiori dettagli, consulta le pagine Transazioni e istruzioni e Commissioni su Solana.

Trasferimento di SOL

In questo esempio, imparerai come trasferire SOL tra due account.

Su Solana, ogni account ha un programma specifico come proprietario. Solo il programma proprietario può detrarre il saldo di SOL (lamport) di un account.

Il System Program è il proprietario di tutti gli account "wallet". 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 test validator locale che viene eseguito su localhost:8899.

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

Genera nuovi keypair da utilizzare come account mittente e destinatario.

Un Keypair include:

  • Una chiave pubblica che funge da indirizzo dell'account
  • Una chiave privata utilizzata per firmare le transazioni
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Prima di poter trasferire SOL, l'account mittente deve avere un saldo in SOL.

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 l'importo 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 è necessario 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 test validator locale che viene eseguito su localhost:8899.

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

Genera nuovi keypair da utilizzare come account mittente e destinatario.

Un Keypair include:

  • Una chiave pubblica che funge da indirizzo dell'account
  • Una chiave privata utilizzata per firmare le transazioni
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Prima di poter trasferire SOL, l'account mittente deve avere un saldo in SOL.

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 l'importo 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 è necessario 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");

Crea un token

In questo esempio, imparerai come creare 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 su Solana richiede l'utilizzo delle librerie @solana/web3.js e @solana/spl-token.

  • Crea una connessione
  • Genera un keypair per pagare la transazione
  • Richiedi 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 di questo keypair sarà utilizzata come indirizzo per il mint account.

Mint Keypair
const mint = new Keypair();

Calcola i lamport minimi richiesti per un mint account.

La funzione getMinimumBalanceForRentExemptMint calcola esattamente quanti SOL (in lamport) devono essere allocati per i dati su un mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

  1. Allocare i byte necessari per memorizzare i dati del mint
  2. Trasferire lamport dal wallet per finanziare il nuovo account
  3. Assegnare la proprietà dell'account al programma Token Extensions (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
});

La seconda istruzione richiama 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.

Combinando entrambe le istruzioni in un'unica transazione, ti assicuri 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 Solana più complesse, 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:

  • Wallet firma come pagatore per le commissioni di transazione e la creazione dell'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 su Solana richiede l'utilizzo delle librerie @solana/web3.js e @solana/spl-token.

  • Crea una connessione
  • Genera un keypair per pagare la transazione
  • Richiedi 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 di questo keypair sarà utilizzata come indirizzo per il mint account.

Mint Keypair
const mint = new Keypair();

Calcola i lamport minimi richiesti per un mint account.

La funzione getMinimumBalanceForRentExemptMint calcola esattamente quanti SOL (in lamport) devono essere allocati per i dati su un mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

  1. Allocare i byte necessari per memorizzare i dati del mint
  2. Trasferire lamport dal wallet per finanziare il nuovo account
  3. Assegnare la proprietà dell'account al programma Token Extensions (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
});

La seconda istruzione richiama 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.

Combinando entrambe le istruzioni in un'unica transazione, ti assicuri 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 Solana più complesse, 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:

  • Wallet firma come pagatore per le commissioni di transazione e la creazione dell'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