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

تطوير SVM

تتضمن QoreChain بيئة تنفيذ Solana Virtual Machine (SVM)، تتيح للمطورين نشر وتنفيذ برامج SBF/BPF باستخدام أدوات Solana المألوفة. توفّر وحدة SVM واجهة JSON-RPC متوافقة مع Solana على المنفذ 8899، والتي يشغّلها أمر qorechaind start تلقائيًا (انظر خادم JSON-RPC أدناه).

ملاحظة

تستخدم الأوامر أدناه شبكة qorechain-vladi الرئيسية، العاملة منذ 7 يونيو 2026 بإصدار السلسلة v3.1.97. استبدل --chain-id qorechain-diana للشبكة التجريبية.


إرسال معاملات SVM معطّل حاليًا

اعتبارًا من إصدار السلسلة v3.1.89 (22 أغسطس)، وعقب حادثة وقعت، أصبح مسار تنفيذ SVM معطّلًا على مستوى الشبكة بأكملها بالنسبة لإرسال المعاملات — أي معاملة تُرسَل إلى x/svm (نشر برنامج، تنفيذ تعليمات، إنشاء حساب، تحويلات) تُعيد code 11, "SVM module is disabled". ينطبق هذا على عقدتك الخاصة أيضًا وعلى النقاط العامة سواء بسواء. قد تستجيب طرق RPC ذات طابع القراءة، لكن لا تبنِ أو تختبر تكاملًا فعليًا مع SVM إلى أن يُعاد فتح المسار — هذا تعطيل وقت الترجمة، وليس معاملًا وقت التشغيل، لذا لا يمكن إعادة تفعيله عبر تصويت حوكمة؛ ومن المتوقع أن يبقى معطّلًا إلى أن يُخلي طرفه تدقيق خارجي.

نظرة عامة​

توفّر وحدة x/svm ما يلي:

  • عملة QOR الأصلية كأصل من الدرجة الأولى على SVM — الرصيد الموحّد للحساب، ظاهرًا باللامبورت (lamports)
  • نشر وتنفيذ برامج SBF/BPF
  • إنشاء وإدارة حسابات البيانات
  • نقطة نهاية JSON-RPC متوافقة مع Solana
  • تخطيط عناوين ثنائي الاتجاه بين تنسيقَي عناوين QoreChain وSolana
  • قياس ميزانية الحوسبة واقتصاديات التخزين القائمة على الإيجار

عملة QOR الأصلية على واجهة SVM​

اعتبارًا من إصدار السلسلة v3.1.82، أصبحت واجهة SVM واجهة QOR أصلية من الدرجة الأولى، وليست رصيدًا معزولًا منفصلًا. الرصيد الموحّد الواحد للحساب — نفس الأموال الظاهرة كـ uqor على واجهة Cosmos وكـ wei بـ 18 منزلة عشرية على واجهة EVM — يظهر على جانب SVM باللامبورت (9 منازل عشرية):

1 uqor = 1,000 lamports · 1 QOR = 1,000,000,000 lamports
  • getBalance / getAccountInfo تُعيدان رصيد الحساب من QOR الأصلية (باللامبورت).
  • getSignaturesForAddress تُعيد سجل المعاملات المرتبطة بعنوان — قابل للاستخدام لرصد الإيداعات باستخدام أدوات Solana القياسية.
  • تحويلات System Program تنقل عملة QOR الأصلية — تعليمة تحويل بأسلوب Solana تنقل نفس الأموال التي كانت ستنقلها MsgSend على Cosmos أو تحويل على EVM.
  • صيغة عنوان SVM — عنوان SVM الخاص بالحساب هو الـ 20 بايت الخاصة بالحساب، مكمَّلة يمينًا لتصبح 32 بايت ومُرمَّزة بـ base58. صيغ العناوين الثلاث كلها (qor1...، 0x...، base58) تشير إلى الحساب ذاته.

