Ana içeriğe geç

VM'ler Arası Birlikte Çalışabilirlik

QoreChain'in üçlü VM mimarisi (EVM, CosmWasm, SVM), herhangi bir sanal makinedeki akıllı sözleşmelerin başka herhangi bir VM'deki sözleşmelerle iletişim kurmasına olanak tanır. x/crossvm modülü hem senkron hem de asenkron mesajlaşma yolları sağlar.

not

Aşağıdaki uç noktalar varsayılan olarak yerel bir düğüme yöneliktir. Ana ağda qorechain-vladi RPC uç noktalarını kullanın (Cosmos RPC 26657, EVM JSON-RPC 8545); test ağı qorechain-diana şeklindedir.


Mimariye Genel Bakış

EVM (Solidity) CosmWasm (Rust/Wasm) SVM (BPF)
| | |
|--- sync (precompile) ->| |
| | |
|<-- async (EndBlocker) -|-- async (EndBlocker) ->|
| | |
|<------------ async (EndBlocker) ----------------|
YolYönZamanlamaMekanizma
SenkronEVM'den CosmWasm'aAynı işlem0x0000...0901 adresindeki önderlenmiş işlev
AsenkronCosmWasm'dan EVM'eSonraki blokEndBlocker aracılığıyla MsgCrossVMCall
AsenkronSVM'den herhangi bir VM'eSonraki blokEndBlocker aracılığıyla MsgCrossVMCall
AsenkronHerhangi birinden SVM'eSonraki blokEndBlocker aracılığıyla MsgCrossVMCall

Senkron Yol (EVM'den CosmWasm'a)

Senkron yol, 0x0000000000000000000000000000000000000901 adresinde bir EVM önderlenmiş işlevi kullanır. Bu, Solidity sözleşmelerinin CosmWasm sözleşmelerini çağırmasına ve aynı işlem içinde bir yanıt almasına olanak tanır.

Solidity Örneği

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface ICrossVM {
function call(bytes calldata payload) external returns (bytes memory);
}

contract CrossVMCaller {
ICrossVM constant CROSSVM = ICrossVM(0x0000000000000000000000000000000000000901);

function callCosmWasmContract(
string memory cosmwasmAddr,
string memory executeMsg,
uint256 funds
) external returns (bytes memory) {
bytes memory payload = abi.encode(cosmwasmAddr, executeMsg, funds);
return CROSSVM.call(payload);
}
}

Önderlenmiş işlev, CosmWasm sözleşmesini hemen yürütür ve sonucu döndürür. Gaz maliyeti: 50.000 taban + yürütme maliyeti.


Asenkron Yol

Diğer tüm VM'ler arası yönler asenkron mesaj kuyruğunu kullanır. Mesajlar bir blokta gönderilir ve sonraki blokta EndBlocker tarafından işlenir.

CLI

# CosmWasm to EVM
qorechaind tx crossvm call \
--source-vm cosmwasm \
--target-vm evm \
--target-contract 0x1234...abcd \
--payload '{"method":"transfer","params":["0xRecipient",100]}' \
--from mykey \
-y

# SVM to CosmWasm
qorechaind tx crossvm call \
--source-vm svm \
--target-vm cosmwasm \
--target-contract qor1contractaddr... \
--payload '{"execute":{"action":{}}}' \
--from mykey \
-y

# EVM to SVM (async)
qorechaind tx crossvm call \
--source-vm evm \
--target-vm svm \
--target-contract <program-id-base58> \
--payload '0a0b0c...' \
--from mykey \
-y

Mesaj Yaşam Döngüsü

Her VM'ler arası mesaj, tanımlanmış bir dizi durum arasında geçiş yapar:

Submitted --> Pending --> Executed
|
+--> Failed
|
+--> Timed Out
DurumAçıklama
SubmittedMesaj kuyruğa kabul edildi
PendingSonraki EndBlocker geçişinde yürütülmeyi bekliyor
ExecutedHedef sözleşme başarıyla çağrıldı; yanıt kaydedildi
FailedHedef sözleşme yürütmesi geri alındı; hata kaydedildi
Timed OutMesaj, yürütülmeden queue_timeout_blocks değerini aştı

Parametreler

ParametreDeğerAçıklama
max_message_size65.536 baytMesaj başına maksimum yük boyutu
max_queue_size1.000Kuyruktaki maksimum bekleyen mesaj
queue_timeout_blocks100İşlenmemiş bir mesajın zaman aşımına uğramasından önceki blok sayısı

Olaylar

x/crossvm modülü aşağıdaki olayları yayar:

OlayÖzniteliklerAçıklama
crossvm_requestmessage_id, source_vm, target_vm, target_contract, senderYeni VM'ler arası mesaj gönderildi
crossvm_responsemessage_id, status, resultMesaj yürütüldü (başarı veya başarısızlık)
crossvm_timeoutmessage_id, source_vm, target_vmMesaj yürütülmeden sona erdi

WebSocket aracılığıyla olaylara abone olun:

wscat -c ws://localhost:26657/websocket
> {"jsonrpc":"2.0","method":"subscribe","params":["tm.event='Tx' AND crossvm_request.message_id EXISTS"],"id":1}

Mesajları Sorgulama

CLI

# Query a specific message by ID
qorechaind query crossvm message <message-id>

# List all pending messages
qorechaind query crossvm pending

# List messages by sender
qorechaind query crossvm messages-by-sender <address>

JSON-RPC

curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "qor_getCrossVMMessage",
"params": ["<message-id>"],
"id": 1
}'

Yanıt Biçimi

{
"message_id": "crossvm-00000042",
"source_vm": "cosmwasm",
"target_vm": "evm",
"target_contract": "0x1234...abcd",
"sender": "qor1sender...",
"payload": "...",
"status": "executed",
"result": "0x...",
"submitted_height": 12345,
"executed_height": 12346
}

Tasarım Hususları

Atomiklik: Senkron çağrılar (önderlenmiş işlev aracılığıyla EVM'den CosmWasm'a) atomiktir — taraflardan biri geri alınırsa, tüm işlem geri alınır. Asenkron çağrılar bloklar arasında atomik değildir; sözleşmelerinizi Failed ve Timed Out durumlarını sorunsuzca ele alacak şekilde tasarlayın.

Sıralama: Kuyruktaki mesajlar, her EndBlocker geçişi içinde FIFO olarak işlenir. Farklı kaynak VM'ler arasında garantili bir sıralama yoktur.

Yük kodlaması: Yük biçimi hedef VM'e bağlıdır:

  • EVM hedefleri: ABI ile kodlanmış işlev çağrıları
  • CosmWasm hedefleri: JSON ile kodlanmış yürütme mesajları
  • SVM hedefleri: Hex ile kodlanmış BPF talimat verileri

Sonraki Adımlar