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

أحداث WebSocket

توفّر QoreChain بثّ الأحداث في الوقت الفعلي عبر واجهتي WebSocket: واجهة WebSocket المتوافقة مع EVM وواجهة RPC WebSocket لمحرّك إجماع QoreChain.

ملاحظة

تتوفّر كلتا واجهتي WebSocket على شبكة qorechain-vladi الرئيسية (تعمل على إصدار السلسلة v3.1.85) وشبكة qorechain-diana الاختبارية. تفترض نقاط النهاية المحلية أدناه عقدة تشغّلها بنفسك؛ استبدلها بمضيف الشبكة الرئيسية أو الاختبارية الخاص بمزوّدك للوصول عن بُعد.


EVM WebSocket

نقطة النهاية: ws://localhost:8546

تدعم واجهة EVM WebSocket طريقة eth_subscribe القياسية لبثّ الأحداث في الوقت الفعلي بشكل متوافق مع أدوات Ethereum.

أنواع الاشتراك

الاشتراكالوصف
newHeadsيُصدِر ترويسة في كل مرة تُضاف فيها كتلة جديدة
logsيُصدِر السجلّات المطابقة لمرشِّح اختياري
newPendingTransactionsيُصدِر تجزئات المعاملات الداخلة إلى الـ mempool
syncingيُصدِر تحديثات حالة المزامنة

الاشتراك في الكتل الجديدة

{
"jsonrpc": "2.0",
"method": "eth_subscribe",
"params": ["newHeads"],
"id": 1
}

الاشتراك في السجلّات مع مرشِّح

{
"jsonrpc": "2.0",
"method": "eth_subscribe",
"params": [
"logs",
{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}
],
"id": 2
}

إلغاء الاشتراك

{
"jsonrpc": "2.0",
"method": "eth_unsubscribe",
"params": ["0x1a2b3c..."],
"id": 3
}

QoreChain RPC WebSocket

نقطة النهاية: ws://localhost:26657/websocket

تستخدم واجهة RPC WebSocket نظام اشتراك الأحداث الخاص بمحرّك إجماع QoreChain. يشترك العملاء باستخدام سلسلة استعلام تُرشِّح الأحداث حسب النوع والسمات.

الاشتراك في جميع الكتل الجديدة

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='NewBlock'"
},
"id": 1
}

الاشتراك في جميع المعاملات

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='Tx'"
},
"id": 2
}

الاشتراك في الأحداث الخاصة بوحدة معيّنة

رشِّح حسب نوع الحدث لتلقّي الأحداث من وحدة محدّدة فقط:

{
"jsonrpc": "2.0",
"method": "subscribe",
"params": {
"query": "tm.event='Tx' AND fraud_alert.severity EXISTS"
},
"id": 3
}

إلغاء الاشتراك

{
"jsonrpc": "2.0",
"method": "unsubscribe",
"params": {
"query": "tm.event='NewBlock'"
},
"id": 4
}

مرجع أحداث الوحدات

وحدة PQC

نوع الحدثالسمات الرئيسيةالوصف
pqc_hybrid_verifyaddress، algorithm، result (pass/fail)، modeيُصدَر عند كل تحقّق من توقيع هجين
pqc_hybrid_auto_registeraddress، algorithm، pubkey_hashيُصدَر عند التسجيل التلقائي لمفتاح PQC

وحدة الذكاء الاصطناعي

نوع الحدثالسمات الرئيسيةالوصف
fraud_alertseverity (low/medium/high/critical)، address، reason، scoreيُصدَر عند اكتشاف احتيال في معاملة
circuit_breakermodule، action (tripped/reset)، threshold، valueيُصدَر عند تغيّر حالة قاطع دائرة الذكاء الاصطناعي

وحدة الجسر

نوع الحدثالسمات الرئيسيةالوصف
deposit_completedchain_id، sender، recipient، amount، asset، tx_hashيُصدَر عند تأكيد إيداع جسر وارد
withdrawal_completedchain_id، sender، recipient، amount، asset، tx_hashيُصدَر عند تأكيد سحب جسر صادر

وحدة Cross-VM

نوع الحدثالسمات الرئيسيةالوصف
crossvm_requestmessage_id، source_vm، target_vm، sender، payload_hashيُصدَر عند بدء استدعاء عبر الأجهزة الافتراضية
crossvm_responsemessage_id، source_vm، target_vm، success، gas_usedيُصدَر عند اكتمال استدعاء عبر الأجهزة الافتراضية
crossvm_timeoutmessage_id، source_vm، target_vm، queued_at_heightيُصدَر عند تجاوز رسالة عبر الأجهزة الافتراضية لمهلة قائمة الانتظار

