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:
- Trasferimento di SOL tra account
- 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.
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 validator di test locale che viene
eseguito su localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Genera nuove coppie di chiavi da utilizzare come account mittente e destinatario.
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.
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.
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 è richiesto 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.
Creare un token
L'esempio seguente crea 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 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
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.
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.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
La prima istruzione invoca l'istruzione createAccount del System Program per:
- Alloca il numero di byte necessari per memorizzare i dati del mint.
- Trasferisci lamports dal wallet per finanziare il nuovo account.
- Assegna la proprietà dell'account al Token Extensions Program.
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
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.
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
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?