Sari la conținutul principal

Multi-VM (apeluri cross-VM)

Un rollup multi-VM rulează un strat de execuție EVM care poate apela contracte CosmWasm pe runtime-ul QoreChain Native (Wasm) printr-un precompil cross-VM dedicat. RDK include uneltele TypeScript pentru a codifica acele apeluri și un șablon de schelet de la care să pornești.

Aceste unelte acoperă doar EVM → QoreChain Native (contracte CosmWasm). SVM este un runtime separat și nu face parte din precompilul cross-VM.

notă

Începând cu RDK v0.4.2, identificatorul opțiunii de VM pentru runtime-ul Wasm este native (QoreChain Native); cosmwasm rămâne un alias legacy acceptat, iar ambele se mapează la cosmwasm la nivel de rețea — lanțul, exploratorul și ABI-ul precompilului cross-VM (executeCrossVMCall) rămân neschimbate.

Precompilul

Precompilul cross-VM este expus la o adresă fixă:

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

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

Codificarea unui apel cross-VM

encodeCrossVmCalldata construiește calldata pe care contractul tău EVM o trimite către precompil pentru a invoca un contract CosmWasm. functionSelector calculează selectorul de 4 octeți pentru o semnătură de funcție Solidity.

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

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

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

Partea de Solidity

Dintr-un contract EVM apelezi adresa precompilului cu calldata codificată. Șablonul multivm-rollup include un fragment contracts/CrossVmCaller.sol de genul acesta:

// 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;
}

Generarea unui rollup multi-VM

Un șablon nou, multivm-rollup, generează un rollup EVM cablat să apeleze CosmWasm, inclusiv fragmentul CrossVmCaller.sol:

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

Vezi Implementarea unui Rollup pentru toate șabloanele generatorului de schelet.