メインコンテンツまでスキップ

マルチVM(クロスVM呼び出し)

マルチVMロールアップは、専用の クロスVMプリコンパイル を介して QoreChain Native(Wasm)ランタイム上の CosmWasm コントラクトを呼び出せる EVM 実行レイヤーを実行します。RDK には、これらの呼び出しをエンコードする TypeScript ツールと、出発点となるスキャフォールドテンプレートが付属しています。

このツールは EVM → QoreChain Native(CosmWasm コントラクト)のみを対象と します。SVM は別個のランタイムであり、クロスVMプリコンパイルには含まれません。

注記

RDK v0.4.2 以降、Wasm ランタイムの VM オプション識別子は native (QoreChain Native)です。cosmwasm は引き続き受け入れられるレガシーエイリアスで、 どちらもワイヤ上では cosmwasm にマッピングされます — チェーン、エクスプローラー、 およびクロスVMプリコンパイルの ABI(executeCrossVMCall)に変更はありません。

プリコンパイル

クロスVMプリコンパイルは固定アドレスで公開されています:

import { CROSS_VM_PRECOMPILE } from "@qorechain/rdk";

console.log(CROSS_VM_PRECOMPILE); // 0x…0901

クロスVM呼び出しのエンコード

encodeCrossVmCalldata は、EVM コントラクトが CosmWasm コントラクトを呼び出すために プリコンパイルへ送信するコールデータを構築します。functionSelector は Solidity の 関数シグネチャに対する 4 バイトのセレクタを計算します。

import { encodeCrossVmCalldata, functionSelector } from "@qorechain/rdk";

const calldata = encodeCrossVmCalldata({
contract: "qor1cosmwasmcontractaddress...",
msg: { transfer: { recipient: "qor1...", amount: "100" } },
});

const selector = functionSelector("callCosmwasm(string,bytes)");

Solidity 側

EVM コントラクトからは、エンコードされたコールデータを使ってプリコンパイルアドレスを 呼び出します。multivm-rollup テンプレートには、次のような contracts/CrossVmCaller.sol スニペットが含まれています:

// contracts/CrossVmCaller.sol
address constant CROSS_VM_PRECOMPILE = 0x0000000000000000000000000000000000000901;

function callCosmwasm(bytes memory calldata_) internal returns (bytes memory) {
(bool ok, bytes memory out) = CROSS_VM_PRECOMPILE.call(calldata_);
require(ok, "cross-vm call failed");
return out;
}

マルチVMロールアップのスキャフォールド

新しいテンプレート multivm-rollup は、CrossVmCaller.sol スニペットを含め、CosmWasm を 呼び出すように配線された EVM ロールアップをスキャフォールドします:

npm create qorechain-rollup my-app -- --template multivm-rollup

すべてのスキャフォールダーテンプレートについては ロールアップのデプロイ を参照してください。