Scrivere sulla rete
Nella sezione precedente, hai imparato come leggere i dati dalla rete Solana. Ora esploriamo 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) elaborano queste istruzioni secondo la loro logica di business per ciascuna rispettiva istruzione. Quando invii una transazione, il runtime di Solana esegue ogni istruzione in sequenza e in modo atomico (il che significa che o tutte le istruzioni hanno successo o l'intera transazione fallisce).
In questa sezione, vedrai due esempi di base:
- Trasferimento di SOL tra account
- Creazione di un nuovo token
Questi esempi mostrano come costruire e inviare transazioni per invocare i programmi Solana. Per maggiori dettagli, consulta le pagine Transazioni e Istruzioni e Commissioni su Solana.
Trasferire 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 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}`);
Questi sono i passaggi per costruire transazioni per interagire con qualsiasi programma su Solana.
Crea l'istruzione che vuoi invocare.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Aggiungi l'istruzione a una transazione:
const transaction = new Transaction().add(transferInstruction);
Firma e invia la transazione:
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender] // signer keypair);
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} 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("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Ecco una spiegazione passo dopo passo di ciò che fa l'esempio:
Crea una connessione e finanzia il wallet
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 una keypair per l'account Mint
const mint = new Keypair();
Calcola i lamport minimi per l'esenzione dal rent
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Crea un'istruzione per creare un nuovo account
- Alloca lo spazio necessario per memorizzare i dati del mint
- Trasferisci i lamport dal wallet per finanziare il nuovo account
- Assegna 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});
Crea un'istruzione per inizializzare l'account Mint
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
Aggiungi entrambe le istruzioni a una transazione
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Invia e conferma la transazione con entrambi i firmatari richiesti
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
Stampa l'account Mint e la firma della transazione
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Combinando entrambe le istruzioni in un'unica transazione, garantisci che la creazione e l'inizializzazione dell'account 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.
Is this page helpful?