VM
仮想マシンの優れた実装はエレガントに設計され、使いやすく、セキュアであることが求められます。EVM、EOS、C Lua、V8の長所と短所を比較した後、EVMやEOSではなし得なかった根本的な問題を解決します。IOSTのVMはChrome上で高いパフォーマンスを発揮するV8に基づいて構築し、管理しています。
1. IOST V8VMのアーキテクチャと設計
VMManagerは、V8VMのコア部分で、次のような3つの機能があります。
- VMの入口 他のモジュールからのRPCリクエスト、ブロック検証、トランザクション検証などのリクエストを受け付けます。それらを前処理し、フォーマットした後、VMWorkerに渡します。
- VMWorkerのライフサイクル管理 ワーカーの数は、システムの負荷により動的に変更され、ワーカーは再利用されます。ワーカー内では、JavaScriptのホットローンチとホットスポットサンドボックススナップショット永続化機能がVMの頻繁な作成を減らし、同じコードがロードされたときに、CPUやメモリが過負荷にならないようにしています。 これにより、システムのスループットが向上し、fomo3Dのような大規模なユーザーベースのコントラクトを処理するときでさえ、快適に稼働します。
- ステートDBのインターフェース管理 資金が不足する場合は、トランザクション全体が拒否され、アトミック性が保証されます。同時にステートDBには、RocksDBのデータを取り出す前に2段のキャッシュがあります。
2. サンドボックスのコア設計
JavaScriptで書かれたスマートコントラクトの実行のペイロードとして、ChromeのV8内で呼び出せるようにパックします。それにはコンパイルと実行の2段階があります。
コンパイル段階
スマートコントラクト開発とパブリッシュには主に2つの機能があります。
- コントラクトのパック Webpackの実装に基づいて、すべてのJavaScriptコードをパッケージ化し、IOST V8VMで大規模なプロジェクトを開発できるようにします。また、IOSTのV8VMとNode.jsのモジュールシステムは完全な互換性があるので、require、module.exports、exportsなどのメソッドをシームレスに使って、ネイティブ開発と同じようにJavaScriptで開発することもできます。
- コントラクトのスナップショット スナップショットテクノロジーにより、コンパイルは分離とコンテキストのパフォーマンスが向上します。スナップショットのアンチシリアライゼーションにより、ランタイムでのJavaScriptの実行速度が飛躍的に向上します。
実行段階
オンチェーンコントラクトの実行にも、主に2つの機能があります。
- LoadVM. Chrome V8オブジェクトの生成、システム実行パラメータのセット、関連するJavaScriptクラスライブラリのインポートなどを含むVMを完全に初期化します。一部のJavaScriptクラスライブラリは次のものを含んでいます。
クラスライブラリ | 機能 |
---|---|
Blockchain | モジュールのキャッシュやプリコンパイル、サイクルコールなどを含むNode.jsのようなモジュールシステム |
Event | ステートライブラリを使ったJavaScriptの読み書きとコントラクトがエラーになった場合のロールバック |
NativeModule | 転送、払い出し、現在ブロック情報の取得、トランザクションなどのブロックチェーン関連の関数 |
Storage | イベントの実装。JavaScriptによるコントラクトの内部イベントは、オンチェーンになった後、コールバックを受け取ることができる |
- 実行 最終的にJavaScriptによるスマートコントラクトを実行します。IOST V8VMは、コントラクトを独自スレッドで実行し、実行状態をモニターし、エラーが発生したり、メモリ不足になったり、タイムアウトしたら実行中のコントラクトを
終了
し、異常終了として結果を返します。