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:

  1. Transferindo SOL entre contas
  2. 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.

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

Estes são os passos para construir transações para interagir com qualquer programa na Solana.

Crie a instrução que você deseja invocar.

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

Adicione a instrução a uma transação:

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

Assine e envie a transação:

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

  1. Invocar o System Program para criar uma nova conta.
  2. Invocar o Token Extensions Program para inicializar essa conta como um 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}`);
Console
Click to execute the code.

Aqui está uma explicação passo a passo do que o exemplo faz:

Crie uma conexão e financie a carteira

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");

Gerar um keypair para a conta Mint

Mint Keypair
const mint = new Keypair();

Calcular o mínimo de lamports para isenção de rent

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Criar uma instrução para criar uma nova conta

  1. Alocar o espaço necessário para armazenar dados do mint
  2. Transferir lamports da carteira para financiar a nova conta
  3. Atribuir propriedade da conta ao programa 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
});

Criar uma instrução para inicializar a conta Mint

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

Adicionar ambas as instruções a uma transação

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

Enviar e confirmar a transação com ambos os signatários necessários

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

Imprimir a conta Mint e a assinatura da transação

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

Índice

Editar Página