Solana 学習#
2. Solana ネットワークからデータを読み取る#
(1) 概要#
SOL は Solana のネイティブトークンの名前です。各 SOL は 10 億の Lamports で構成されています。
アカウントはトークン、NFT、プログラム、データを保存します。
アドレスは Solana ネットワーク上のアカウントを指します。誰でも指定されたアドレスのデータを読み取ることができます。ほとんどのアドレスは公開鍵でもあります。
(2) アカウント#
Solana 上に保存されているすべてのデータはアカウントに保存されています。アカウントは以下を保存できます:
- SOL
- USDC などの他のトークン
- NFT
- プログラム
- プログラムデータ
(3) SOL の紹介#
SOL は Solana のネイティブトークンです - SOL は取引手数料やアカウントの賃貸料の支払いに使用されます。SOL は時々◎記号で表示されます。各 SOL は 10 億の Lamports で構成されています。
金融アプリケーションが通常、セント(ドル)やペンス(ポンド)で数学的計算を行うのと同様に、Solana アプリケーションは通常、SOL を Lamport として転送、支出、保存、処理し、ユーザーに表示するために完全な SOL に変換します。
(4) アドレス#
アドレスはアカウントを一意に識別します。アドレスは通常、base-58 エンコードされた文字列として表示されます。例えば、dDCQNnDmNbFVi8cQhKAgXhyhXeJ625tvwsunRyRc7c8。Solana 上のほとんどのアドレスも公開鍵です。アドレスの対応する秘密鍵を制御する者がそのアカウントを制御します - 例えば、鍵を持つ者はそのアカウントからトークンを送信できます。
(5) コード#
import { PublicKey,LAMPORTS_PER_SOL,Keypair,Connection, clusterApiUrl } from "@solana/web3.js";
console.log("公開鍵と秘密鍵のペアを生成中");
const keypair = Keypair.generate();
console.log(`公開鍵は: `, keypair.publicKey.toBase58());
console.log(`秘密鍵は: `, keypair.secretKey);
console.log('----------------------');
console.log("接続を作成中");
const connection = new Connection(clusterApiUrl("devnet"));
// console.log(connection)
console.log(`✅ 接続成功!`)
console.log("----------------------");
console.log("アカウントの残高を取得中");
const address = new PublicKey('4pa3H5FwfPPSYH8JGKiKb91mgjx6iVbt4X3XJAdV7s5g');
const balance = await connection.getBalance(address);
const balanceInSol = balance / LAMPORTS_PER_SOL;
console.log(`アカウント${address}の残高は${balanceInSol} SOLです`);
console.log(`✅ 完了!`)
3. Solana ネットワーク上で取引を作成する#
(1) 概要#
チェーン上のデータに対するすべての変更は取引を通じて行われます。取引は主に Solana プログラムを呼び出す命令のセットです。取引は原子的であり、すなわち、すべての命令が正しく実行された場合にのみ成功し、そうでなければ失敗します。
(2) 取引は原子的である#
チェーン上のデータに対する任意の変更は、プログラムに送信される取引を通じて行われます。
Solana 上の取引は他の場所の取引と似ています:それは原子的です。原子性は、全体の取引が実行されるか失敗することを意味します。
オンライン決済のことを考えてみてください:
- あなたのアカウント残高が引き落とされました
- 銀行が資金を商人に送金します
これら二つのことは、取引を成功させるために両方とも発生する必要があります。どちらか一方が失敗すれば、どちらも発生せず、商人に支払われることはなく、あなたのアカウントから引き落とされることもありません。
原子性は、取引が発生するか(すべての個別のステップが成功することを意味します)、全体の取引が失敗することを意味します。
(3) 取引は命令を含む#
Solana 上の取引のステップは命令と呼ばれます。
各命令は以下を含みます:
- 読み取りおよび / または書き込みを行うアカウントの配列。これが Solana が迅速である理由です - 異なるアカウントに影響を与える取引が同時に処理されます
- 呼び出すプログラムの公開鍵
- 呼び出されるプログラムに渡されるデータ、構造はバイト配列です
取引を実行する際には、取引に含まれる命令を使用して 1 つ以上の Solana プログラムが呼び出されます。
(4) コード#
import { Transaction,SystemProgram,sendAndConfirmTransaction,Connection,LAMPORTS_PER_SOL,clusterApiUrl,Keypair, PublicKey } from "@solana/web3.js"
const connection = new Connection(clusterApiUrl("devnet"), "confirmed")
//新しい鍵ペアを生成
const senderKeypair = Keypair.generate()
//エアドロップ
await connection.requestAirdrop(senderKeypair.publicKey, LAMPORTS_PER_SOL)//1SOL=1000000000LAMPORTS
//受取人
const receiverPubkey = new PublicKey("4pa3H5FwfPPSYH8JGKiKb91mgjx6iVbt4X3XJAdV7s5g")
//受取人の残高を取得
const receiverBalance = await connection.getBalance(receiverPubkey)
//送信者の残高を取得
const senderBalance = await connection.getBalance(senderKeypair.publicKey)
console.log("送信者の残高:", senderBalance)
console.log("受取人の残高:", receiverBalance)
const transaction = new Transaction()
const sendSolInstruction = SystemProgram.transfer({
fromPubkey: senderKeypair.publicKey,//送信者アカウントに対応する公開鍵
toPubkey: receiverPubkey,//受取人アカウントに対応する公開鍵
lamports: LAMPORTS_PER_SOL/2//Lampsに送信するSOLの数量。
})
transaction.add(sendSolInstruction)
const signature =await sendAndConfirmTransaction(
connection,//クラスター接続
transaction,//取引
[senderKeypair]//取引の署名者として機能する鍵ペアのセット - この例では、署名者は1人だけです:送信者。
)
//受取人の残高を取得
const receiverBalance01 =await connection.getBalance(receiverPubkey)
//送信者の残高を取得
const senderBalance01 =await connection.getBalance(senderKeypair.publicKey)
console.log("送信者の残高:", senderBalance01)
console.log("受取人の残高:", receiverBalance01)
console.log("署名:", signature)
4. トークンプログラムを使用してトークンを作成する#
(1) 概要#
SOL は Solana の「ネイティブトークン」です。すべての他のトークン、代替トークンおよび非代替トークン(NFT)は SPL トークンと呼ばれます。
トークンプログラムは SPL トークンを作成し、相互作用するための指示を含みます。
トークンミントは特定のトークンを定義するアカウントです。これにはトークン自体に関する情報(例えば、小数点以下の桁数)、さらにトークンを追加で発行することを許可するアカウント(ミント権限と呼ばれる)およびトークンに関する詳細情報(例えば、説明、画像など)を見つける場所が含まれます。ミント権限を持つ者はトークンミントを使用してさらにトークンを作成できます!
トークンアカウントは特定のトークンミントのトークンを保持します。ほとんどのユーザーにとって、各トークンミントの残高は関連するトークンアカウントに保存されます - そのアドレスはウォレットアドレスとトークンミントから構成されるアカウントによって決まります。
トークンミントとトークンアカウントを作成するには、SOL で賃貸料を支払う必要があります。トークンアカウントの賃貸料はアカウントが閉じられたときに返金される可能性がありますが、トークンミントは現在閉じることができません。
(2) トークンミントの手順#
- 新しいトークンミントを作成する
新しいトークンミントを作成します- トークンアカウントを作成する
トークンアカウントを作成します- ミントする
トークンを発行します- トークンを一人の保有者から別の保有者に転送する
トークンを一人の保有者から別の保有者に転送します- トークンを燃やす
トークンを燃やします
(3) トークンアカウント#
トークンをミントする(新しい供給を発行する)前に、新しく発行されたトークンを保存するためのトークンアカウントが必要です。
トークンアカウントは特定の「ミント」のトークンを保持し、指定されたアカウント「所有者」を持ちます。所有者のみがトークンアカウントの残高を減少させる権限を持ち(転送、燃焼など)、誰でもトークンアカウントにトークンを送信してその残高を増加させることができます。
あなたが私に提供した Solana コードでは、この新しく作成されたアカウントはトークン(ミント)の状態とメタデータを保持するために使用され、あなたはこのアカウントを作成するために必要な費用を支払い、同時にこのトークンのミント権限を持っています。
5. Metaplex を使用して Solana NFT を作成する#
(1) 概要#
非代替トークン(NFT)は Solana 上で SPL トークンとして表現され、関連するメタデータアカウント、0 桁の小数および最大供給量 1 を持ちます。
Metaplex は、Solana ブロックチェーン上で NFT の作成と配布を簡素化するための一連のツールを提供します。
トークンメタデータプログラムは、メタデータを SPL トークンに追加するプロセスを標準化します。
Metaplex SDK は、開発者が Metaplex が提供するオンチェーンツールを使用するのを助けるユーザーフレンドリーな API を提供するツールです。
Candy Machine プログラムは、コレクションから NFT を作成し、ミントするための NFT 配布ツールです。
Sugar CLI は、メディア / メタデータファイルをアップロードし、コレクションのためにキャンディマシンを作成するプロセスを簡素化するツールです。
(2) Solana 上の NFT#
6. カスタムオンチェーンプログラム#
7. オンチェーンプログラムの開発#
(1) Anchor プログラム構造#
Anchor はマクロと特徴を使用して、あなたに Rust コードのひな型を生成します。これにより、あなたのプログラムに明確な構造が提供され、コードをより簡単に推論できるようになります。主な高レベルのマクロと属性は以下の通りです:
- declare_id - プログラムのオンチェーンアドレスを宣言するためのマクロ
- #[program] - プログラムの命令ロジックを含むモジュールを示すための属性マクロ
- アカウント - 命令に必要なアカウントのリストを表す構造に適用される特徴
- #[account] - プログラムのカスタムアカウントタイプを定義するための属性マクロ