본문으로 건너뛰기

멀티 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 컨트랙트를 호출하기 위해 프리컴파일로 보내는 calldata를 빌드합니다. 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 컨트랙트에서는 인코딩된 calldata와 함께 프리컴파일 주소를 호출합니다. 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-rollupCrossVmCaller.sol 스니펫을 포함하여 CosmWasm을 호출하도록 연결된 EVM 롤업을 스캐폴딩합니다:

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

모든 스캐폴더 템플릿은 롤업 배포하기를 참고하세요.