見出し画像

【Solanaコアコンセプト①】 アカウントモデル

この記事は、こちらの公式を翻訳・編集したものです。

1 はじめに

Solanaでは、すべてのデータは「アカウント」と呼ばれるものに格納されます。

Solana上のデータの整理方法はキーバリューストアに似ており、データベースの各エントリは「アカウント」と呼ばれます。

2 アカウントの重要ポイント

1 内容・容量

アカウントは最大10MBのデータを格納できます。

実行可能なプログラムコードまたはプログラムの値のいずれかで構成されます。

2 レントについて

アカウントは、格納されているデータの量に比例したレントデポジット(SOL)を必要とし、アカウントが閉じられると全額返金されます。

3 所有権について

すべてのアカウントにはプログラムの「所有者」があります。

アカウントを所有するプログラムのみがそのデータを変更したり、ラムポート残高を引き出せます。

ただし、誰でもバランスを増やすことができます。

補足
誰からでも送ることができるということですね。

4 プログラムの性質

プログラム(スマートコントラクト)は、実行可能なコードを格納するステートレスアカウントです。

補足
つまり、コードと値が分離されており、プログラムコードのみで構成されています。

5 データアカウントについて

データアカウントは、プログラムの状態保存および管理するためにプログラムによって作成されます。

6 ネイティブプログラムについて

ネイティブプログラムは、Solanaランタイムに含まれる組み込みプログラムです。

7 Sysvarアカウント

Sysvarアカウントは、ネットワーククラスタ状態を格納する特別なアカウントです。

3 アカウントについて

1 概要

各アカウントは、Ed25519 の「PublicKey」の32バイトの一意のアドレスによって識別可能です。

補足
SolanahはEd25519という楕円曲線暗号を使っているのですね。

このアドレスは、アカウントの一意の識別子と考えることができます。

2 アカウント情報

Solanaのすべてのアカウントは最大10MB(10メガバイト)のサイズです。

そして、アカウントのデータ構造は「AccountInfo」として知られています。

3 AccountInfoの構成

3ー1 データ(data)

アカウントの状態を格納するバイト配列です。

アカウントがプログラム(スマートコントラクト)の場合、これには実行可能なプログラムコードが格納されます。

このフィールドはしばしば「アカウントデータ」と呼ばれます。

3ー2 実行可能か否か(executable)

アカウントがプログラムであるかどうかを示すブールフラグ

補足
「プログラムである(true)」
「プログラムではない(false)」のどちらかが格納されています。

3ー3 ラムポート(lamports)

アカウントの残高ラムポート(1 SOL = 10億ラムポート)で数値表現します。

3ー4 所有者(owner)

アカウントを所有するプログラムの公開鍵(プログラムID)を指定します。

4 データの変更・ラムポートの引き出し権者

重要な部分として、Solanaのすべてのアカウントには指定された「所有者」具体的にはプログラムがあります。

アカウントのデータを変更したり、ラムポートの残高を引き出したりするのは、所有者として指定されたプログラムのみです。

ただし、所有者だけがバランスを引き下げることができる一方で、誰でもバランスを増やすことができるという点が重要です。

補足
これは、難しい話ではなく、誰でもアカウントにSOLを送ることができるというだけの話です。

5 チェーン上のデータの保存について

チェーン上にデータを保存するには、一定量のSOLがアカウントに送金される必要があります。

送金される額は、アカウントに保存されるデータのサイズに比例します。

この概念は一般に「レント(賃料)」と呼ばれます。

ただし「レント」「デポジット(預け入れ)」と考えることもできます。

なぜなら、アカウントが閉じられると、アカウントに割り当てられたSOLは完全に回収可能だからです。

補足
つまり、賃料のように返ってこない額ではなく、Suicaを作るときに支払うデポジット(500円)のように、やめる場合には返ってきます。

4 ネイティブプログラムについて

Solanaには、バリデータの実装の一部であり、ネットワークのさまざまな核心機能を提供する少数のネイティブプログラムが含まれています。

ネイティブプログラム完全なリストはこちらで見つけることができます。

https://docs.solanalabs.com/runtime/programs

Solana上でカスタムプログラムを開発する際、一般的に『システムプログラム』『BPFローダー』という2つのネイティブプログラムとやり取りします。

1 システムプログラム

デフォルトでは、すべての新しいアカウントシステムプログラムによって所有されています。

2 システムプログラムのタスク

システムプログラムは以下のようないくつかの重要なタスクを実行します。

2ー1 新しいアカウントの作成

新しいアカウントを作成できるのはシステムプログラムだけです。

