
Polkadot がリリースした 2025 年のロードマップから判断すると、 PolkaVM は間違いなく最も重要な技術アップデートの 1 つであり、最初に導入および適用されるものの 1 つは、Westend の Asset Hub での Solidity のサポートです。まず理解する必要があるのは、この実装は Moonbeam やその他の EVM サポート パラチェーンで広く使用されている以前の Frontier ではなく、新しい RISC-V ベースの PVM で Solidity コードを実行するということです。多くの DApp およびスマート コントラクトの開発者にとって、これは Polkadot 2.0 を理解して理解するための優れた方法となるでしょう。 Solidity には大規模な開発者ベースがあるため、多くの開発者が Polkadot 2.0 に参加し、誰もが PVM のパワーと効率的な実行効率を確認できるようになります。まず、その基本原理と技術アーキテクチャを見てみましょう。スマート コントラクト ソリューションには次のコンポーネントが含まれています。
パレットを復活させる
これは、スマート コントラクトを実行するブロックチェーン モジュールです。他のパレットと同様に、多数の外部関数とランタイム API が追加されます。ただし、ブロックチェーンがイーサリアム形式のトランザクションを処理できるようにするロジックも追加されます。これらの特別なトランザクションはチェーンに直接送信されません。これは理論的には可能ですが。ソース コードは次のディレクトリで表示できます。
🔗https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive pallet
代わりに、ユーザー (ウォレット、Dapps など) は、ブロックチェーン ノードと一緒に展開されたプロキシ サーバーに接続します。このプロキシは Ethereum Json RPC をエミュレートします。つまり、Ethereum JSON RPC インターフェイスをサーバーとして公開し、ネットワーク クライアントとしてノードに接続します。ペイロードをそのまま維持しながら、イーサリアム トランザクションを特別なスケジュール可能なファイルに再パッケージします。 Ethereum トランザクションをデコードし、それを pallet-revive が理解できるものに変換することは、上記のロジックに依存します。 Ethereum トランザクションのペイロードをそのままブロックに送信することで、さまざまなトランザクション形式を扱う必要のないツール (ブロック エクスプローラーなど) を簡単に適応させることができます。
スタンドアロン エージェントを使用するという選択は意図的です。新しいエンドポイントをノード バイナリに追加するには、追加のクライアントがそれらを実装する必要があります。そのため、クライアントに変更を加える必要のないこのアプローチを選択しました。
ポルカVM
これは、競合テクノロジーと比較して、私たちが行った最も明らかな変更です。コントラクトの実行には EVM を使用する代わりに、新しいカスタム仮想マシンを使用します。現在、ランタイム自体に PolkaVM インタープリターが含まれています。今後のアップデートでは、クライアント内で実行される完全な PolkaVM JIT が提供される予定です。各ワークロードに最適なバックエンドを使用できるように、インタプリタを引き続き利用できるようにすることに注意してください。たとえば、実行するコードが非常に少ないコントラクト呼び出しの場合、インタプリタはすぐにコードの実行を開始できるため (遅延解釈)、依然として高速になります。詳細を知りたい場合は、プロジェクトのソース コードを確認してください。
🔗 https://github.com/paritytech/polkavm
EVM との基本的な違いは次の 2 つです。
レジスター機
EVM はスタック マシンです。これは、関数の引数が無限スタックで渡されることを意味します。 PolkaVM は、レジスタ マシンである RISC-V に基づいています。これは、限られたレジスタのセットでパラメータを渡すことを意味します。この主な利点は、これらがレジスタ マシンであるため、基礎となるハードウェアへの変換ステップがより効率的に行われることです。レジスタ不足で有名な x86-64 命令セットよりも少なくなるように、レジスタの数を慎重に選択しました。 NP ハード レジスタ割り当ての問題を単純な 1 対 1 マッピングに還元しましょう。これが PolkaVM の高速コンパイル時間の秘密です。
単語の長さを減らす
EVM は 256 ビットのワード サイズを使用します。これは、すべての算術演算をこれらの大きな数値に対して実行する必要があることを意味します。これにより、意味のある数値を多くのネイティブ命令に変換する必要があるため、処理が非常に遅くなります。 PolkaVM は 64 ビットのワード サイズを使用します。これは、基盤となるハードウェアでネイティブにサポートされています。つまり、YUL (#Revive) 経由で Solidity コントラクトを変換する場合、YUL は整数型を自動的に変換するには低レベルすぎるため、依然として 256 ビット演算が行われます。ただし、さまざまな言語でコントラクトを作成し、Solidity からシームレスに呼び出すことは完全に可能です。ビジネス ロジックは Solidity で記述されますが、基礎となるアーキテクチャは Python に似たより高速な言語で記述され、重労働のほとんどは C モジュールによって実行されるシステムを想定しています。
リバイバル
PolkaVM 上で Solidity を実行するには、RISC-V にコンパイルする必要があります。このためにはコンパイラが必要です。これは、オリジナルの solc コンパイラを使用し、その中間表現 (YUL) 出力を RISC-V に再コンパイルすることによって機能します。これには、完全な Solidity コンパイラーを実装するよりもタスクがはるかに小さいという利点があります。このアプローチを選択することで、Solidity とそのさまざまなバージョンのすべての癖や癖をサポートします。プロジェクトのアドレスは https://github.com/paritytech/revive です。詳細を知りたい場合は、プロジェクトのソース コードを確認してください。
リミックス
Remix は、Solidity を開発するための最も人気のあるツールです。Web ベースなので、いつでもコントラクトを開発、デバッグ、デプロイできます。 Polkadot は、独自のバージョンのチェーン https://remix.polkadot.io も提供しており、この Web サイトからアクセスできます。 REMIX のフォークを維持する理由は、元のバージョンと比較した主な変更点はコンパイラーを変更する必要があることであったため、ブラウザー内コンパイラーの代わりにコンパイルにバックエンドを使用するように REMIX を変更しました。 LLVM ベースの復活はブラウザに負荷がかかりすぎるため、これが必要です。
開発実践
原則全体を理解したら、それを実践し、開発、展開、および契約のテストを完了する方法を確認できます。このドキュメントを参照できます。
🔗 https://contracts.polkadot.io/
開発およびテスト環境
まず第一に、revive パレットはwestend アセットハブに統合されており、その上で直接開発およびテストできます。

もちろん、独自のローカル テスト環境をセットアップすることもできます。これにより、バックエンド ログを確認してエラー メッセージを理解しやすくなります。
1. polkadot SDKのコードをダウンロードし、Kitchensinkノードをコンパイルします。

2. 開始ノード

3. Eth RPC プロキシを個別にコンパイルする

4. RPCサービスを開始します。

上記のサービスが開始されると、通常のサブストレート サービスはポート 9944 上で使用され、Eth はポート 8545 を使用します。
ソリディティ契約
まず、Remix を直接使用して開発できる Solidity コントラクトを試してみましょう。 [環境] では、westend 構成がデフォルトですでに利用可能になっています。テストにローカル環境を使用する場合は、カスタマイズした構成を追加できます。

このようにして、以前に開始した Eth RPC サービスと対話できるようになります。もちろん、複雑な Dapp アプリケーションを開発している場合は、他のフレームワークを使用できます。実験には Typescript と Viem を使用することをお勧めします。revive パレットに付属のテスト コードを参照できます。
🔗 https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive/rpc/examples/js
Rust 言語を使用したバージョンも並行ディレクトリにあります。デプロイメント コントラクトのコードの簡略版は次のとおりです。



1. まず、ウォレットクライアントを初期化します。
2. abiとバイトコードを使用してスマート コントラクトをデプロイする方法 ここでは、例の単純なコントラクトpiggyBank を選択します。ここでのバイトコードは、 polkavmにコンパイルされたコードであることに注意してください。
3. 読み取り関数を呼び出します。
4. トランザクションを送信して、コントラクト内の値を更新します。
5. トランザクションが完了したら、値が更新されたかどうかを再度確認します。
Rustはコントラクトを直接書きます
Solidity の使用に加えて、他の言語を直接使用してコントラクトを作成し、それらを polkavm コードにコンパイルして直接デプロイすることもできます。ここでは https://github.com/paritytech/rust-contract-template を参照します。
polkaVM コントラクトを直接デプロイすることで、Eth RPC を使用する必要がありません。コントラクトがコンパイルされたら、revive のアップロード メソッドを使用してコントラクトをチェーンにアップロードできます。

呼び出しが成功すると、ブラウザ イベントでコードのハッシュを見つけることができます。たとえば、この例では、ハッシュ値は 0x9bef6d3f29397e4994d96657375674096379ba850c31f8c7b950a6f9c13a238d です。
次のステップでは、コントラクトをインスタンス化し、revive の Instantiate メソッドを呼び出します。

ここでアカウントのマッピング解除エラーが発生します。コントラクトをデプロイして呼び出す前に、まずアカウント マップ メソッドを呼び出す必要があります。

その後、再度インスタンス化を試みると成功します。

いくつかのコントラクト アドレスを記録してみましょう。この展開では、コントラクト アドレスは 0xce58c0af740d49e573998ce92c9147565604d321 です。
最後に、revive の call メソッドを呼び出し、前にインスタンス化したコントラクトのアドレスを入力します。このようにして、PolkaVM コントラクトの開発、展開、テストが完了しました。

継続的に構築する
基本的な環境セットアップと開発プロセスが完了すると、より複雑なビジネス ロジックを完成させることができます。一般に、polkaVM はまだ初期段階にあります。問題が発生した場合、または一部の機能の完成やバグの修正を支援したい場合は、積極的に PR をこれらのリポジトリに送信できます。
polkadot 2.0 の機能が 2025 年に段階的に提供されると、polkaVM の使用シナリオと範囲はますます広くなると考えられており、スタートアップ プロジェクトでも事前に技術的な予約を行い、安全で効率的な製品を開発できるようになります。ジャム。
