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:
- Trasferimento di SOL tra account
- 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.
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}`);
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
.
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
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.
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
.
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.
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.
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 token
In questo esempio, imparerai come creare un nuovo token su Solana utilizzando il Token Extensions Program. Questo richiede due istruzioni:
- Invocare il System Program per creare un nuovo account.
- Invocare il Token Extensions Program per inizializzare quell'account come Mint.
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 SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
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
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.
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.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
La prima istruzione richiama l'istruzione createAccount
del System Program
per:
- Allocare i byte necessari per memorizzare i dati del mint
- Trasferire lamport dal wallet per finanziare il nuovo account
- Assegnare la proprietà dell'account al programma Token
Extensions (
TOKEN_2022_PROGRAM_ID
)
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
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.
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
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
La firma della transazione restituita può essere utilizzata per ispezionare la transazione su Solana Explorer.
Is this page helpful?