ネットワークへの書き込み

前のセクションでは、Solanaネットワークからデータを読み取る方法を学びました。ここでは、ネットワークにデータを書き込む方法を学びます。Solanaネットワークへの書き込みは、1つ以上のinstructionを含むトランザクションを送信することで行われます。

プログラムは各instructionが実行する業務ロジックを定義します。 トランザクションを送信すると、Solanaランタイムは各instructionを順番に、かつアトミックに実行します。このセクションの例では、Solanaプログラムを呼び出すためのトランザクションの構築と送信方法を示しています。例には以下が含まれます:

  1. アカウント間でのSOLの転送
  2. 新しいトークンの作成

SOLの転送

以下の例では、2つのアカウント間でSOLを転送します。各アカウントには所有者プログラムがあり、そのプログラムだけがアカウントのSOL残高を減らすことができます。

すべてのウォレットアカウントはSystem Programによって所有されています。SOLを転送するには、System Programのtransfer instructionを呼び出す必要があります。

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.

トランザクションの送信とアカウントデータの取得を処理するための Connection を作成します。

この例では、localhost:8899 で実行されるローカルテストvalidatorに接続しています。

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

送信者と受信者アカウントとして使用する新しいキーペアを生成します。

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

送信者アカウントにSOLを追加します。メインネット以外のネットワークでは、テスト用のSOLを取得するために requestAirdrop メソッドを使用できます。

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

SystemProgram.transfer() メソッドは、fromPubkeyアカウントからtoPubkeyアカウントに、指定された数のlamportsを転送するinstructionを作成します。

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

トランザクションを作成し、instructionをトランザクションに追加します。この例では、単一のinstructionを持つトランザクションを作成しています。ただし、複数のinstructionsをトランザクションに追加することも可能です。

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

トランザクションに署名してネットワークに送信します。送信者のkeypairは、そのアカウントからのSOL転送を承認するために署名者配列に必要です。

Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

トランザクションシグネチャは、Solana Explorerでトランザクションを検索するために使用できる一意の識別子です。

トランザクションの送信とアカウントデータの取得を処理するための Connection を作成します。

この例では、localhost:8899 で実行されるローカルテストvalidatorに接続しています。

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

送信者と受信者アカウントとして使用する新しいキーペアを生成します。

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

送信者アカウントにSOLを追加します。メインネット以外のネットワークでは、テスト用のSOLを取得するために requestAirdrop メソッドを使用できます。

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

SystemProgram.transfer() メソッドは、fromPubkeyアカウントからtoPubkeyアカウントに、指定された数のlamportsを転送するinstructionを作成します。

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

トランザクションを作成し、instructionをトランザクションに追加します。この例では、単一のinstructionを持つトランザクションを作成しています。ただし、複数のinstructionsをトランザクションに追加することも可能です。

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

トランザクションに署名してネットワークに送信します。送信者のkeypairは、そのアカウントからのSOL転送を承認するために署名者配列に必要です。

Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

トランザクションシグネチャは、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");

トークンを作成する

以下の例では、Token Extensions Programを使用してSolana上に新しいトークンを作成します。これには2つのinstructionsが必要です:

  1. System Programを呼び出して新しいアカウントを作成する。
  2. Token Extensions Programを呼び出して、そのアカウントを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.

トークンを作成するには、@solana/web3.js@solana/spl-tokenライブラリの両方を使用する必要があります。以下の例のコードでは次のことを行います:

  • コネクションを作成する
  • トランザクションの支払いに使用するkeypairを生成する
  • 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");

mintアカウント用のkeypairを生成します。公開鍵はmintアカウントのアドレスとして使用されます。

Mint keypair
const mint = new Keypair();

mintアカウントに必要な最小限のlamportsを計算します。getMinimumBalanceForRentExemptMint関数は、mintアカウント上のデータに割り当てる必要があるlamportの量を計算します。

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

最初のinstructionはSystem ProgramのcreateAccount instructionを呼び出して以下を行います:

  1. ミントデータを保存するために必要なバイト数を割り当てます。
  2. 新しいアカウントに資金を提供するために、ウォレットからlamportsを転送します。
  3. アカウントの所有権を割り当てて、 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
});

2番目のinstructionsは、 Token Extensions ProgramcreateInitializeMint2Instruction instructionを呼び出して、以下のデータでmint accountを初期化します:

  • 小数点以下2桁
  • ウォレットをミント権限とフリーズ権限の両方に設定
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

両方のinstructionsを1つのトランザクションに追加します。これにより、アカウントの作成と初期化が原子的に行われることが保証されます(両方のinstructionsが成功するか、どちらも実行されないかのどちらかです)。

このアプローチは、複雑なSolanaトランザクションを構築する際によく使用され、すべてのinstructionsが一緒に実行されることを保証します。

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

トランザクションに署名して送信します。2つの署名が必要です:

  • ウォレットアカウントは、トランザクション手数料とアカウント作成の支払者として署名します
  • ミントアカウントは、新しいアカウントのためにそのアドレスの使用を承認するために署名します
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

返されたトランザクション署名は、Solana Explorerでトランザクションを検査するために使用できます。

トークンを作成するには、@solana/web3.js@solana/spl-tokenライブラリの両方を使用する必要があります。以下の例のコードでは次のことを行います:

  • コネクションを作成する
  • トランザクションの支払いに使用するkeypairを生成する
  • 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");

mintアカウント用のkeypairを生成します。公開鍵はmintアカウントのアドレスとして使用されます。

Mint keypair
const mint = new Keypair();

mintアカウントに必要な最小限のlamportsを計算します。getMinimumBalanceForRentExemptMint関数は、mintアカウント上のデータに割り当てる必要があるlamportの量を計算します。

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

最初のinstructionはSystem ProgramのcreateAccount instructionを呼び出して以下を行います:

  1. ミントデータを保存するために必要なバイト数を割り当てます。
  2. 新しいアカウントに資金を提供するために、ウォレットからlamportsを転送します。
  3. アカウントの所有権を割り当てて、 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
});

2番目のinstructionsは、 Token Extensions ProgramcreateInitializeMint2Instruction instructionを呼び出して、以下のデータでmint accountを初期化します:

  • 小数点以下2桁
  • ウォレットをミント権限とフリーズ権限の両方に設定
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

両方のinstructionsを1つのトランザクションに追加します。これにより、アカウントの作成と初期化が原子的に行われることが保証されます(両方のinstructionsが成功するか、どちらも実行されないかのどちらかです)。

このアプローチは、複雑なSolanaトランザクションを構築する際によく使用され、すべてのinstructionsが一緒に実行されることを保証します。

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

トランザクションに署名して送信します。2つの署名が必要です:

  • ウォレットアカウントは、トランザクション手数料とアカウント作成の支払者として署名します
  • ミントアカウントは、新しいアカウントのためにそのアドレスの使用を承認するために署名します
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

返されたトランザクション署名は、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?

目次

ページを編集

管理運営

© 2025 Solana Foundation.
無断転載を禁じます。