إنتقل إلى المحتوى الرئيسي

قابلية التشغيل البيني عبر الأنوية الافتراضية

تتيح بنية الأنوية الافتراضية الثلاثية في QoreChain (‏EVM، CosmWasm، SVM) للعقود الذكية على أي آلة افتراضية التواصل مع العقود على أي آلة افتراضية أخرى. توفر وحدة x/crossvm مساري مراسلة متزامناً وغير متزامن على حد سواء.

ملاحظة

تُعيَّن نقاط النهاية أدناه افتراضياً إلى عقدة محلية. على الشبكة الرئيسية، استخدم نقاط نهاية RPC الخاصة بـ qorechain-vladi (‏Cosmos RPC 26657، EVM JSON-RPC 8545)؛ أما شبكة الاختبار فهي qorechain-diana.


نظرة عامة على البنية

EVM (Solidity) CosmWasm (Rust/Wasm) SVM (BPF)
| | |
|--- sync (precompile) ->| |
| | |
|<-- async (EndBlocker) -|-- async (EndBlocker) ->|
| | |
|<------------ async (EndBlocker) ----------------|
المسارالاتجاهالتوقيتالآلية
المتزامنEVM إلى CosmWasmالمعاملة نفسهاPrecompile عند 0x0000...0901
غير المتزامنCosmWasm إلى EVMالكتلة التاليةMsgCrossVMCall عبر EndBlocker
غير المتزامنSVM إلى أي آلة افتراضيةالكتلة التاليةMsgCrossVMCall عبر EndBlocker
غير المتزامنأي آلة إلى SVMالكتلة التاليةMsgCrossVMCall عبر EndBlocker

المسار المتزامن (EVM إلى CosmWasm)

يستخدم المسار المتزامن precompile في EVM عند العنوان 0x0000000000000000000000000000000000000901. يتيح ذلك لعقود Solidity استدعاء عقود CosmWasm وتلقي استجابة ضمن المعاملة نفسها.

مثال Solidity

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

ينفّذ الـ precompile عقد CosmWasm فوراً ويُرجع النتيجة. تكلفة الغاز: 50,000 أساسية + تكلفة التنفيذ.


المسار غير المتزامن

تستخدم جميع اتجاهات الانتقال الأخرى عبر الأنوية الافتراضية طابور الرسائل غير المتزامن. تُرسَل الرسائل في كتلة واحدة وتُعالَج بواسطة EndBlocker في الكتلة التالية.

واجهة سطر الأوامر (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

دورة حياة الرسالة

تنتقل كل رسالة عبر الأنوية الافتراضية خلال مجموعة محددة من الحالات:

Submitted --> Pending --> Executed
|
+--> Failed
|
+--> Timed Out
الحالةالوصف
Submittedقُبِلت الرسالة في الطابور
Pendingبانتظار التنفيذ في تمريرة EndBlocker التالية
Executedاستُدعي العقد الهدف بنجاح؛ سُجِّلت الاستجابة
Failedارتدّ تنفيذ العقد الهدف؛ سُجِّل الخطأ
Timed Outتجاوزت الرسالة queue_timeout_blocks دون تنفيذ

المعاملات (Parameters)

المعاملالقيمةالوصف
max_message_size65,536 bytesالحد الأقصى لحجم الحمولة لكل رسالة
max_queue_size1,000الحد الأقصى للرسائل المعلّقة في الطابور
queue_timeout_blocks100عدد الكتل قبل انتهاء مهلة رسالة غير معالَجة

الأحداث

تُصدر وحدة x/crossvm الأحداث التالية:

الحدثالسماتالوصف
crossvm_requestmessage_id, source_vm, target_vm, target_contract, senderتم إرسال رسالة جديدة عبر الأنوية الافتراضية
crossvm_responsemessage_id, status, resultنُفّذت الرسالة (نجاح أو فشل)
crossvm_timeoutmessage_id, source_vm, target_vmانتهت صلاحية الرسالة دون تنفيذ

اشترك في الأحداث عبر WebSocket:

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

الاستعلام عن الرسائل

واجهة سطر الأوامر (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
}'

صيغة الاستجابة

{
"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
}

اعتبارات التصميم

الذرّية (Atomicity): الاستدعاءات المتزامنة (‏EVM إلى CosmWasm عبر الـ precompile) ذرّية — إذا ارتدّ أي من الطرفين، ترتدّ المعاملة بأكملها. أما الاستدعاءات غير المتزامنة فهي ليست ذرّية عبر الكتل؛ صمّم عقودك لتتعامل مع حالتي Failed وTimed Out بسلاسة.

الترتيب: تُعالَج الرسائل في الطابور بنظام الوارد أولاً يخرج أولاً (FIFO) ضمن كل تمريرة EndBlocker. لا يوجد ترتيب مضمون عبر الأنوية الافتراضية المصدرية المختلفة.

ترميز الحمولة: تعتمد صيغة الحمولة على الآلة الافتراضية الهدف:

  • أهداف EVM: استدعاءات دوال مُرمَّزة بـ ABI
  • أهداف CosmWasm: رسائل execute مُرمَّزة بـ JSON
  • أهداف SVM: بيانات تعليمات BPF مُرمَّزة بصيغة Hex

الخطوات التالية