出典:Denchainコミュニティ
Solanaの開発を紹介する連載記事です。
Solanaは、独自のコンセンサスメカニズムとアカウントモデルによって、高スループットと低レイテンシーを実現する高性能ブロックチェーンプラットフォームです。
連載記事の第1回目として、この記事ではSolana開発の前に知っておくべき知識に焦点を当てます:
Solana 誕生の背景
Solanaがブロックから出るまで(コンセンサス操作)
Solanaの中核概念:アカウントモデル、PDA、トランザクションと手数料、クラスタリングなど。
ソラーナの背景
ソラーナは2017年にアナトリー・ヤコヴェンコによって設立された。彼らはクアルコムに勤務していた3年間、住みながらサーフィンをしていたサンディエゴの北にある小さなビーチタウン、ソラナビーチへのオマージュとしてソラーナという名前を選んだ。
Solanaを設立する前、アナトリーはQualcomm、Mesosphere、Dropboxで長年を過ごし、高性能ネットワーキングと分散システムで豊富な経験を積んだ。
彼は、ブロックチェーンのスケーラビリティにおけるボトルネックが、大規模な採用の可能性を制限していることを認識していました。分散システムにおける時間同期技術にヒントを得て、彼はプルーフ・オブ・ヒストリー(PoH)のコンセプトを開発しました。お互いを信用していないコンピューター間の時間同期のために。
SolanaがどのようにPoHを適用し、認証者間の効率的な同期を実現しているのか見てみましょう。
SolanaがどのようにPoHを適用しているか見てみましょう。-="">ソラーナ・コンセンサス - ブロックを抜け出す方法
注:ソラーナ・コンセンサスアルゴリズムのドキュメントは少し古く、このセクションは詳細なソラーナ・コンセンサスと私の理解を加えたものです。
SolanaはProof of Stake (PoS)ブロックチェーンであり、コンセンサスアルゴリズムは2段階のプロセスに従っています:1.ブロックの検証者を選ぶ、2.他の検証者がブロックに投票し、十分な投票が蓄積された後、最終的にブロックが確認されます。
バリデータを選択する
Solanaのプロトコルには、Epochとslotという2つの重要な時間間隔関連の単語があります:
タイムスロット(slot): 検証者がブロックを生成する時間の単位。タイムスロットごとに1つのブロックを生成でき、各タイムスロットは400ミリ秒続く。
エポック(Epoch): 各エポックの開始時に、ソラナネットワークは誓約重みと以前のブロックに基づいてベリファイアのシーケンス(リーダーと呼ばれる)をランダムに選出し、エポック内のブロック生成を担当する。リーダーの配列はこの間固定されたままであり、各リーダーは4つのスロット(すなわち4つのブロックを作る)を、1エポック(432,000スロットを含む)あたり約2日間、連続して処理することができる。
上の図で、色のついたブロックはそれぞれブロックを示しており、異なる色は異なる有効なブロックを示しています。
ランダム選挙(ほとんど意味不明)について詳しく説明しなくても、各エポックの最初に、検証者はどのスロットでブロックを取り出す必要があるかがわかります。
しかし、ここで解決しなければならない2つの問題があります:
どうやって検証者は自分の番が来たことを知るのでしょうか?前のバリデータが次のバリデータに伝えるというネットワーク通信だけに頼っていると、ネットワークの待ち時間(または前のバリデータの脱落)のために貴重なブロック時間を逃してしまう可能性があります。
1つのブロックにできるだけ多くのトランザクションを詰め込む方法。イーサネットのように1つのトランザクションが別のトランザクションに続くような場合、このような短い時間に多くのトランザクションを収めることはできません。
ソラーナの最も重要な革新であるPOHは、これら2つの問題を解決するために設計されています。
POHは、この2つの問題を解決するためのものです。"">ブロックの外
Solanaは、トランザクションの並列処理を導入して高いパフォーマンスを実現し、トランザクションの並べ替えと実行を2つのフェーズに分けて、実行フェーズを並列処理できるようにしている。
他のベリファイアはトランザクションを検証する際に同じソート順序を実行する。 トランザクションのソート順序を検証可能にするために、Solanaは POHプルーフ・オブ・ヒストリーのハッシュ・チェイニングを使用して、トランザクションの順序を決定する。
POH は、一連の暗号ハッシュ(SHA256アルゴリズム)を作成することでこれを行います。このため、POHハッシュチェーンとマインドデータを組み合わせることで、トランザクションの順序を決定することができます。
ハッシュを計算するときにトランザクションデータを追加するだけです。ハッシュを計算する際に、トランザクションデータを入力の一部として加えるだけで、トランザクションの順序を決定することができる。そして、このシーケンスは並列検証可能であり、改ざん防止である。
現在のリードバリデータは、RPCサーバーや他のバリデータからトランザクションを受け取り、最初の検証(トランザクションの署名や口座残高の検証など)を行った後、各トランザクションにグローバルで検証可能な時系列のタグを付けるPOHハッシュチェーンの計算に加え、トランザクションを並列に実行する。そしてトランザクションを並列実行する。
Solanaでは、全体のトランザクション処理フローは、相互に接続された複数のフェーズ(トランザクション検証、POHソート、実行、ブロードキャスト)に分割され、パイプラインを形成します。異なるフェーズは、異なるCPUコアまたはGPU上でトランザクションの異なるバッチをオーバーラップして並列処理することができ、同時にトランザクション検証のバッチのコアとなる別のトランザクションの実行(バンキングと呼ばれる)を処理することができます。
トランザクションの実行も並列であり、トランザクションの実行はアカウントの読み取り/書き込みの依存関係に基づいて並列に配置され、トランザクションは依存関係に従ってグループ化され、並列に異なるスレッド/CPUコア/GPUタスクに投入されます。
2つのトランザクションが完全に異なるアカウントで動作するか、読み取り専用であれば、理論的には同時に実行できます。
Solanaのブロック外のプロセスを理解したところで、上記のように、Solanaは1つのスロット(~400ミリ秒)で大量のトランザクションを処理できます。
POH-同期クロック
もう1つの質問ですが、検証者はどうやってブロックする順番が来たことを知るのでしょうか?
各ハッシュ演算には最小限の時間がかかり、各ハッシュ演算は前のハッシュ値を使用する必要があります。このため、並列化は不可能です。したがって、PoHハッシュチェーンは、時間の経過を証明する役割を果たします。
Solanaでは、(PoHハッシュチェーンの)各ブロックは12,500個のハッシュを含まなければなりません。現在のスロットリーダーは、これらのPoHチェーン(ブロック)を生成する責任があります。
実際には、バリデータはバックグラウンドでPoHチェーン(取引データのない空のハッシュチェーン)そのものを計算しておらず、前のリーダー(または複数の前のリーダー)がブロックをポストしなかった場合(または現在のリーダーがブロックを受け取らなかった場合)、現在のリーダーは、スロットの必要なハッシュ数をパスしている限り、時間通りにブロックを生成することができます。
以下に示すように、スロット3はオフラインで、スロット4のベリファイアはスロット3にPoHシーケンスを投入します。
ブロックの検証と投票
ブロックメタデータの検証とPoHハッシュの再計算を含むブロック検証プロセスでは、ブロックのすべてのトランザクションを検証して再生し、元帳を更新します。
検証に合格すると、バリデータのブロックへのコミットメントが投票によって示され、バリデータが保有している代理権益(コイン)が多いほど、投票の重みが増します。
通常、バリデータは最も重いチェーンを選んでアウトブロックと投票を行い、前のリーダーのブロックが現在のリーダーに届かない状況があれば、フォークが起こるかもしれません:
フォークの場合、ベリファイアは各サブツリーのシェアごとの加重投票の合計を計算し、最も投票数の多いものを選ぶ。そのブロックが少なくとも3分の2のシェア加重票を獲得した場合、そのブロックは有効となります。
ソラーナのコアコンセプト
Solanaアカウント
SolanaとEtherで開発するときに感じる最大の違いは、アカウントモデルが異なることです。
SolanaのアカウントはLinuxのファイルと非常に似ており、すべてがアカウントであり、ストレージ単位です。
User account: 秘密鍵によって管理されるアカウントで、通常はユーザー用のウォレットソフトウェアによって生成されます。
プログラムアカウント:実行可能なバイトコード(スマートコントラクトコード)を保存するために使用されるアカウント。
データアカウント:ユーザーが保有する特定のトークンの数など、ステータス情報を保存するアカウント。
ネイティブプログラムアカウント:ネットワークのさまざまなコア機能を実行する、事前に展開された特別なプログラムアカウントです。これにはシステム・プログラム、投票プログラム、BPFローダーが含まれます。
<span ) 10px / 40px no-repeat height: 30px;width: 100%;margin-bottom: -7px;border-radius: 5px;'>
Solanaのミッドプログラマアカウント(つまりスマートコントラクト)はステートレスで読み取り専用であり、データ/ステートは保存されません。データは別のデータアカウントに保存されます。
Solanaコントラクト上で関数を呼び出す場合、使用するデータアカウントを関数に渡す必要があります。相互依存関係のないトランザクションの同時実行は簡単です。
EVMについてご存知の方は、状態データもコントラクトに格納されることを知っています。 カウンターを例にとってみましょう。Solanaでは、2つのアカウントを作成する必要があります。プログラムのコードを格納するプログラムアカウントと、カウンターの値を格納するアカウントです。
レントは、アクティブであり続けるために最低残高を維持することをアカウントに要求することで、ステータスの肥大化を抑えるSolanaの方法です。レントは、ネットワークが未使用または資金不足のアカウントを最終的に取り戻すことを保証します。アカウントが2年分のレンタル料に相当する最低残高を維持した場合、レンタル料は免除されます。
Solanaのアカウントは、同時実行の利点に加え、プログラムの再利用性をもたらすように設計されており、イーサ上に多くの同一のERC20コードがあります。
Solanaは、新しいトークンを作成する際にスマートコントラクトを再デプロイする必要がないという点で異なります。その代わりに、トークンの数、名前、誰がより多くのトークンを鋳造できるかなどを定義する、鋳造アカウントと呼ばれる新しいアカウントが作成されます。
プログラム派生アドレス (PDA: Program Derived Addresses)
プログラムデータを保持するために使用されるアカウントがPDAです
通常のユーザーアカウントは、ed25519楕円曲線上の点に対応する公開鍵/アドレスと、アカウントを変更する許可を証明するための署名に使用される秘密鍵を持っています。(権限)を持つ。
プログラム由来アドレス(PDA)とは、(たとえ出力が曲線の値から外れていても)バンプを使用して曲線の外側で生成されたアカウントのことです。PDAには、親ID、シードのセット、ジャンプ値の3つの主要コンポーネントが必要です。シードは文字列の配列で、通常、ハッシュテーブルのようなデータ構造を作成するために、特定のシードに関連付けられた状態変数を持つプログラムで設定されることがほとんどです。そして、対応するPDAを生成します。
その PDA を生成したプログラムはその所有者であり、そのプログラムだけが PDA のデータを変更することができます。
トランザクション
私たちがSolanaネットワークに送るトランザクションは、4つの部分から構成されます。アカウントの配列(account_keys
)
1つ以上の署名(signatures
)
最近のブロックハッシュ(recent_blockhash
)
ディレクティブは、Solanaの実行ロジックの最小の部分です。ディレクティブは、実行手順、関係するすべてのアカウント、操作データを指定します。ディレクティブは状態を更新するためにプログラムを呼び出し (例えば、トークンをアカウントから別のアカウントに転送するためにトークンプログラムを呼び出す)、 プログラムはディレクティブ内のデータを解釈して、指定されたアカウントに対して操作を実行します。
ディレクティブはイーサリアムのスマートコントラクトの関数呼び出しに似ています。
トランザクション内の複数の指示の実行はアトミックです。
Solanaはトランザクションの有効性を示すために最新のブロックハッシュを使用しますが、トランザクションを行いたいときは、クラスターから最新のブロックハッシュを引き出して有効なトランザクションを作成します。トランザクションは最新のブロックハッシュから150ブロック間有効である。変更時間を超えた場合は、トランザクションを再度開始する必要がある。
ソラナには、イーサのトランザクションにNonceという概念はありません。
Solanaの取引手数料は、取引に含まれる署名の数(lamports_per_signature
)に関連するという点で、イーサのGasメカニズムとは大きく異なり、基本手数料現在、署名1件あたり0.000005SOL(5kランプポート)に設定されており、これはネットワークリソースを使用する権利に対する1回限りの手数料であり、トランザクションの実行に実際にどれだけのリソースが使用されたかにかかわらず(あるいはトランザクションがまったく実行されなかったかどうかにかかわらず)、ネットワークに前払いされる。
トランザクションの優先順位を上げたい場合[オプション料金]、「計算ユニット価格」を設定することができる。この価格はコンピュートユニットリミットと組み合わせて使用され、トランザクションの優先順位のコストを決定する。
デフォルトのコンピュート・ユニット・リミットは200,000 CUs per instructionであり、大規模な計算の場合は最大140万CUまで設定できます。 Solanaトランザクションは、指定された数のコンピュート ユニット(CU)を事前に要求し、この数を超えるとトランザクションは失敗します。
また、Solanaトランザクションはパケットサイズの制限を受け、Solanaネットワークは、UDPを介したクラスタ情報の高速かつ信頼性の高い伝送を保証するために、IPv6のMTUサイズ制約と一致する1280バイトの最大伝送単位(MTU)サイズに従う。必要なヘッダー(IPv6では40バイトと8バイトのフラグメント・ヘッダー)を計算した後でも、1232バイトをパケットに使用することができ、署名とメッセージの組み合わせがこの制限を超えることはありません。"">Solanaクラスタ
Solanaクラスタ ( クラスタ )とは、トランザクションを処理し、独自の台帳データ(Solanaにはいくつかの異なるクラスターがあり、それぞれが特定の目的を持っています:
クラスターはイーサの異なるネットワークに対応しています。
ローカルホスト< /span>:ローカルの開発ネットワークです。:デフォルトポート8899のローカル開発クラスタ。Solana コマンドラインインターフェイス (CLI) には、組み込みの test validator が付属しており、エアドロップやレート制限なしに個々の開発者のニーズに合わせてカスタマイズできます
Devnet(Devnet): Solanaのテストと実験のための、価値のないサンドボックス環境
テストネット。: Solanaのコア貢献者が新しいアップデートや機能を実験するためのテストサイトで、メインネットワークに到達する前にテストすることができます。また、開発者がパフォーマンステストを行うためのテスト環境としても使用されます
メインネットベータ: リアルタイムのライセンスフリーのクラスタです。実際のトランザクションが発生します。これは、ユーザー、開発者、トークン保有者、検証者が毎日やりとりする「本物の」Solanaです
各クラスタは独立して実行され、他のクラスタのことはまったく意識されません。間違ったクラスタに送られたトランザクションは拒否され、各オペレーティング環境の整合性が保証されます。
概要
この記事では、アカウントモデル、ブロックアウトメカニズム、トランザクション表記構造など、Solanaの中核となる概念を紹介しました。
これらの基本を理解したら、いよいよSolanaを使いこなし、アプリケーションの開発を始めましょう。
記事を参照する
ソラーナの仕組み - 仕組み
ソラーナの仕組み - 仕組み