2024年、Solanaは一躍脚光を浴び、TVLは年初の10億ドルから現在では約50億ドルに急増し、第4位のパブリックチェーンに躍り出た。
イーサリアムと比較して、ソラナはより速いスピードとより安い手数料で優れた体験を提供しています。そのPOHベースのコンセンサスメカニズムと非同期トランザクション実行モデルは、開発者に高スループットと低レイテンシのブロックチェーンパフォーマンスを提供し、さまざまな分散型アプリケーションに選ばれるプラットフォームとなっています。
BlockSec スペシャル基本的なSolanaの概念、Solanaトランザクションの表示と分析の実践的なガイド、Solanaスマートコントラクトの書き方のチュートリアルをカバーする一連のPlaying with Solana記事をまとめました。
シリーズの第1回目となるこの記事では、Solanaネットワークの仕組み、アカウントモデル、トランザクションを含む主要コンセプトを深く掘り下げ、適切で効率的なSolanaコントラクトを書くための土台を作ります。
eBPF: The Execution Cornerstone of Solana Transactions
スマートコントラクトを書き、実行するために、ブロックチェーンは多くの場合、一連のプログラミング言語とチューリング完全なソラナコントラクトを必要とします。とチューリング完全なコンピューティング環境を必要とします。
イーサリアムでおなじみのイーサ上のスマートコントラクトは、一般的に高水準言語Solidityで書かれ、イーサ仮想マシンと呼ばれる環境で実行されるバイトコードをコンパイルします。
Solanaは完全に新しい仮想環境と言語を開発することを選ばず、代わりに既存の素晴らしい技術を活用した。もともとLinuxカーネルの機能を拡張するために設計されたeBPF (extended Berkeley Packet Filter) 仮想マシンが、Solanaによって基礎となる実行環境として選ばれました。
では、EVMに対するeBPFの利点は何でしょうか?
インタプリタ実行しかサポートしないEVMと比較して、eBPFはバイトコードを直接、ジャスト・イン・タイム(JIT)モードでプロセッサが実行できるマシン命令に変換することで、より効率的にプログラムを実行できます。
eBPFは効率的な命令セットと成熟したインフラを持っています。開発者はRust言語のみを使用してスマートコントラクトを書くことができ、LLVMコンパイルフレームワークは、これらのRust言語プログラムをeBPF仮想マシン上で実行できるバイトコードに直接コンパイルするeBPFバックエンドを提供します。
Solanaのアカウントモデル
1.Solanaのアカウント構造
Solanaは、AccountInfoと呼ばれる構造体を使って口座を記述します。と呼ばれる構造体を使用します。
Solanaの各アカウントには、次の4つのフィールドがあります。フィールドがあります。ここでは1つずつ説明します。
データフィールドには、アカウントに関するデータが格納されます。アカウントがプログラム(つまりスマートコントラクト)である場合、実際にはeBPFバイトコードであるものが格納されます。それ以外の場合、Dataの情報のフォーマットは一般的にアカウント作成者によって定義される。
実行可能フィールドは、アカウントがプログラムであるかどうかを識別するために使用されます。Etherとは異なり、Solanaのプログラムは更新可能であることに注意してください。
Lamports フィールドは、アカウントのソラナトークンの残高を記録します。Lamportsは実際にはSOLトークンの最小単位です(1 SOL = 10億Lamports)。
所有者フィールドは、アカウントの現在の所有者を示します。Solanaでは、どのアカウントにもオーナーがいます。例えば、すべてのWalletアカウントは、Solanaネットワーク上の特別なアカウントであるSystem Programによって所有され、アカウント作成やその他の機能を担当します。アカウントの所有者は、アカウントデータを変更したり、Lamportsの残高を差し引いたりできる唯一の人物です(ただし、誰でもLamportsを追加する、つまりアカウントに送金を実行することはできます)。
2.Predefined Solana accounts
Solanaには、ネイティブプログラムと呼ばれる定義済みのアカウントセットがあります。ネイティブ プログラムは、固定アドレスにデプロイされる定義済みのランタイムです。Solanaネットワークがアップグレードされると、これらの定義済みプログラムは更新される可能性があります。これらのプログラムは、Solanaネットワーク下で特定の機能を提供するAPIおよびライブラリ関数と考えることができます。
開発者がしばしばやり取りする必要があるネイティブプログラムの1つに、システムプログラムがあります。システムプログラムは開発者に多くの命令を提供し、それぞれの命令は個別のメソッドとして解釈できます。例えば、CreateAccount命令を使って新しいアカウントを作成したり、Transfer命令を使ってLamportsを他のアカウントに移したりすることができます。
もう一つの一般的なネイティブ・プログラムはBPFローダー・プログラムです。これは他のすべてのプログラムアカウントの所有者であり、特定のプログラムの展開、更新、実行を担当します。Walletアカウントがデプロイされたプログラムを更新する必要がある場合、プログラムのオーナーだけがデータに直接アクセスできるため、実際にはBPF Loaderプログラムに委任することで行います。
ネイティブプログラムに加えて、SolanaはSysvarと呼ばれるアカウントセットを提供します。これらは、現在のクロック、最新のブロックハッシュなど、Solanaネットワークの現在の状態に関連する情報とグローバル変数をSolana上のプログラムに提供します。
3.アカウントレント
Solanaチェーンでは、各アカウントは最低額として一定数のLamportsを維持する必要があります。strong>賃料として知られています。現実の家賃の概念とは異なり、Solanaの家賃は回収可能である。アカウントのデータがチェーン上で利用可能であることを保証するために、アカウントは対応する数のLamportsを保持する必要があります。レントの量は、チェーン上のアカウントのストレージスペースのサイズに関連しています。
口座残高を賃料額以下に引き落とそうとするトランザクションは、そのトランザクションが口座残高を直接ゼロに引き落とさない限り、失敗します。このアクションは、口座の家賃が回収されたことを示し、トランザクションの実行終了時に、Solanaはゴミ収集によって対応する口座のストレージを空にします。
- ? ブラウザでSolanaアカウントを表示する
関係する概念の理解を深めるために、Solanaが提供する「Hello World」コードを使用します。Solanaが提供する「nbsp;World」プロジェクトを使用してプログラムアカウントを作成し、SolanaのブロックチェーンブラウザSolscan 以下のアカウント?である。
CJWhxB4qEWBv9eGYUkTN881bNDMDkLbzH1FmdwqLhoe
上の画像でわかるように、まず口座にはソラナブラウザによって「プログラム」と表示されていることがわかる。アカウントが作成されたときに、Lamportsの一部がアカウントの家賃として送金者の残高から差し引かれたので、そのSOL残高フィールドが空ではないことがわかります。
次に、プログラムを作成しているので、そのExecutableフィールドはYesになっています。 ここで理解しにくいかもしれませんが、読者はDataフィールドがeBPFプログラムではなく、アドレスを保存していることに気づくかもしれません。先に述べたように、Solanaはプログラムの更新を許可しているが、実際には "プロキシ "モデルを通してこれを行う。Solanaはプログラム・アカウントを直接変更できないので、eBPFプログラムを格納するデータ・アカウントを作成し、プログラム・アカウントのDataフィールドにデータ・アカウントのアドレスだけを格納する。プログラムを更新する必要があるときはいつでも、データ・アカウントのデータ・フィールドを変更するだけでよい。Solscanで実行可能データフィールドを持つアカウントを見てみると、「プログラム実行可能データアカウント」とラベル付けされ、そのデータフィールドには実際のプログラムが格納されていることがわかる。align:center">
前の画像に戻ると、More infoのOwnerフィールドがBPFローダーであることがわかります。
概要には、「アップグレード権限」という別のフィールドがあります。
前述したように、WalletアカウントはBPFローダーに委任することで更新されます。権限があることを確認します。アプリケーションアカウントのOwnerフィールドはすでにBPF Loaderにあるので、この情報を格納するスペースがないため、SolanaはデータアカウントのDataフィールドに格納することを選択します。Dataフィールドは実際にはデプロイされたアプリケーションのウォレットアドレスであり、この場合は'Upgrade Authority'です。".次の図は、アプリケーションアカウントとデータアカウントの関係を示しています。 データアカウントのデータフィールドが、ウォレットアドレスとeBPFコードの両方で構成されていることがわかります。
ソラーナのトランザクションと命令
Solanaでは、ユーザーはトランザクションを発行することでもプログラムを実行します。これらのトランザクションを並行して実行するSolanaの能力が特別なのは、電光石火のトランザクション速度を提供することです。Solanaのトランザクションがどのように設計されているか見てみましょう。
Solanaのトランザクションは、署名とメッセージ本文で構成される。トランザクションには複数の署名を含めることができる。トランザクションのメッセージ本文は、以下に示すように4つの部分で構成される。
メッセージのヘッダー(Header)。HeaderフィールドとCompact array of account addressesフィールドは、取引に関与するすべての口座と、その口座が署名を提供するかどうか、実行中に書き込まれるかどうかなど、取引における口座の特性を指定します。この情報を使って、Solanaはそれぞれの口座から提供された署名を検証することができ、同じ口座のセットに触れないトランザクションを並行して実行することができる。
最近のブロックハッシュ(Recent Blockhash)はトランザクションのタイムスタンプであり、Solanaネットワークはトランザクションが最新の150ブロックからのものであることを保証します。
コンパクトな命令の配列はトランザクションの最も重要な部分で、1つ以上の命令が含まれている。命令は、実際にはプログラムによって提供されるルーチンへの呼び出しである。
命令は、次の図に示すように、3つのフィールドから構成されています。最初のフィールド「プログラムIDインデックス」は、命令の受信者、つまり命令を処理する必要のあるチェーン内のプログラムを指定します。32 バイトのアドレスを直接格納する代わりに、メッセージ・ボディの アカウント・アドレスの配列にそのアドレスを格納します。このフィールドは、バイト添え字を使用して配列内の位置を示し、スペースの再利用を実現しています。
最初のフィールドと同様に、2番目のフィールドはアカウント・アドレス・インデックスのコンパクト配列で、命令の処理に関わるすべてのアカウントを指定します。
最後のフィールドは、プログラムが命令を処理するために必要な追加情報のバイト配列で、関数のパラメータと考えることができます。
ここで重要なのは、Solanaはトランザクション内のすべての命令を順次処理し、トランザクションの実行がアトミックであることを保証することである。つまり、トランザクション内のすべての命令は失敗するか、正常に実行されるかのどちらかであり、一部の命令が正常に実行され、一部の命令が失敗するケースはありません。
- ? ブラウザーで「Solanaトランザクション」を表示する
別のSolanaブラウザーで、前回作成したプログラムアカウント?を表示します。Overviewでは、Solanaトランザクションの署名、最新のブロックハッシュ、その他の情報を見ることができます:
3uKQ85Lpsnwb5D6CgUntoMyJX3tSaeGb4pjUoMaMyNVqQNPp5PRG1kJEEEk3YNdWLYEMZGmoJ5Rowgon8hZzwL9D
そしてAccount Inputには、以下のようにリストされています。現在のトランザクションに関与するすべての口座と、トランザクションに関連する口座の特徴が表示されます。送信者、プログラムアカウントなどのアドレスに加えて、2つのNative ProgramsとSysvarアカウントも含まれていることがわかります。
このトランザクションは単純なプログラム作成トランザクションです。その2番目の受信者はBPFローダーで、実際に展開されたeBPFコードをDataアカウントに書き込み、そのアドレスをプログラムのDataフィールドに書き込みます。プログラム・アカウントのDataフィールドに書き込む。strong>
Solana上のスマート・コントラクトはRustで開発され、eBPF仮想マシン上で実行される。これはアカウントモデルに従っており、チェーン上のアカウントはデータの可用性を確保するためにレントを維持する必要がある。トランザクションは、それに依存するすべてのアカウントを明示的に定義する1つまたは複数の命令で構成され、トランザクションを並列処理できるため、スループットが向上し、応答待ち時間が短縮される。これらの特徴が相まって、Solanaの急成長に貢献し、高い人気を誇るブロックチェーンプラットフォームの1つとなっている。