2ー2 スペースの割り当て

各アカウントのデータフィールドバイト容量を設定します。

2ー3 プログラム所有権の割り当て

アカウントを作成するのはシステムプログラムでした。

指定されたプログラムオーナー別のプログラムアカウントに再割り当てすることができます。

これにより、カスタムプログラムシステムプログラムによって作成された新しいアカウントの所有権を取得します。

2ー4 ウォレットについて

Solana上の「ウォレット」は単にシステムプログラムによって所有されるアカウントです。

補足
つまり、他のカスタムプログラムによって所有されていない、システムプログラムに所有されているアカウント「ウオレット」です。

ウォレットのラムポートバランスは、アカウントが所有するSOLの量です。

3 BPFローダープログラム

BPFローダーは、ネイティブプログラムを除くネットワーク上の他のすべてのプログラムの「オーナー」として指定されたプログラムです。

カスタムプログラム①デプロイ②アップグレード③実行を担当します。

5 Sysvarアカウント

Sysvarアカウントは、クラスターの状態データへのアクセスを提供する事前定義されたアドレスに位置する特別なアカウントです。

https://solana.fm/address/SysvarC1ock11111111111111111111111111111111

これらのアカウントは、ネットワーククラスターについてのデータ動的に更新されます。

https://solana.fm/address/SysvarC1ock11111111111111111111111111111111

Sysvarアカウント完全なリストはこちらで見つけることができます。

https://docs.solanalabs.com/runtime/sysvars

6 カスタムプログラム

1 概要

Solanaでは、「スマートコントラクト」はプログラムとして言及されます。

プログラムは、実行可能なコードを含むアカウントであり、「executable」フラグがtrueに設定されています。

プログラムのデプロイプロセスの詳細な説明については、このドキュメントの「プログラムのデプロイ」ページを参照してください。

2 プログラムアカウントの種類

Solana上で新しいプログラムがデプロイされると、技術的には3つの別々のアカウントが作成されます。

2ー1 プログラムアカウント

オンチェーンプログラムを表す主アカウント

このアカウントは実行可能データアカウント(コンパイルされたプログラムコードを保存する)のアドレスと、プログラムの更新権限(プログラムの変更を承認するアドレス)を保存します。

2ー2 プログラム実行可能データアカウント

プログラムの実行可能なバイトコードを含むアカウント。

2ー3 バッファアカウント

プログラムがアクティブにデプロイまたはアップグレードされている間、バイトコードを一時的に保存するアカウント

プロセスが完了すると、データはプログラム実行可能データアカウントに転送され、バッファーアカウントは閉じられます。

3 トークンエクステンションの例

例として、トークンエクステンションプログラムアカウントとその対応するプログラム実行可能データアカウントへのリンクがSolana Explorerにあります。

3ー1 プログラムアカウント

https://explorer.solana.com/address/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb

3ー2 プログラム実行可能データアカウント

https://explorer.solana.com/address/DoU57AYuPFu2QU514RktNPG22QhApEjnKxnBcu4BHDTY

4 簡潔な理解

簡単に言うと、「プログラムアカウント」プログラム自体と考えることができます。

補足
本来は、「プログラムアカウント」「プログラム実行可能データアカウント」の2つからなりますが、2つを一つのものとして捉えています。

また、「プログラムアカウント」のアドレスは一般に「プログラムID」として参照され、プログラムを呼び出すために使用されます。

7 データアカウント

1 コードとステートの分離

Solanaのプログラムは「ステートレス」であり、プログラムアカウントにはプログラムの実行可能なバイトコードのみが含まれています。

追加データ保存および変更するためには、新しいアカウントを作成する必要があります。

これらのアカウントは一般に「データアカウント」と呼ばれます。

データアカウントは、所有プログラムのコードで定義されている任意のデータを保存できます。

2 プログラムへの所有権の移譲

注意 新しいアカウントを作成できるのはシステムプログラムのみです。

システムプログラムがアカウントを作成すると、その新しいアカウントの所有権を別のプログラムに移譲することができます。

3 データアカウントの紐付けのステップ

カスタムプログラムのためのデータアカウントを作成するには、次の2ステップが必要です。

① アカウントの作成

システムプログラムを呼び出してアカウントを作成

② 所有権の移譲 

所有権カスタムプログラムに移譲

③ アカウントデータの初期化

そのアカウントの所有者となったカスタムプログラムを呼び出し、プログラムコードで定義された通りにアカウントデータを初期化

このデータアカウント作成プロセスはしばしば単一のステップとして抽象化されますが、その基礎となるプロセスを理解することが役立ちます。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