Sealevel  –  数千のスマートコントラクトの並行実行

Solanaは、世界で最もパフォーマンスの高い、管理者の承認を必要としないブロックチェーンです。Solana Testnetの現在の反復では、200の物理的に異なるノードのネットワークが、GPUで実行している場合、1秒あたり50,000トランザクションを超える持続スループットをサポートします。 これを実現するには、いくつかの最適化と新しいテクノロジーを実装する必要があり、その結果、ネットワーク容量が飛躍的に向上し、ブロックチェーン開発の新しい段階が始まります。
これらがSolanaのネットワークを可能にしている7つのイノベーションです:
Proof of History (POH)— コンセンサス以前の時計;
Tower BFT — PoH最適化したPBFT;
Turbine — ブロック伝播プロトコル;
Gulf Stream — Mempoolなしのトランザクションフォワーディングプロトコル;
Sealevel — スマートコントラクト並行実行時間;
Cloudbreak — 水平スケール化されたアカウントデータベース;と
Replicators — 分散台帳保管
このブログ投稿では、Solanaの並列スマートコントラクトランタイムであるSealevelについて説明します。 開始する前に、EVMとEOSのWASMベースのランタイムはすべてシングルスレッドであるということを考慮する必要があります。 つまり、一度に1つのコントラクトがブロックチェーンの状態を変更します。 Solanaで構築したのは、バリデーターで使用可能なコアを使用して、数万のコントラクトを並行して処理できるランタイムです。
Solanaがトランザクションを並行して処理できる理由は、Solanaトランザクションが、トランザクションの実行中に読み取りまたは書き込みを行うすべての状態を記述するためです。 これにより、重複のないトランザクションを同時に実行できるだけでなく、同じ状態を読み取っているだけのトランザクションも同時に実行できます。
プログラムとアカウント
アカウントデータベースであるCloudbreakは、公開キーとアカウントのマッピングです。 アカウントは残高とデータを保持します。データはバイトのベクトルです。 アカウントには「所有者」フィールドがあります。 所有者は、アカウントの状態遷移を管理するプログラムの公開キーです。 プログラムはコードであり、状態はありません。 状態遷移のために割り当てられたアカウントのデータベクトルに依存します。
1.プログラムは、所有するアカウントのデータのみを変更できます。
2.プログラムは、所有するアカウントのみを借方記入できます。
3.どのプログラムでも、任意のアカウントに入金できます。
4.どのプログラムでも、任意のアカウントを読み取ることができます。
デフォルトでは、すべてのアカウントはシステムプログラムが所有するものとして開始されます。
1.システムプログラムは、アカウントの所有権を割り当てることができる唯一のプログラムです。
2.システムプログラムは、ゼロで初期化されたデータを割り当てることができる唯一のプログラムです。
3.アカウント所有権の割り当ては、アカウントの存続期間中に1回のみ実行できます。
ユーザー定義プログラムは、ローダープログラムによってロードされます。 ローダープログラムは、アカウント内のデータを実行可能としてマークできます。 ユーザーは次のトランザクションを実行して、カスタムプログラムをロードします。
1.新しい公開キーを作成します。
2.コインをキーに転送します。
3.システムプログラムにメモリを割り当てるように指示します。
4.システムプログラムに、アカウントをローダーに割り当てるように指示します。
5.バイトコードを分割してメモリにアップロードします。
6.ローダープログラムに、メモリを実行可能としてマークするように指示します。
この時点で、ローダーはバイトコードを検証し、バイトコードがロードされるアカウントを実行可能プログラムとして使用できます。 新しいアカウントは、ユーザー定義プログラムが所有しているとマークすることもできます。
ここで重要な洞察は、プログラムはコードであり、キーと値のストア内には、プログラムとそのプログラムのみが書き込みアクセスできるキーのサブセットが存在するということです。
トランザクション
トランザクションは、命令ベクトルを指定します。 各命令には、プログラム、プログラム命令、およびトランザクションが読み書きするアカウントのリストが含まれています。 このインターフェイスは、デバイスへの低レベルのオペレーティングシステムインターフェイスに触発されています。
size_t
readv(int d, const struct iovec iov, int iovcnt);
struct iovec {
char iov_base; / Base address. /
size_t iov_len; / Length. /
};
readvやwritevなどのインターフェースは、ユーザーが読み書きしたいすべてのメモリを事前にカーネルに伝えます。 これにより、OSがプリフェッチし、デバイスを準備し、デバイスで許可されている場合は同時に操作を実行できます。
Solanaでは、各命令はVMに事前に読み書きするアカウントを指示します。 これが、VMに対する最適化のルートです。
1.数百万の保留中のトランザクションをソートします。
2.すべての重複しないトランザクションを並行してスケジュールします。
さらに、CPUおよびGPUハードウェアの設計方法を活用できるということです。
Solana、スケール化のためのブロックチェーン
SIMD命令を使用すると、単一のコードで複数のデータストリームを実行できます。 これは、SealevelがSolana設計に固有の追加の最適化を実行できることを意味します:
1.すべての命令をプログラムIDでソートします。
2.すべてのアカウントで同じプログラムを同時に実行します。
なぜこれが非常に強力な最適化であるかを理解するには、CUDA開発者ガイドをご覧ください。
「CUDAアーキテクチャは、スケーラブルなマルチスレッドストリーミングマルチプロセッサ(SM)の配列を中心に構築されています。 ホストCPU上のCUDAプログラムがカーネルグリッドを呼び出すと、グリッドのブロックが列挙され、利用可能な実行容量を持つマルチプロセッサに配布されます。」
最新のNvidia GPUには4000個のCUDAコアがありますが、約50個のマルチプロセッサがあります。 マルチプロセッサは一度に1つのプログラム命令のみを実行できますが、80の異なる入力で並列にその命令を実行できます。 したがって、Sealevelによって読み込まれた着信トランザクションがすべてCryptoKitties :: BreedCatsなどの同じプログラム命令を呼び出す場合、Solanaは利用可能なすべてのCUDAコアですべてのトランザクションを同時に実行できます。
パフォーマンスに無料のランチがないため、SIMD最適化を実行可能にするには、実行される命令に少数のブランチを含める必要があり、すべて同じブランチを使用する必要があります。 マルチプロセッサは、バッチで実行される最も遅いパスに拘束されます。 このことを考慮しても、Sealevelを介した並列処理は、シングルスレッドランタイムと比較してブロックチェーンネットワークが機能する方法の基礎的な開発を示し、非常に高いスループットと使いやすさを実現します。
Solana、スケール化のためのブロックチェーン
SolanaのSealevelの実装と、Proof of History、Proof of Replication、Gulf Streamなどのイノベーションが組み合わさって、世界で最もパフォーマンスの高いブロックチェーンを作成します。 Solanaのtestnetは本日公開されます。 https://testnet.https://solana.com/で見ることができます。 コストの観点から、ほんの少数のノードのみを実行しています。 ただし、ベンチマークのために、AWS、GCE、Azureの23のデータセンターにある(共有ハードウェアではなく)200を超える物理的に異なるノードに多くのインスタンスでスピンアップしました。
ランタイムは現在機能しており、開発者は今すぐtestnowにコードを展開できます。 開発者は現在C言語でスマートコントラクトを構築でき、私たちはRustツールチェーンに積極的に取り組んでいます。 RustはSolanaスマートコントラクト開発の主要言語になります。 Rustツールチェーンは、Solana Javascript SDKの一部として公開されており、Software Development Kitをさらに反復適応しています。
Solanaはまもなく、パブリックベータインセンティブバリデーターを起動して、Cosmosのゲームオブステークスに似たTour de SOLを介してノードを実行し、トークンを稼ぎながらSolanaネットワークの限界を試すよう大衆に働きかけます。