—— ガイド ——
前回の記事では、仮想マシンの歴史、特徴、開発、Solidity、EVMについて詳しく紹介しました。 Solidity と EVM の登場により、ブロックチェーン アプリケーション シナリオに新たな扉が開かれましたが、契約開発者は Solidity を使用してスマート コントラクトを開発するため、新しい言語を学習するという問題が必然的に発生します。
では、「受託開発者」と「ブロックチェーン」をすぐに統合できるような古い友人はいるでしょうか?
周知のとおり、Java は広く使用されているオブジェクト指向プログラミング言語であり、「一度書けばどこでも実行できる」というクロスプラットフォーム機能を備えています。そこで、私たちはブロックチェーンプラットフォームにJavaを導入し、Javaスマートコントラクトを実行できる実行エンジンHVMのセットを開発しました。ブロックチェーンへの Java スマート コントラクトの導入は、主に次の目的に役立ちます。
*スマート コントラクト開発コストを削減し、コントラクト開発者が文法の詳細ではなくコントラクト ロジック自体に集中できるようにします。
*ブロックチェーンのシナリオに適した使い慣れたツールと手法を開発者に提供し、「車輪の作成」を繰り返すことを回避します。
* 従来のスマート コントラクトと台帳の間の単一の対話モードの問題を解決し、ビジネス シナリオのニーズをより適切に満たすために、台帳の対話のためのさまざまなより便利で柔軟なデータ構造と方法を提供します。
文章
文章
コントラクト開発者の観点から見ると、Java スマート コントラクトを使用するプロセスには、通常、コントラクトの開発、コントラクトのデプロイメント、およびコントラクトの呼び出しの 3 つのステップが含まれます。
▲Java受託開発
従来のスマート コントラクトと比較して、Java スマート コントラクトの開発と使用はより簡単かつ便利であり、主に以下の点に反映されています。
1) 迅速なプロジェクト構築: 開発者は、ローカル IDE で新しい Java プロジェクトを作成し、コントラクト開発の依存関係パッケージをインポートするだけでコントラクトを開発できます。コーディングが完了すると、コードはコントラクト Jar ファイルにパッケージ化され、チェーン上でのデプロイメントに使用できるようになります。
2) 多くのツールとメソッドがあります。開発者は JDK のクラスとメソッドを使用して、「ホイール作成」を繰り返す手間を回避できます。
3) 学習コストが低い: Java 言語は広く使用されており、ほとんどの開発者はコントラクト開発の依存関係パッケージのインターフェイスを理解するだけで、Java スマート コントラクトを上手に使用できるようになります。
▲Javaコントラクトの展開
Java スマート コントラクトをデプロイする場合、開発者はトランザクションを通じてコントラクト Jar パッケージをチェーンにアップロードします。ブロックチェーンはコントラクトを初期化し、一意のコントラクト アドレスを生成し、トランザクション レシートを通じてコントラクト アドレスを開発者に渡します。
▲Javaコントラクト呼び出し
開発者は、コントラクト アドレスを指定し、コントラクト メソッド名とパラメーターを入力することで、コントラクト呼び出しトランザクションを構築して送信できます。ブロックチェーンプラットフォームはトランザクションを受信すると、JVMインスタンスを取得し、コントラクトアドレスに対応するコントラクトJar内のクラスファイルをJVMにロードし、コントラクトクラスのインスタンスを作成して指定されたメソッドを呼び出し、実行結果を取得してリターンします。トランザクション受領書を通じて開発者に送信されます。
——HVM詳細説明——
▲ JVM によるブロックチェーンへのアクセス
Java スマート コントラクト実行エンジンを実装するには、JVM をブロックチェーンに接続するという問題を避けてはなりません。現在、ほとんどのブロックチェーン システムは Golang を使用して開発されており、ほとんどのオープン ソース JVM は通常 C++ で書かれています。 JVM をブロックチェーン システムにすばやく接続したい場合は、CGO を介して Golang と C++ を接続できます。ただし、ブロックチェーン システムにおける JVM の内部最適化の必要性を考慮して、HVM は Golang を介して JVM を実装することを選択しました。 JVMを自社で実装すると開発コストが高くなりますが、その後のブロックチェーンシナリオにおけるパフォーマンスの最適化や機能拡張作業が大幅に容易になります。
「JVM がブロックチェーンに接続されている場合、JVM をブロックチェーン内の Java コントラクト実行エンジンにするために他に何をする必要がありますか?」
▲仮想マシンのセキュリティ適応
上で述べたように、私たちはユーザーがブロックチェーンの Java コントラクト エンジンで JDK のクラスとメソッドを使用できるようにサポートしています。ブロックチェーン上のコントラクト実行エンジンは実行環境の分離性と実行結果の確実性を満たす必要があることを考慮すると、JDKやJVMへのセキュリティ対応が必要となります。これらには次のものが含まれます。
1) 「安全でない」クラスとメソッドを無効にする: スマート コントラクト エンジンでは、一貫性のない実行結果を引き起こす可能性のあるメソッドは「安全ではない」です。たとえば、Java で生成された乱数メソッドの実行結果は不確実であり、ブロックチェーン内の Java コントラクト エンジンは、これらの「安全でない」クラスとメソッドを無効にします。
2) コントラクトの実行環境を分離する: ブロックチェーン プラットフォームの Java スマート コントラクトは、分離された実行環境を必要とします。つまり、Java スマート コントラクトは、通常の Java プログラムのように、スレッド、ネットワーク、システム時間へのアクセス、その他の機能を使用できません。さらに、いくつかのブロックチェーン関連のメソッドを JDK に実装しましたが、一部のメソッドは Java コントラクトから呼び出すことが許可されていません。したがって、HVM 内にメソッド呼び出しフィルターを実装して、許可されていないメソッド呼び出しをインターセプトしました。
3) ロジック実行シーケンスの決定: EVM と同様に、コントラクト実行のコストを計算するために HVM 内に一連の Gas メカニズムを実装しました。命令実行の違いにより、異なるノードで計算される Gas 値も異なります。オリジナルの JDK では、一部のメソッドを 2 回呼び出すと、結果は同じでも、ロジック実行のコード パスが異なります。シングルトン パターンを使用するクラスを例にとると、このクラスのインスタンス メソッドを初めて呼び出すときは、このクラスのインスタンスを作成する必要がありますが、後でそのメソッドを呼び出すときは、インスタンスを作成する必要はありません。このロジックの違いにより、新しく開始されたノードのガス値が他のノードのガス値と不一致になります。したがって、ロジックの実行シーケンスが常に一貫していることを保証するために、JDK でこの種のロジックを適応させる必要があります。
▲台帳連携の仕組み
JVM をブロックチェーンに接続するには、契約と台帳データの間の相互作用の機能を保証することも必要です。 EVM には台帳の対話に関する指示がありますが、JVM 仕様には台帳の対話に関する指示がないため、Java スマート コントラクトがブロックチェーン上の台帳データを操作できるように、台帳データの対話メカニズムのセットを提供する必要があります。
台帳対話メカニズムを実装するには 2 つのオプションがあります。
1) JVM で台帳対話用のカスタム命令セットのセットを実装します。同時に、Java コントラクト用のコンパイラまたはプラグインが提供され、コントラクトのバイトコードでブロックチェーン内の台帳対話専用のカスタム命令を生成します。
2) JDK で台帳データを読み書きするためのツール クラスとメソッドのセットを実装します。契約実行プロセス中に、契約実行エンジンはこれらのメソッドを呼び出して、契約永続フィールドの読み取りおよび書き込み操作を担当します。
HVM の実装中に、2 番目のオプションが選択されました。コントラクト実行のプロセスで、コントラクトの永続フィールドが使用される場合、コントラクト実行エンジンは書籍読み取りメソッドを呼び出して書籍からデータを取得します。台帳書き込み操作の場合、実行エンジンは最初にキャッシュし、コントラクトの実行が完了した後、データ更新を含むコントラクト内の永続フィールドをスキャンし、更新されたデータを台帳にフラッシュします。
Java メソッドを使用して台帳データ対話機能を実現する場合、指示メソッドと比較して指示のオーバーヘッドは大きくなりますが、ユーザーにとってはよりフレンドリーな永続フィールドの操作方法を提供できます。 Mapを例に挙げると、JavaスマートコントラクトではGetとPut以外のメソッドをMapに提供し、イテレータなどを利用して簡単にMapを操作できるようにしています。マップの読み取りと書き込みの複雑なシナリオを考慮すると、信頼性の高いイテレータ ロジックを維持することはさらに複雑になります。台帳データを命令の形式で操作するには、台帳対話命令の複雑なセットを実装する必要があります。明らかに、ツール クラスとメソッドは、これらの複雑な論理操作を実行するのにより適しており、コントラクト データ構造関数の拡張をサポートする方が簡単です。
このスキームにより、ユーザーは Java スマート コントラクトを作成するときに強力なデータ構造クラス操作台帳を選択できます。これらのデータ構造クラスは、ユーザーが認識できないように台帳対話の Java メソッドをカプセル化し、可能な限り JDK でインターフェースを実装します。 HVMMap や HVMList などのデータ構造は、それぞれ JDK の Map インターフェイスと List インターフェイスを実装しており、JDK が提供する他の Map や List とほぼ同じです。
▲仮想マシンの比較分析
HVM 契約に加えて、一般的な契約には EVM の Solidity 契約や Fabric の Chaincode などが含まれます。
EVM は、サンドボックス化された完全に分離されたコントラクト実行環境を提供します。 Solidity は設計当初からスマート コントラクト言語として検討されており、書籍の運用において大きな利点を持っています。
Fabric の Chaincode は、複数の言語での記述をサポートしています。チェーンコードは保護された Docker コンテナ内で実行されます。クライアントから送信された呼び出しリクエストを受信した後、コンテナ内の家計簿の読み書きセットをシミュレートしてクライアントに返します。最後に、クライアントはシミュレートされたトランザクションを再度開始します。読み取り/書き込みセットを台帳に書き込むリクエストを生成します。
他の実行エンジンと比較して、HVM には次の主な機能があります。
※HVM契約はセキュリティの高い安全なクローズドサンドボックス環境で実行されます。
*実行エンジンはプラットフォームに組み込まれており、ネットワークに依存しません
*HVM は完全なコントラクト ライフサイクル管理メカニズムを提供し、コントラクトは SDK および API 呼び出しを通じてのみアップグレードできます。
* ログ出力、暗号スイート、多様な通話契約などの豊富な組み込み機能を提供
Java言語JDK自体が提供する機能に加え、HVMはブロックチェーン台帳データの操作に基づいたさまざまなデータ構造を提供します。
- まとめ -
この記事では、まず開発者の観点から Java スマート コントラクトの開発と使用プロセスを紹介し、次にブロックチェーン内の JVM にアクセスするための技術的ソリューションを説明し、JDK のコード変換と台帳対話メカニズムの実現について説明します。 HVM は、より優れたパフォーマンスとよりフレンドリーなユーザー エクスペリエンスという目標に向かって常に前進しています。同時に、業界では契約実行エンジンが花盛りとなっており、次にRustなどの言語でスマートコントラクトを作成できるFVMと、ブロックチェーン上でのSQL実行をサポートするKVSQLについて詳しく紹介していきます。調整しました!
著者について
著者について
ルー・イーミン、ヤオ・ビン
参考文献
参考文献
[1] Java 仮想マシンの仕様。
