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

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

プログラム(スマートコントラクト)は各instructionが実行するビジネスロジックを定義します。トランザクションを送信すると、Solanaランタイムは各instructionを順番に原子的に実行します(つまり、すべてのinstructionsが成功するか、トランザクション全体が失敗するかのどちらかです)。

このセクションでは、以下の例を取り上げます:

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

これらの例は、Solanaプログラムを呼び出すためのトランザクションの構築と送信方法を示しています。詳細については、トランザクションとInstructionsおよび Solanaの手数料のページを参照してください。

SOLの転送

この例では、2つのアカウント間でSOLを転送する方法を学びます。

Solanaでは、各アカウントには特定のプログラムが所有者として設定されています。所有者プログラムのみがアカウントのSOL(lamport)残高を減らすことができます。

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

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

Keypairには以下が含まれます:

  • アカウントアドレスとして機能する公開鍵
  • トランザクションの署名に使用される秘密鍵
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

SOLを転送する前に、送信者アカウントにSOL残高が必要です。

メインネット以外のネットワークでは、テスト用のSOLを取得するためにrequestAirdropメソッドを使用できます。

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

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

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

トランザクションを作成し、instructionsをトランザクションに追加します。

この例では、単一のinstructionsを持つトランザクションを作成しています。ただし、複数の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");

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

Keypairには以下が含まれます:

  • アカウントアドレスとして機能する公開鍵
  • トランザクションの署名に使用される秘密鍵
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

SOLを転送する前に、送信者アカウントにSOL残高が必要です。

メインネット以外のネットワークでは、テスト用のSOLを取得するためにrequestAirdropメソッドを使用できます。

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

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

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

トランザクションを作成し、instructionsをトランザクションに追加します。

この例では、単一のinstructionsを持つトランザクションを作成しています。ただし、複数の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でトークンを作成するには、@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");

ミントアカウント用のkeypairを生成します。

このkeypairの公開鍵がミントアカウントのアドレスとして使用されます。

Mint Keypair
const mint = new Keypair();

ミントアカウントに必要な最小限のlamportsを計算します。

getMinimumBalanceForRentExemptMint関数は、ミントアカウントのデータに割り当てる必要があるSOL(lamports単位)の正確な量を計算します。

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

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

2番目のinstructionsはToken Extensions ProgramcreateInitializeMint2Instruction instructionsを呼び出して、ミントアカウントを以下のデータで初期化します:

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

両方の instructions を1つのトランザクションに追加します。

両方の 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でトークンを作成するには、@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");

ミントアカウント用のkeypairを生成します。

このkeypairの公開鍵がミントアカウントのアドレスとして使用されます。

Mint Keypair
const mint = new Keypair();

ミントアカウントに必要な最小限のlamportsを計算します。

getMinimumBalanceForRentExemptMint関数は、ミントアカウントのデータに割り当てる必要があるSOL(lamports単位)の正確な量を計算します。

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

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

2番目のinstructionsはToken Extensions ProgramcreateInitializeMint2Instruction instructionsを呼び出して、ミントアカウントを以下のデータで初期化します:

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

両方の instructions を1つのトランザクションに追加します。

両方の 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?

目次

ページを編集