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:

  1. Trasferimento di SOL tra account
  2. 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.

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}`);
Click to execute the code.

Questi sono i passaggi per costruire transazioni per interagire con qualsiasi programma su Solana.

Crea l'istruzione che vuoi invocare.

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

Aggiungi l'istruzione a una transazione:

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

Firma e invia la transazione:

Send Transaction
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:

  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
} 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("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);
Click to execute the code.

Ecco una spiegazione passo dopo passo di ciò che fa l'esempio:

Crea una connessione e finanzia il wallet

Connection and 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

Mint Keypair
const mint = new Keypair();

Calcola i lamport minimi per l'esenzione dal rent

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Crea un'istruzione per creare un nuovo account

  1. Alloca lo spazio necessario per memorizzare i dati del mint
  2. Trasferisci i lamport dal wallet per finanziare il nuovo account
  3. Assegna 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
});

Crea un'istruzione per inizializzare l'account Mint

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Aggiungi entrambe le istruzioni a una transazione

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

Invia e conferma la transazione con entrambi i firmatari richiesti

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[wallet, mint]
);

Stampa l'account Mint e la firma della transazione

Output
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?

Indice

Modifica Pagina