見出し画像

【完全保存版】Solanaの「アカウント」について、しっかり理解しよう!

本日は、Solanaにおける、アカウントをしっかりと見ていきます。

これらのドキュメントもぜひ参考にしてみてください。

1 アカウントの種類

1 イーサリアムの場合

まずは、イーサリアムとの比較で考えてみましょう。

イーサリアムには、「EOA」「コントラクトアカウント」という2つがあります。

なお、EOAメタマスクなどで作るアカウントです。

2 Solanaの場合

一方、Solanaには「データアカウント」「プログラムアカウント」「ネイティブアカウント」3つがあります。

下のような対応関係になっています。

「ネイティブアカウント」はSolanaのネイティブプログラムを意味しますが、今回の記事では省略します。

2 アカウントの中身について

1 イーサリアムの場合

まず、イーサリアムの場合は、下のように、「nonce」「balance」「storage hash」「code hash」から構成されています。

https://ethereum.org/ja/developers/docs/accounts/

大まかに、下のようになっています。

なお、EOAの場合は、「storage hash」「code hash」がありません。

今回のメインのテーマから外れるため、詳細は割愛します。

https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

2 Solanaの場合

Solanaのアカウントは、「lamports」「owner」「executable」「data」「rent_epoch」の5つがあります。

一つずつ見ていきましょう。

2ー1 lamportsについて

こちらは、イーサリアムで言うところの、「balance(残高)」に該当します。

イーサリアムの最小単位の「wei」に対応するものが、「lamport」であり、いくら持っているのかを表しています。

2ー2 ownerについて

その名の通り、「owner(所有者)」です。

これは、イーサリアムのアカウントには対応するものがありません。

大事な点なので、第4章で詳しく見ていきます。

2ー3 rent_epochについて

上で見たように、アカウントには所有者がいました。

そのため、アカウントを使用するには、レント(賃貸料)を支払う必要があります。

エポックとは、時間を区切る単位のことで、レントを支払った最後のエポックが保存されます。

レントについては、第6章で詳しく扱います。

2ー4 executableについて

アカウントが、プログラムを持ち実行可能かどうかを格納します。

そのため、「プログラムアカウント」は基本「true」「データアカウント」「false」です。

https://solanacookbook.com/ja/core-concepts/accounts.html#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%83%A2%E3%83%86%E3%82%99%E3%83%AB

イーサリアムとの直接の対比ではないですが、イーサリアムでは「code」の中身があるかどうかで「コントラクトアカウント」かを判定できます。

2ー5 dataについて

この「data」は注意が必要です。

保存されたデータバイトコードどちらかを含めることができます。

そのため、イーサリアムの「storage hash」「code hash」の両方(どちらかしか含まない)に相当します。

下の図がイメージしやすいと思います。

この例では、「データアカウント」では「counter」というカウントした値を保持したデータを持っています。

一方、左側の「プログラムアカウント」ではバイトコードを保持しています。

https://solanacookbook.com/ja/core-concepts/accounts.html#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%83%A2%E3%83%86%E3%82%99%E3%83%AB

3 スマートコントラクトとプログラム

Solanaでは、スマートコントラクトのことをプログラムと呼びます。

なぜこのように呼び方が異なるのでしょう。

1 イーサリアムの場合

イーサリアムでは、コントラクトアカウントの中に、「コード(ロジック)」「値」両方入っています。

この理由から、コントラクトは更新することができません。

今回、その辺りの詳細は触れませんが、ご興味のある方は、こちらもご参考ください。

一方、イーサリアムには、「アップグレーダブル」コントラクトがあります。

これは、値を保持するコントラクトロジックのコントラクトを分離しています。

Solanaはまさにこれと同じような構成になっています。

2 Solanaの場合

Solanaでもアップグレーダブルコントラクトのようにロジックと値が分離されています。

そして、ロジック部分のアカウントのことを、「プログラムアカウント」といいます。

そして、下の例では、紐づいている「データアカウント」の所有者が、「プログラムアカウント」になっています。

これは、次の章で触れますが、「所有者でないとアカウントを変更できない」というルールがあります。

そのため、この場合、「プログラムアカウント」からしか変更ができないようにしています。

4 Owner(所有者)について

1 定義について

Solanaでの「owner(所有者)」とは、「owner」に設定されているアカウントです。

つまり、実際に秘密鍵を持っているかどうかとは直接関係がありません

2 所有者の特徴

所有者の特徴は「所有者のみがデータの変更ができる」ということです。

これが具体的に何を指すのか、丁寧に見てみましょう。

3 新しく作成したアカウントの所有者について

では、新しく、キーペア(秘密鍵と公開鍵)から作成されるアカウント所有者を見ていきましょう。

それは、下のような、「System Program」というアカウントです。

つまり、こんな関係になります。

ちなみに、今回できたアカウントは「ユーザーアカウント」と呼びます。

このアカウントに6SOL入っているとします。

4 ユーザーアカウントの変更者は?

この残高を変更することができるのは、先ほどの通り、所有者である、「System Program」だけです。

つまり、秘密鍵を持っているアカウント自身ではありません。

これは、違和感があると思いますが、最終的には腹落ちすると思いますので、もう少し進めてみましょう。

5 秘密鍵保持者による署名

まず、アカウントを変更できるのは、所有者である、「System Program」だけでした。

ただし、実行するためには、「署名」付きのトランザクションを実行する必要があります。

そして、有効な署名を行うことができるのが、秘密鍵の保持者です。
(漏洩・紛失がなければ、ユーザーアカウント

そのため、実際問題としては、ユーザーアカウントは自身の残高を送付などすることができます。

5 プログラムアカウントの作成について

1 プログラムアカウントの生成について

では、次はプログラムアカウントの生成についても見てみましょう。

まずは、このように、今までと同じようにアカウントがあります。

2 プログラムのアップロード

このアカウントに、コードの中身自身である、プログラムをアップロードします。

これによって、「プログラムアカウント」になります。

3 フィールドの更新

そして、アカウントには、第2章で扱ったように、フィールドが存在します。

データバイトコードを設定し、「executable」「true」にします。

4 ownerの更新

なお、更新可能なプログラムアカウントにした場合、Ownerは下のようになります。

ちなみに、更新可能な場合、この「BPF Upgradable Loader」によってデプロイされています。

こんな感じです。

5 データアカウントの作成

第3章で扱ったように、Solanaでは「ロジック」と「値」は分離されています。

そして、データアカウントには、PDA(プログラム派生アドレス)などが使われます。

これについては、こちらの記事をご参照ください。

6 レント(賃貸料)について

1 レント(賃貸料)について

今回は、ユーザーアカウントを例に考えてみます。

ユーザーアカウントの所有者は、あなたではなく、「System Program」でした。

そのため、使用し続けるには、レント(賃貸料)を支払う必要があります。

2 レント導入の理由

Solanaがレントの制度を採用している理由の一つは「ストレージの効率的な利用」です。

不要なアカウントが作られることを防ぎリソースの無駄な利用を防いでいます。

だからこそ、レントは、アカウントのサイズによって計算されます。

3 レント免除について

レントの主目的は、「ストレージの効率的な利用」であるため、レント免除という仕組みがあります。

これは、2年分のレントに相当する残高がある場合は、レントが免除されるというものです。

今回は、アカウントについて丁寧に見てみました。

以上です。


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