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.
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.