النقاط العامة (https://svm.qore.host، https://svm-testnet.qore.host) هي للقراءة فقط — إرسال المعاملات معطّل عند الحافة. في الوضع الطبيعي كنت ستشغّل عقدتك الخاصة (المنفذ 8899) لإرسال معاملات SVM، لكن انظر التحذير أعلاه: مسار معاملات x/svm نفسه معطّل حاليًا على مستوى الشبكة بأكملها، بما في ذلك على عقدتك الخاصة.


خادم JSON-RPC​

خادم JSON-RPC المتوافق مع Solana يُشغَّل بواسطة qorechaind start وهو مُفعَّل افتراضيًا. يُضبط عبر قسم [svm-rpc] في app.toml:

[svm-rpc]
# Enable the Solana-compatible JSON-RPC server
enable = true
# Address the server listens on
address = "127.0.0.1:8899"

القيم الافتراضية هي enable = true و address = "127.0.0.1:8899"، لذا فإن عقدة شُغِّلت للتو تقدّم بالفعل واجهة Solana JSON-RPC على المنفذ 8899 — تتصل @solana/web3.js عبر http://127.0.0.1:8899 دون أي إعداد إضافي. تُبلغ getVersion عن 1.18.0-qorechain، وتُعيد getBalance / getAccountInfo حسابات SVM الفعلية الحيّة على السلسلة.

الخاصيةالقيمة
العنوان الافتراضيhttp://127.0.0.1:8899
مُفعَّلنعم، افتراضيًا
يُشغَّل بواسطةqorechaind start
التوافقيةSolana JSON-RPC (مجموعة فرعية)
getVersion1.18.0-qorechain

الطرق المدعومة​

الطريقةالوصف
getAccountInfoاسترجاع بيانات الحساب ورصيد اللامبورت
getBalanceالحصول على رصيد الحساب باللامبورت (عملة QOR الأصلية)
getSignaturesForAddressسجل المعاملات لعنوان ما
getSlotرقم الـ slot الحالي
getMinimumBalanceForRentExemptionالحد الأدنى للرصيد للإعفاء من الإيجار لحجم بيانات معيّن
getVersionمعلومات إصدار وقت تشغيل SVM
getHealthفحص سلامة نقطة نهاية SVM

نشر البرامج والتفاعل معها​

معلومات

تنفيذ SBF حديث. جرى تحديث محرك تنفيذ SVM ليعتمد على solana-sbpf 0.21.1، لذا فإن برامج SBF المُجمَّعة حديثًا من سلسلة أدوات Solana الحالية (platform-tools v1.53 / agave 4.x) تُنشَر وتعمل على QoreChain — التنفيذ مدعوم بالكامل، وليس مقتصرًا على النشر فقط. البرامج المبنية باستخدام إما cargo build-sbf --arch v0 أو --arch v3 مدعومة.

  1. نشر برنامج SBF — قم بتجميع برنامج Solana الخاص بك إلى كائن مشترك SBF باستخدام platform-tools الحالية (v1.53 / agave 4.x)، ثم انشره على QoreChain:

    # Build with the current Solana toolchain (--arch v0 or --arch v3)
    cargo build-sbf --arch v3

    # Deploy the compiled program
    qorechaind tx svm deploy-program ./my_program.so \
    --from mykey \
    --gas auto \
    --gas-adjustment 1.3 \
    -y

    تتضمن استجابة المعاملة معرّف البرنامج بصيغة base58.

  2. تنفيذ تعليمة — استدعِ برنامج BPF موجودًا على السلسلة ببيانات تعليمات:

    # Execute instruction
    qorechaind tx svm execute <program-id-base58> <data-hex> \
    --from mykey \
    --gas auto \
    -y
    المعاملالصيغةالوصف
    program-id-base58سلسلة base58عنوان البرنامج المنشور
    data-hexبايتات مُرمَّزة بالسداسي عشريبيانات التعليمات المُسلسلة
  3. إنشاء حساب بيانات — غالبًا ما تحتاج البرامج إلى حسابات لتخزين الحالة. أنشئ واحدًا بحجم ومالك محدَّدين:

    # Create data account
    qorechaind tx svm create-account <owner-base58> <space> <lamports> \
    --from mykey \
    --gas auto \
    -y
    المعاملالوصف
    owner-base58البرنامج المالك لهذا الحساب (base58)
    spaceحجم حقل البيانات بالبايت
    lamportsالرصيد الابتدائي (يجب أن يفي بحد الإعفاء الأدنى من الإيجار)

    استعلم عن الحد الأدنى للرصيد المُعفى من الإيجار لحجم معيّن:

    # RPC: getMinimumBalanceForRentExemption
    curl -X POST http://localhost:8899 \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getMinimumBalanceForRentExemption",
    "params": [1024]
    }'
  4. استخدام @solana/web3.js — تعمل حزمة Solana JavaScript SDK مباشرةً مع نقطة نهاية QoreChain SVM:

    import { Connection, PublicKey } from "@solana/web3.js";

    const connection = new Connection("http://127.0.0.1:8899");

    // Check health
    const health = await connection.getHealth();
    console.log("SVM health:", health);

    // Get slot
    const slot = await connection.getSlot();
    console.log("Current slot:", slot);

    // Get account info
    const pubkey = new PublicKey("YourBase58ProgramId...");
    const accountInfo = await connection.getAccountInfo(pubkey);
    console.log("Account data:", accountInfo);

    // Get balance
    const balance = await connection.getBalance(pubkey);
    console.log("Balance (lamports):", balance);