وحدة Multilayer

نوع الحدثالسمات الرئيسيةالوصف
anchor_submittedlayer_id، layer_type، anchor_hash، height، submitterيُصدَر عند تقديم تثبيت حالة طبقة
layer_status_changedlayer_id، previous_status، new_status، reasonيُصدَر عند تغيّر الحالة التشغيلية لطبقة

وحدة RDK

نوع الحدثالسمات الرئيسيةالوصف
rollup_createdrollup_id، operator، settlement_type، profileيُصدَر عند تسجيل rollup جديد
batch_submittedrollup_id، batch_index، state_root، tx_countيُصدَر عند تقديم دفعة تسوية
batch_finalizedrollup_id، batch_index، finalized_at_heightيُصدَر عند اجتياز دفعة لنافذة التحدّي الخاصة بها
da_blob_storedrollup_id، blob_index، size_bytes، commitmentيُصدَر عند تخزين كتلة DA
da_blob_prunedrollup_id، blob_index، pruned_at_heightيُصدَر عند تقليم كتلة DA بعد فترة الاحتفاظ

وحدة الحرق

نوع الحدثالسمات الرئيسيةالوصف
fee_distributedtotal_fees، validator_amount، burn_amount، treasury_amount، staker_amountيُصدَر عند توزيع الرسوم المُحصَّلة
tokens_burnedamount، channel، block_heightيُصدَر عند حرق الرموز بشكل دائم

وحدة xQORE

نوع الحدثالسمات الرئيسيةالوصف
xqore_lockedaddress، amount، lock_duration، tierيُصدَر عند قفل QOR في xQORE
xqore_unlockedaddress، amount، penalty_applied، penalty_amountيُصدَر عند فتح قفل xQORE وإعادته إلى QOR
pvp_rebaseepoch، total_penalty، rebase_amount، beneficiary_countيُصدَر أثناء توزيع إعادة الأساس لـ PvP

وحدة التضخم

نوع الحدثالسمات الرئيسيةالوصف
epoch_mintedepoch، minted_amount، inflation_rate، block_heightيُصدَر في نهاية كل عصر تضخم

وحدة إجماع RL

تُصدَر تعديلات معاملات PRISM ونشاط قاطع الدائرة من خلال هذه الوحدة.

نوع الحدثالسمات الرئيسيةالوصف
rl_action_appliedaction_type، param_key، old_value، new_value، rewardيُصدَر عندما يطبّق وكيل PRISM تعديل معامل
circuit_breaker_triggeredreason، param_key، attempted_value، limitيُصدَر عندما يحظر قاطع دائرة PRISM إجراءً

مثال على عميل JavaScript

EVM WebSocket (ethers.js)

import { ethers } from "ethers";

const provider = new ethers.WebSocketProvider("ws://localhost:8546");

// Subscribe to new blocks
provider.on("block", (blockNumber) => {
console.log("New block:", blockNumber);
});

// Subscribe to contract events
const filter = {
address: "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28",
topics: [ethers.id("Transfer(address,address,uint256)")],
};
provider.on(filter, (log) => {
console.log("Transfer event:", log);
});

QoreChain RPC WebSocket (أصلي)

const ws = new WebSocket("ws://localhost:26657/websocket");

ws.onopen = () => {
// Subscribe to fraud alerts
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "subscribe",
params: { query: "tm.event='Tx' AND fraud_alert.severity EXISTS" },
id: 1,
}));

// Subscribe to rollup batch submissions
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "subscribe",
params: { query: "tm.event='Tx' AND batch_submitted.rollup_id EXISTS" },
id: 2,
}));
};

ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.result && data.result.events) {
console.log("Event received:", data.result.events);
}
};

ملاحظات

  • حدود الاتصال: العدد الأقصى الافتراضي لاتصالات WebSocket غير محدود (max-open-connections = 0). عيّن حدًّا في app.toml لعمليات النشر الإنتاجية.
  • مخزن الأحداث المؤقت: تخزّن واجهة RPC WebSocket مؤقتًا ما يصل إلى 200 حدث لكل اشتراك. إذا تأخّر العميل، تُسقَط الأحداث الأقدم.
  • إعادة الاتصال: ينبغي للعملاء تطبيق إعادة الاتصال التلقائي مع تراجع أُسّي، إذ قد تُقطَع اتصالات WebSocket أثناء إعادة تشغيل العقد أو ترقياتها.