Escrevendo na Rede
Na seção anterior, você aprendeu como ler dados da rede Solana. Agora você aprenderá como escrever dados nela. Escrever na rede Solana envolve enviar transações que contêm uma ou mais instruções.
Os programas definem a lógica de negócios para o que cada instrução faz. Quando você envia uma transação, o runtime da Solana executa cada instrução em sequência e de forma atômica. Os exemplos nesta seção mostram como construir e enviar transações para invocar programas Solana, eles incluem:
- Transferir SOL entre contas
- Criar um novo token
Transferir SOL
O exemplo abaixo transfere SOL entre duas contas. Cada conta tem um programa proprietário, que é o único programa que pode deduzir o saldo de SOL da conta.
Todas as contas de carteira são de propriedade do System Program. 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}`);const senderBalance = await connection.getBalance(sender.publicKey);const receiverBalance = await connection.getBalance(receiver.publicKey);console.log("Sender Balance:", `${senderBalance}`);console.log("Receiver Balance:", `${receiverBalance}`);
Crie um Connection para lidar com o envio de transações e busca de dados de
contas.
Neste exemplo, estamos nos conectando ao validador de teste local que roda em
localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Gere novos keypairs para usar como contas de remetente e destinatário.
const sender = new Keypair();const receiver = new Keypair();
Adicione SOL à conta do remetente. Em redes que não sejam a mainnet, você pode
usar o método requestAirdrop para obter SOL para testes.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
O método SystemProgram.transfer() cria uma instrução que transfere SOL da
conta fromPubkey para a conta toPubkey para o
número especificado de lamports.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Crie uma transação e adicione a instrução à transação. Neste exemplo, estamos criando uma transação com uma única instrução. No entanto, você pode adicionar várias instruções a uma transação.
const transaction = new Transaction().add(transferInstruction);
Assine e envie a transação para a rede. O keypair do remetente é necessário no array de signatários para autorizar a transferência de SOL da sua conta.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
A assinatura da transação é um identificador único que pode ser usado para consultar a transação no Solana Explorer.
Criar um token
O exemplo abaixo cria 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,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););
Criar um token requer o uso das bibliotecas @solana/web3.js e
@solana/spl-token. O código no exemplo abaixo irá:
- Criar uma conexão
- Gerar um keypair para pagar pela transação
- Solicitar um airdrop para financiar o 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");
Gere um keypair para o mint account. A chave pública será usada como o endereço do mint account.
const mint = new Keypair();
Calcule o mínimo de lamports necessários para um mint account. A função
getMinimumBalanceForRentExemptMint calcula quantos lamports devem ser alocados
para os dados em um mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
A primeira instrução invoca a instrução createAccount do System Program para:
- Alocar o número de bytes necessários para armazenar os dados do mint.
- Transferir lamports da carteira para financiar a nova conta.
- Atribuir propriedade da conta ao Token Extensions Program.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
A segunda instrução invoca a instrução createInitializeMint2Instruction do
Token Extensions Program para inicializar a mint account
com os seguintes dados:
- 2 decimais
- Carteira como autoridade de mint e autoridade de congelamento
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Adicione ambas as instruções a uma única transação. Isso 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 complexas na Solana, pois garante que todas as instruções sejam executadas juntas.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Assine e envie a transação. Duas assinaturas são necessárias:
- A conta da carteira assina como pagadora das taxas de transação e criação da conta
- A conta mint assina para autorizar o uso de seu endereço para a nova conta
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
A assinatura da transação retornada pode ser usada para inspecionar a transação no Solana Explorer.
Is this page helpful?