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.
Programas (contratos inteligentes) 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 atomicamente (o que significa que todas as instruções têm sucesso ou a transação inteira falha).
Esta seção abrange os seguintes exemplos:
- Transferindo SOL entre contas
- Criando um novo token
Estes exemplos mostram como construir e enviar transações para invocar programas da Solana. Para mais detalhes, consulte as páginas Transações e Instruções e Taxas na Solana.
Transferir SOL
Neste exemplo, você aprenderá como transferir SOL entre duas contas.
Na 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}`);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 da
conta.
Neste exemplo, estamos conectando ao validador de teste local que é executado em
localhost:8899
.
const connection = new Connection("http://localhost:8899", "confirmed");
Gere novos keypairs para usar como contas de remetente e destinatário.
Um Keypair
inclui:
- Uma chave pública que serve como endereço da conta
- Uma chave privada usada para assinar transações
const sender = new Keypair();const receiver = new Keypair();
Antes de transferir SOL, a conta do remetente precisa ter algum saldo em SOL.
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
na
quantidade especificada 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 conta dele.
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
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,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 na Solana requer o uso das bibliotecas @solana/web3.js
e
@solana/spl-token
.
- Crie uma conexão
- Gere um keypair para pagar pela transação
- Solicite 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 deste keypair será usada como o endereço para o mint account.
const mint = new Keypair();
Calcule o mínimo de lamports necessários para um mint account.
A função getMinimumBalanceForRentExemptMint
calcula exatamente quanto SOL (em
lamports) deve ser alocado 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 os bytes necessários para armazenar dados do mint
- Transferir lamports da carteira para financiar a nova conta
- Atribuir propriedade da conta ao Token Extensions
program (
TOKEN_2022_PROGRAM_ID
)
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 o 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.
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 é.
Esta abordagem é comum ao construir transações mais 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:
- Wallet assina como pagador das taxas de transação e criação da 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?