blockchainjapan’s blog

旬のブロックチェーンを記事を厳選して提供!


技術シリーズ#11: Viteストレージレイヤーの概要

著:Allen Liu

Viteストレージの魔法を知りませんか?絶対に見逃すべきではありません。

ストレージレイヤーは、Viteチェーン上のさまざまなデータの永続性を担い、キャッシュや高度なクエリなどの主要な機能を提供します。 Viteストレージレイヤーに保存されるデータには、トランザクション(Transaction / AccountBlock)、スナップショット(SnapshotBlock)、アカウントの状態(AccountState)、および仮想マシンの状態(VmState)が含まれます。

ビジネス要件

各タイプのデータは、固有のデータ読み取り/書き込み要件を持つ特別なユースケースを満たします。

トランザクション

Vite の DAG 元帳では、トランザクション(Tx/Transaction)は AccountBlock として表示されます。一部のまれな状況を除いて、トランザクションは常にFromAddressによって開始され、ToAddressに送信され、SendTxと呼ばれます。ToAddressのアカウントがトランザクションを受信すると、ReceiveTxが生成され、SendTxにリンクされます。他のブロックチェーンと同様に、Txハッシュを使ってトランザクションを照会したり、Vite上のアドレスから特定のアカウントに属するすべてのトランザクションを検索したりすることが可能です。さらに、SendTxとReceiveTxの関係に基づいたクエリもサポートする必要があります。

スナップショット

スナップショットチェーンは、Viteの特別なブロックチェーンです。 スナップショットチェーンの各SnapshotBlockは、スナップショット内のすべてのトランザクションの基本情報を格納し、SnapshotBlockとスナップショットが作成された各Txとの間にリンク関係が確立されます。 したがって、SnapshotBlockのクエリとトラバーサルの要求に加えて、SnapshotBlockとTxの間のインデックス付きの関係に基づいて、SnapshotBlockとTxもクエリする必要があります。

アカウントの状態と仮想マシンの状態

アカウントの状態と仮想マシンの状態は非常に似ています。 これらは両方とも、アドレスの状態を示すために使用されるストレージデータ構造です。 違いは、アカウントの状態が共通アカウントに関連付けられているのに対し、仮想マシンの状態はコントラクトに属していることです。 トランザクションの実行中、状態は変化し続けるため、更新、トラバーサル、および復帰を満たすために、状態ストレージをバージョン管理する必要があります。 さらに、外部アプリケーションに時間の状態変化を認識させるために、変更の便利なトレースのためにEvent / VmLogをサポートする必要があります。

システムデザイン

コンセプチュアルデザイン

全体的な設計の目的は、後続のガイドラインに従うことにより、上位層のビジネスモジュールをサポートし、再利用性とシステムの信頼性を向上させることです。

  • 小さなファイルストレージ

ブロックの一時ストレージと永続ストレージの両方に固定サイズの小さなファイルを使用します。 小さなファイルの増分書き込みとバッチ読み取りのパフォーマンスは非常に効率的であり、ランダム読み取りのニーズも考慮に入れています。 大規模なブロックチェーントランザクションを保存するのに非常に適しています。

  • インデックス

LevelDBを使用してインデックスストレージを実装します。 LevelDBは、バッチ増分書き込みで優れたパフォーマンスを発揮します。これは、書き込みは多いが更新が少ないブロックチェーンに非常に適しています。 LevelDBは、カスタマイズされたキーを介してマルチバージョン状態の読み取り/書き込みを容易にするエンディアンをサポートします。 また、K-Vベースのランダムな読み取りと書き込みを実行することもできます。

  • キャッシュ

キャッシュを使用してホットデータを保存し、メモリのパフォーマンス上の利点を最大限に活用して読み取りを高速化します。 キャッシュは、特定の戦略に合わせて実装できます。

  • 非同期フラッシュ

I/Oパフォーマンスを向上させるために、データの永続ストレージは非同期でフラッシュされます。 データの整合性を確保するために2フェーズコミットが導入され、コミットされていないデータの損失を回避するために「redolog」が使用されます。

  • データ圧縮

データ圧縮を使用して、保存されるデータの量を減らします。

技術的な実装

Viteストレージレイヤーは、次の3つのモジュールとして実装されます。

  • blockDB

blockDBは、AccountBlockとSnapshotBlockのストレージを実現します。 データ形式が固定されていることにより、ほとんどのブロックのサイズは固定されており、小さなファイルに保存されます。 フラグメントを減らし、インデックス作成を容易にするために、複数のブロックを1つのファイルに保存できます。

  • indexDB

indexedDBは、ブロックにインデックスを付けるために使用され、さまざまなブロック間のリレーションも格納します。

  • stateDB

stateDBは、アカウントの状態と仮想マシンの状態を格納するために使用されます。 LevelDBキーのバイト位置を注意深く設計することにより、複数のバージョンのデータをサポートできます。

サマリー

この記事では、Viteストレージレイヤーが実際のビジネスニーズに合わせてどのように設計されているかについての概要を簡単に紹介しました。 次の記事では、上記の3つのモジュールの設計の詳細について紹介します。 ご期待ください。