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:

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

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}`);
const senderBalance = await connection.getBalance(sender.publicKey);
const receiverBalance = await connection.getBalance(receiver.publicKey);
console.log("Sender Balance:", `${senderBalance}`);
console.log("Receiver Balance:", `${receiverBalance}`);
Console
Click to execute the code.

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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Gere novos keypairs para usar como contas de remetente e destinatário.

Generate keypairs
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.

Airdrop
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.

Transfer instruction
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.

Transaction
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.

Send transaction
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.

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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Gere novos keypairs para usar como contas de remetente e destinatário.

Generate keypairs
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.

Airdrop
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.

Transfer instruction
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.

Transaction
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.

Send transaction
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.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Criar um token

O exemplo abaixo cria 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,
getMint
} 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("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

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
Connection & wallet setup
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.

Mint keypair
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.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

A primeira instrução invoca a instrução createAccount do System Program para:

  1. Alocar o número de bytes necessários para armazenar os dados do mint.
  2. Transferir lamports da carteira para financiar a nova conta.
  3. Atribuir propriedade da conta ao Token Extensions Program.
Create account instruction
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
Initialize mint instruction
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.

Transaction
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
Send transaction
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.

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
Connection & wallet setup
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.

Mint keypair
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.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

A primeira instrução invoca a instrução createAccount do System Program para:

  1. Alocar o número de bytes necessários para armazenar os dados do mint.
  2. Transferir lamports da carteira para financiar a nova conta.
  3. Atribuir propriedade da conta ao Token Extensions Program.
Create account instruction
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
Initialize mint instruction
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.

Transaction
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
Send transaction
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.

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,
getMint
} from "@solana/spl-token";
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");

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2025 Fundação Solana.
Todos os direitos reservados.
Escrevendo na Rede | Solana