Passa al contenuto principale

Multi-VM (chiamate cross-VM)

Un rollup multi-VM esegue un livello di esecuzione EVM in grado di chiamare contratti CosmWasm sul runtime QoreChain Native (Wasm) tramite un apposito precompile cross-VM. L'RDK fornisce gli strumenti TypeScript per codificare tali chiamate e un template di scaffold da cui partire.

Questi strumenti coprono soltanto EVM → QoreChain Native (contratti CosmWasm). SVM è un runtime separato e non fa parte del precompile cross-VM.

nota

A partire da RDK v0.4.2 l'identificatore dell'opzione VM del runtime Wasm è native (QoreChain Native); cosmwasm rimane un alias legacy accettato, ed entrambi vengono mappati su cosmwasm a livello di protocollo — la chain, l'explorer e l'ABI del precompile cross-VM (executeCrossVMCall) restano invariati.

Il precompile

Il precompile cross-VM è esposto a un indirizzo fisso:

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

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

Codifica di una chiamata cross-VM

encodeCrossVmCalldata costruisce i calldata che il tuo contratto EVM invia al precompile per invocare un contratto CosmWasm. functionSelector calcola il selettore a 4 byte per una firma di funzione Solidity.

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

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

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

Il lato Solidity

Da un contratto EVM chiami l'indirizzo del precompile con i calldata codificati. Il template multivm-rollup include uno snippet contracts/CrossVmCaller.sol sulla falsariga di quanto segue:

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

Scaffold di un rollup multi-VM

Un nuovo template, multivm-rollup, genera lo scaffold di un rollup EVM predisposto per chiamare CosmWasm, incluso lo snippet CrossVmCaller.sol:

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

Vedi Distribuire un rollup per tutti i template dello scaffolder.