ネットワークへの書き込み
前のセクションでは、Solanaネットワークからデータを読み取る方法を学びました。ここでは、ネットワークにデータを書き込む方法を学びます。Solanaネットワークへの書き込みは、1つ以上のinstructionsを含むトランザクションの送信を伴います。
プログラム(スマートコントラクト)は各instructionが実行するビジネスロジックを定義します。トランザクションを送信すると、Solanaランタイムは各instructionを順番に原子的に実行します(つまり、すべてのinstructionsが成功するか、トランザクション全体が失敗するかのどちらかです)。
このセクションでは、以下の例を取り上げます:
- アカウント間でのSOLの転送
- 新しいトークンの作成
これらの例は、Solanaプログラムを呼び出すためのトランザクションの構築と送信方法を示しています。詳細については、トランザクションとInstructionsおよび Solanaの手数料のページを参照してください。
SOLの転送
この例では、2つのアカウント間でSOLを転送する方法を学びます。
Solanaでは、各アカウントには特定のプログラムが所有者として設定されています。所有者プログラムのみがアカウントのSOL(lamport)残高を減らすことができます。
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");
送信者と受信者アカウントとして使用する新しいkeypairを生成します。
Keypair
には以下が含まれます:
- アカウントアドレスとして機能する公開鍵
- トランザクションの署名に使用される秘密鍵
const sender = new Keypair();const receiver = new Keypair();
SOLを転送する前に、送信者アカウントにSOL残高が必要です。
メインネット以外のネットワークでは、テスト用のSOLを取得するためにrequestAirdrop
メソッドを使用できます。
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
SystemProgram.transfer()
メソッドは、fromPubkey
アカウントから toPubkey
アカウントへ、指定された
lamports
量のSOLを転送するinstructionsを作成します。
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
トランザクションを作成し、instructionsをトランザクションに追加します。
この例では、単一のinstructionsを持つトランザクションを作成しています。ただし、複数の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でトークンを作成するには、@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");
ミントアカウント用のkeypairを生成します。
このkeypairの公開鍵がミントアカウントのアドレスとして使用されます。
const mint = new Keypair();
ミントアカウントに必要な最小限のlamportsを計算します。
getMinimumBalanceForRentExemptMint
関数は、ミントアカウントのデータに割り当てる必要があるSOL(lamports単位)の正確な量を計算します。
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
最初のinstructionsはSystem ProgramのcreateAccount
instructionsを呼び出して以下を行います:
- ミントデータを保存するために必要なバイト数を割り当てる
- 新しいアカウントに資金を提供するためにウォレットからlamportsを転送する
- アカウントの所有権をToken Extensions Programに割り当てる(
TOKEN_2022_PROGRAM_ID
)
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
instructionsを呼び出して、ミントアカウントを以下のデータで初期化します:
- 小数点以下2桁
- ウォレットをミント権限と凍結権限の両方に設定
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
両方の instructions を1つのトランザクションに追加します。
両方の 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?