ネットワークへの書き込み
前のセクションでは、Solanaネットワークからデータを読み取る方法を学びました。ここでは、ネットワークにデータを書き込む方法を学びます。Solanaネットワークへの書き込みは、1つ以上のinstructionを含むトランザクションを送信することで行われます。
プログラムは各instructionが実行する業務ロジックを定義します。 トランザクションを送信すると、Solanaランタイムは各instructionを順番に、かつアトミックに実行します。このセクションの例では、Solanaプログラムを呼び出すためのトランザクションの構築と送信方法を示しています。例には以下が含まれます:
- アカウント間でのSOLの転送
- 新しいトークンの作成
SOLの転送
以下の例では、2つのアカウント間でSOLを転送します。各アカウントには所有者プログラムがあり、そのプログラムだけがアカウントのSOL残高を減らすことができます。
すべてのウォレットアカウントはSystem Programによって所有されています。SOLを転送するには、System Programのtransfer instructionを呼び出す必要があります。
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}`);
トランザクションの送信とアカウントデータの取得を処理するための Connection
を作成します。
この例では、localhost:8899
で実行されるローカルテストvalidatorに接続しています。
const connection = new Connection("http://localhost:8899", "confirmed");
送信者と受信者アカウントとして使用する新しいキーペアを生成します。
const sender = new Keypair();const receiver = new Keypair();
送信者アカウントにSOLを追加します。メインネット以外のネットワークでは、テスト用のSOLを取得するために
requestAirdrop メソッドを使用できます。
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
SystemProgram.transfer()
メソッドは、fromPubkeyアカウントからtoPubkeyアカウントに、指定された数のlamportsを転送するinstructionを作成します。
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
トランザクションを作成し、instructionをトランザクションに追加します。この例では、単一のinstructionを持つトランザクションを作成しています。ただし、複数のinstructionsをトランザクションに追加することも可能です。
const transaction = new Transaction().add(transferInstruction);
トランザクションに署名してネットワークに送信します。送信者のkeypairは、そのアカウントからのSOL転送を承認するために署名者配列に必要です。
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
トランザクションシグネチャは、Solana Explorerでトランザクションを検索するために使用できる一意の識別子です。
トークンを作成する
以下の例では、Token Extensions Programを使用してSolana上に新しいトークンを作成します。これには2つのinstructionsが必要です:
- System Programを呼び出して新しいアカウントを作成する。
- Token Extensions Programを呼び出して、そのアカウントを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););
トークンを作成するには、@solana/web3.jsと@solana/spl-tokenライブラリの両方を使用する必要があります。以下の例のコードでは次のことを行います:
- コネクションを作成する
- トランザクションの支払いに使用するkeypairを生成する
- 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");
mintアカウント用のkeypairを生成します。公開鍵はmintアカウントのアドレスとして使用されます。
const mint = new Keypair();
mintアカウントに必要な最小限のlamportsを計算します。getMinimumBalanceForRentExemptMint関数は、mintアカウント上のデータに割り当てる必要があるlamportの量を計算します。
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
最初のinstructionはSystem ProgramのcreateAccount
instructionを呼び出して以下を行います:
- ミントデータを保存するために必要なバイト数を割り当てます。
- 新しいアカウントに資金を提供するために、ウォレットからlamportsを転送します。
- アカウントの所有権を割り当てて、 Token Extensions programに帰属させます。
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
2番目のinstructionsは、 Token Extensions Programの
createInitializeMint2Instruction instructionを呼び出して、以下のデータでmint
accountを初期化します:
- 小数点以下2桁
- ウォレットをミント権限とフリーズ権限の両方に設定
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
両方のinstructionsを1つのトランザクションに追加します。これにより、アカウントの作成と初期化が原子的に行われることが保証されます(両方のinstructionsが成功するか、どちらも実行されないかのどちらかです)。
このアプローチは、複雑なSolanaトランザクションを構築する際によく使用され、すべてのinstructionsが一緒に実行されることを保証します。
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
トランザクションに署名して送信します。2つの署名が必要です:
- ウォレットアカウントは、トランザクション手数料とアカウント作成の支払者として署名します
- ミントアカウントは、新しいアカウントのためにそのアドレスの使用を承認するために署名します
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
返されたトランザクション署名は、Solana Explorerでトランザクションを検査するために使用できます。
Is this page helpful?