Escrevendo na rede
Na seção anterior, você aprendeu como ler dados da rede Solana. Agora explore como escrever dados nela. Escrever na rede Solana envolve enviar transações que contêm uma ou mais instruções.
Programas (smart contracts) processam essas instruções de acordo com sua lógica de negócios para cada instrução respectiva. Quando você envia uma transação, o runtime do Solana executa cada instrução em sequência e atomicamente (o que significa que ou todas as instruções são bem-sucedidas ou toda a transação falha).
Nesta seção, você verá dois exemplos básicos:
- Transferindo SOL entre contas
- Criando um novo token
Esses exemplos mostram como construir e enviar transações para invocar programas do Solana. Para mais detalhes, consulte as páginas Transações e Instruções e Taxas no Solana.
Transferir SOL
Neste exemplo, você aprenderá como transferir SOL entre duas contas.
No Solana, cada conta tem um programa específico como seu proprietário. Apenas o programa proprietário pode deduzir o saldo de SOL (lamport) de uma conta.
O System Program é o proprietário de todas as contas "carteira". Para transferir SOL, você deve invocar a instrução transfer do 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}`);
Estes são os passos para construir transações para interagir com qualquer programa na Solana.
Crie a instrução que você deseja invocar.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Adicione a instrução a uma transação:
const transaction = new Transaction().add(transferInstruction);
Assine e envie a transação:
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender] // signer keypair);
Criar um token
Neste exemplo, você aprenderá como criar um novo token na Solana usando o Token Extensions Program. Isso requer duas instruções:
- Invocar o System Program para criar uma nova conta.
- Invocar o Token Extensions Program para inicializar essa conta como um 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}`);
Aqui está uma explicação passo a passo do que o exemplo faz:
Crie uma conexão e financie a carteira
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");
Gerar um keypair para a conta Mint
const mint = new Keypair();
Calcular o mínimo de lamports para isenção de rent
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Criar uma instrução para criar uma nova conta
- Alocar o espaço necessário para armazenar dados do mint
- Transferir lamports da carteira para financiar a nova conta
- Atribuir propriedade da conta ao programa 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});
Criar uma instrução para inicializar a conta Mint
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
Adicionar ambas as instruções a uma transação
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Enviar e confirmar a transação com ambos os signatários necessários
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
Imprimir a conta Mint e a assinatura da transação
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Ao combinar ambas as instruções em uma única transação, você garante que a criação e inicialização da conta aconteçam de forma atômica. Ou ambas as instruções são bem-sucedidas, ou nenhuma delas é. Essa abordagem é comum ao construir transações Solana mais complexas, pois garante que todas as instruções sejam executadas juntas.
Is this page helpful?