تخطيط العناوين​

تحافظ QoreChain على تخطيط عناوين ثنائي الاتجاه بين عناوين Bech32 الأصلية (qor1...) وعناوين base58 على طراز Solana:

الاتجاهمثال
من الأصلي إلى SVMqor1abc...xyz يُخطَّط إلى عنوان base58 حتمي
من SVM إلى الأصليعناوين البرامج بصيغة base58 تُخطَّط عودةً إلى ما يعادلها بصيغة qor1...

التخطيط حتمي وتديره وحدة x/svm. كلا التمثيلين يشيران إلى الحساب الأساسي ذاته.


نموذج الإيجار​

تستخدم وحدة SVM نموذج تخزين قائم على الإيجار لمنع تضخم الحالة:

المعاملالقيمة
لامبورت لكل بايت في السنة3,480
مضاعِف الإعفاء من الإيجار2.0
تكرار التحصيلكل حقبة (epoch)
  • الحسابات التي يكون رصيدها أعلى من 2 * (data_size * 3480 / seconds_per_year) باللامبورت تكون معفاة من الإيجار ولا تُحاسَب أبدًا.
  • الحسابات الأدنى من حد الإعفاء من الإيجار تُحاسَب على الإيجار كل حقبة. إذا وصل الرصيد إلى صفر، يُحذَف الحساب.
معلومات

أفضل ممارسة: موِّل حسابات البيانات دائمًا فوق الحد الأدنى للإعفاء من الإيجار لتجنّب حذف الحساب غير المتوقَّع.


ميزانية الحوسبة​

يُقاس كل تنفيذ تعليمة بوحدات حوسبة:

المعاملالقيمة
الحد الأقصى لوحدات الحوسبة لكل تعليمة1,400,000
الحد الأقصى لعمق CPI (الاستدعاء عبر البرامج)4
الحد الأقصى لحجم البرنامج10 MB
الحد الأقصى لحجم بيانات الحساب10 MB

البرامج التي تتجاوز ميزانية الحوسبة تُوقَف وتُلغى المعاملة.


ملخص المعاملات​

المعاملالقيمة
max_program_size10 MB
max_account_data_size10 MB
compute_budget_max1,400,000 CU
max_cpi_depth4
lamports_per_byte_year3,480
rent_exemption_multiplier2.0
منفذ JSON-RPC8899

التشغيل البيني بين الآلات الافتراضية (Cross-VM)​

يمكن لبرامج SVM التواصل مع عقود EVM وCosmWasm عبر مسار الرسائل غير المتزامن بين الآلات الافتراضية:

# Cross-VM call example
qorechaind tx crossvm call \
--source-vm svm \
--target-vm evm \
--target-contract 0x1234...abcd \
--payload '...' \
--from mykey \
-y

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


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