【Solanaコアコンセプト①】 アカウントモデル
この記事は、こちらの公式を翻訳・編集したものです。
1 はじめに
Solanaでは、すべてのデータは「アカウント」と呼ばれるものに格納されます。
Solana上のデータの整理方法はキーバリューストアに似ており、データベースの各エントリは「アカウント」と呼ばれます。
2 アカウントの重要ポイント
1 内容・容量
アカウントは最大10MBのデータを格納できます。
実行可能なプログラムコードまたはプログラムの値のいずれかで構成されます。
2 レントについて
アカウントは、格納されているデータの量に比例したレントデポジット(SOL)を必要とし、アカウントが閉じられると全額返金されます。
3 所有権について
すべてのアカウントにはプログラムの「所有者」があります。
アカウントを所有するプログラムのみがそのデータを変更したり、ラムポート残高を引き出せます。
ただし、誰でもバランスを増やすことができます。
4 プログラムの性質
プログラム(スマートコントラクト)は、実行可能なコードを格納するステートレスアカウントです。
5 データアカウントについて
データアカウントは、プログラムの状態を保存および管理するためにプログラムによって作成されます。
6 ネイティブプログラムについて
ネイティブプログラムは、Solanaランタイムに含まれる組み込みプログラムです。
7 Sysvarアカウント
Sysvarアカウントは、ネットワーククラスタの状態を格納する特別なアカウントです。
3 アカウントについて
1 概要
各アカウントは、Ed25519 の「PublicKey」の32バイトの一意のアドレスによって識別可能です。
このアドレスは、アカウントの一意の識別子と考えることができます。
2 アカウント情報
Solanaのすべてのアカウントは最大10MB(10メガバイト)のサイズです。
そして、アカウントのデータ構造は「AccountInfo」として知られています。
3 AccountInfoの構成
3ー1 データ(data)
アカウントの状態を格納するバイト配列です。
アカウントがプログラム(スマートコントラクト)の場合、これには実行可能なプログラムコードが格納されます。
このフィールドはしばしば「アカウントデータ」と呼ばれます。
3ー2 実行可能か否か(executable)
アカウントがプログラムであるかどうかを示すブールフラグ。
3ー3 ラムポート(lamports)
アカウントの残高をラムポート(1 SOL = 10億ラムポート)で数値表現します。
3ー4 所有者(owner)
アカウントを所有するプログラムの公開鍵(プログラムID)を指定します。
4 データの変更・ラムポートの引き出し権者
重要な部分として、Solanaのすべてのアカウントには指定された「所有者」、具体的にはプログラムがあります。
アカウントのデータを変更したり、ラムポートの残高を引き出したりするのは、所有者として指定されたプログラムのみです。
ただし、所有者だけがバランスを引き下げることができる一方で、誰でもバランスを増やすことができるという点が重要です。
5 チェーン上のデータの保存について
チェーン上にデータを保存するには、一定量のSOLがアカウントに送金される必要があります。
送金される額は、アカウントに保存されるデータのサイズに比例します。
この概念は一般に「レント(賃料)」と呼ばれます。
ただし「レント」を「デポジット(預け入れ)」と考えることもできます。
なぜなら、アカウントが閉じられると、アカウントに割り当てられたSOLは完全に回収可能だからです。
4 ネイティブプログラムについて
Solanaには、バリデータの実装の一部であり、ネットワークのさまざまな核心機能を提供する少数のネイティブプログラムが含まれています。
ネイティブプログラムの完全なリストはこちらで見つけることができます。
Solana上でカスタムプログラムを開発する際、一般的に『システムプログラム』と『BPFローダー』という2つのネイティブプログラムとやり取りします。
1 システムプログラム
デフォルトでは、すべての新しいアカウントはシステムプログラムによって所有されています。
2 システムプログラムのタスク
システムプログラムは以下のようないくつかの重要なタスクを実行します。
2ー1 新しいアカウントの作成
新しいアカウントを作成できるのはシステムプログラムだけです。
2ー2 スペースの割り当て
各アカウントのデータフィールドのバイト容量を設定します。
2ー3 プログラム所有権の割り当て
アカウントを作成するのはシステムプログラムでした。
指定されたプログラムオーナーを別のプログラムアカウントに再割り当てすることができます。
これにより、カスタムプログラムがシステムプログラムによって作成された新しいアカウントの所有権を取得します。
2ー4 ウォレットについて
Solana上の「ウォレット」は単にシステムプログラムによって所有されるアカウントです。
ウォレットのラムポートバランスは、アカウントが所有するSOLの量です。
3 BPFローダープログラム
BPFローダーは、ネイティブプログラムを除くネットワーク上の他のすべてのプログラムの「オーナー」として指定されたプログラムです。
カスタムプログラムの①デプロイ、②アップグレード、③実行を担当します。
5 Sysvarアカウント
Sysvarアカウントは、クラスターの状態データへのアクセスを提供する事前定義されたアドレスに位置する特別なアカウントです。
これらのアカウントは、ネットワーククラスターについてのデータで動的に更新されます。
Sysvarアカウントの完全なリストはこちらで見つけることができます。
6 カスタムプログラム
1 概要
Solanaでは、「スマートコントラクト」はプログラムとして言及されます。
プログラムは、実行可能なコードを含むアカウントであり、「executable」フラグがtrueに設定されています。
プログラムのデプロイプロセスの詳細な説明については、このドキュメントの「プログラムのデプロイ」ページを参照してください。
2 プログラムアカウントの種類
Solana上で新しいプログラムがデプロイされると、技術的には3つの別々のアカウントが作成されます。
2ー1 プログラムアカウント
オンチェーンプログラムを表す主アカウント。
このアカウントは実行可能データアカウント(コンパイルされたプログラムコードを保存する)のアドレスと、プログラムの更新権限(プログラムの変更を承認するアドレス)を保存します。
2ー2 プログラム実行可能データアカウント
プログラムの実行可能なバイトコードを含むアカウント。
2ー3 バッファアカウント
プログラムがアクティブにデプロイまたはアップグレードされている間、バイトコードを一時的に保存するアカウント。
プロセスが完了すると、データはプログラム実行可能データアカウントに転送され、バッファーアカウントは閉じられます。
3 トークンエクステンションの例
例として、トークンエクステンションのプログラムアカウントとその対応するプログラム実行可能データアカウントへのリンクがSolana Explorerにあります。
3ー1 プログラムアカウント
3ー2 プログラム実行可能データアカウント
4 簡潔な理解
簡単に言うと、「プログラムアカウント」はプログラム自体と考えることができます。
また、「プログラムアカウント」のアドレスは一般に「プログラムID」として参照され、プログラムを呼び出すために使用されます。
7 データアカウント
1 コードとステートの分離
Solanaのプログラムは「ステートレス」であり、プログラムアカウントにはプログラムの実行可能なバイトコードのみが含まれています。
追加データを保存および変更するためには、新しいアカウントを作成する必要があります。
これらのアカウントは一般に「データアカウント」と呼ばれます。
データアカウントは、所有プログラムのコードで定義されている任意のデータを保存できます。
2 プログラムへの所有権の移譲
注意 新しいアカウントを作成できるのはシステムプログラムのみです。
システムプログラムがアカウントを作成すると、その新しいアカウントの所有権を別のプログラムに移譲することができます。
3 データアカウントの紐付けのステップ
カスタムプログラムのためのデータアカウントを作成するには、次の2ステップが必要です。
① アカウントの作成
システムプログラムを呼び出してアカウントを作成
② 所有権の移譲
所有権をカスタムプログラムに移譲
③ アカウントデータの初期化
そのアカウントの所有者となったカスタムプログラムを呼び出し、プログラムコードで定義された通りにアカウントデータを初期化
このデータアカウント作成プロセスはしばしば単一のステップとして抽象化されますが、その基礎となるプロセスを理解することが役立ちます。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