Passa al contenuto principale

Eventi WebSocket

QoreChain fornisce lo streaming di eventi in tempo reale attraverso due interfacce WebSocket: il WebSocket compatibile con EVM e il WebSocket RPC del Consensus Engine di QoreChain.

nota

Il WebSocket RPC del consensus engine è disponibile pubblicamente sia sulla mainnet qorechain-vladi sia sulla testnet qorechain-diana. Il WebSocket EVM è disponibile pubblicamente solo sulla testnet: non esiste un WebSocket EVM pubblico sulla mainnet (wss://evm.qore.host e wss://evm-ws.qore.host non accettano connessioni WebSocket), quindi sulla mainnet eseguite un vostro nodo per usare eth_subscribe. Gli endpoint locali riportati di seguito presuppongono un nodo gestito da voi stessi.

InterfacciaMainnetTestnet
WebSocket RPCwss://rpc.qore.host/websocketwss://rpc-testnet.qore.host/websocket
WebSocket EVMnessuno (solo nodo proprio)wss://evm-ws-testnet.qore.host

WebSocket EVM​

Endpoint: ws://localhost:8546 sul vostro nodo; testnet pubblica: wss://evm-ws-testnet.qore.host. Non esiste un WebSocket EVM pubblico sulla mainnet.

Il WebSocket EVM supporta il metodo standard eth_subscribe per lo streaming di eventi in tempo reale, compatibile con gli strumenti dell'ecosistema Ethereum.

Tipi di sottoscrizione​

SottoscrizioneDescrizione
newHeadsEmette un header ogni volta che viene aggiunto un nuovo blocco
logsEmette i log corrispondenti a un filtro opzionale
newPendingTransactionsEmette gli hash delle transazioni in ingresso nel mempool

La sottoscrizione syncing non è implementata: eth_subscribe con "syncing" restituisce -32600 syncing subscription is not implemented. Interrogate invece eth_syncing via HTTP.

Sottoscrivere i nuovi blocchi​

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

Sottoscrivere i log con filtro​

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

Annullare la sottoscrizione​

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

WebSocket RPC di QoreChain​

Endpoint: ws://localhost:26657/websocket sul vostro nodo; pubblici: wss://rpc.qore.host/websocket (mainnet) e wss://rpc-testnet.qore.host/websocket (testnet).

Il WebSocket RPC utilizza il sistema di sottoscrizione eventi del Consensus Engine di QoreChain. I client si sottoscrivono con una stringa di query che filtra gli eventi per tipo e attributi.

Sottoscrivere tutti i nuovi blocchi​

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

Sottoscrivere tutte le transazioni​

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

Sottoscrivere eventi specifici di un modulo​

Filtrate per tipo di evento per ricevere solo gli eventi provenienti da un modulo specifico:

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

Annullare la sottoscrizione​

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

Riferimento agli eventi dei moduli​

Gli eventi vengono emessi come eventi standard del consensus engine. Sottoscrivetevi con una query tm.event='Tx' filtrata sul tipo di evento e sull'attributo (ad esempio tm.event='Tx' AND bridge_deposit.chain EXISTS). Gli eventi a livello di blocco (quelli emessi dalla logica di fine blocco, come gli eventi PRISM qui sotto) vengono consegnati con tm.event='NewBlock', non con Tx. I nomi e gli attributi riportati di seguito sono quelli della versione della chain v3.2.0.

Quali eventi vedrete davvero

Molti di questi moduli sono inattivi sulle reti pubbliche: il bridge non è attivo, non è ancora registrato alcun layer multilayer né alcun rollup, e xQORE non è utilizzabile. I loro eventi sono definiti ma non vengono emessi finché non c'è attività. Gli eventi di osservazione e di ricompensa PRISM (rl_observation_collected, rl_reward_computed) vengono emessi circa ogni 10 blocchi su entrambe le reti.

Modulo PQC​

Tipo di eventoAttributi chiaveDescrizione
pqc_verifyaddress, key_type, algorithm_id, hybrid_mode, statusEmesso a ogni verifica di firma PQC
pqc_hybrid_verifyaddress, algorithm_id, statusEmesso a ogni verifica di firma ibrida
pqc_hybrid_classical_onlyaddress, hybrid_modeEmesso quando una firma solo classica viene accettata dalla modalità corrente
pqc_key_registeredaddress, key_type, algorithm_idEmesso quando una chiave PQC viene registrata
pqc_key_rotatedaddress, algorithm_idEmesso quando una chiave PQC viene ruotata
pqc_key_migratedaddress, from_algorithm, to_algorithmEmesso quando una chiave viene migrata a un nuovo algoritmo
pqc_evm_window_openedaddress, expiry_height, max_txs, max_valueEmesso quando si apre una finestra di autorizzazione della corsia EVM
pqc_evm_window_closedaddressEmesso quando si chiude una finestra di autorizzazione della corsia EVM

Le chiavi PQC vengono registrate esplicitamente con una transazione di registrazione; non esiste alcun evento di registrazione automatica.

Modulo Bridge​

Tipo di eventoAttributi chiaveDescrizione
bridge_depositoperation_id, chain, asset, amount, senderEmesso quando viene registrato un deposito in ingresso
bridge_withdrawoperation_id, chain, asset, amount, sender, receiverEmesso quando viene registrato un prelievo
bridge_attestationoperation_id, validator, chain, pqc_verified, attestationsEmesso per ogni attestazione di un validatore
bridge_operation_executedoperation_id, statusEmesso quando un'operazione si completa
bridge_circuit_breaker_tripchain, status, reasonEmesso quando scatta il circuit breaker del bridge di una chain

Modulo Cross-VM​

Tipo di eventoAttributi chiaveDescrizione
crossvm_requestmessage_id, source_vm, target_vm, target_contract, senderEmesso quando viene avviata una chiamata cross-VM
crossvm_responsemessage_id, statusEmesso quando una chiamata cross-VM si completa
crossvm_timeoutmessage_idEmesso quando un messaggio cross-VM supera il timeout di coda

Modulo Multilayer​

Tipo di eventoAttributi chiaveDescrizione
state_anchoredlayer_id, layer_height, state_root, main_chain_height, pqc_verified, transaction_countEmesso quando un anchor di stato del layer viene accettato
anchor_challengedlayer_id, layer_height, challenger, challenge_reason, resolutionEmesso quando un anchor viene contestato
layer_status_updatedlayer_id, status, reasonEmesso quando un layer cambia stato
sidechain_registered, paychain_registeredlayer_id, layer_type, creator, statusEmesso quando un layer viene registrato
transaction_routedselected_layer, routing_reason, gas_savings, latency_ms, senderEmesso quando una transazione viene instradata a un layer

Modulo RDK​

Tipo di eventoAttributi chiaveDescrizione
rollup_createdrollup_id, creator, profile, settlement_modeEmesso quando viene registrato un nuovo rollup
batch_submittedrollup_id, batch_index, tx_countEmesso quando viene inviato un batch di settlement
batch_finalizedrollup_id, batch_indexEmesso quando un batch supera la finestra di contestazione
da_blob_storedrollup_id, blob_index, backend, sizeEmesso quando un blob DA viene memorizzato
da_blob_prunedrollup_id, blob_indexEmesso quando un blob DA viene eliminato dopo il periodo di conservazione

Modulo Burn​

Tipo di eventoAttributi chiaveDescrizione
burnsource, amountEmesso quando i token vengono bruciati in modo permanente
milestone_burntx_threshold, burn_amount, cumulative_tx_countEmesso quando viene eseguito un burn per traguardo del numero di transazioni
burn_stranded_releasedamount, destination, remainingEmesso quando la governance rilascia una parte della quota bloccata degli staker

Modulo xQORE​

Questi eventi non vengono ancora emessi: xQORE non è attivo in nessuna build del nodo rilasciata (vedi Staking xQORE).

Tipo di eventoAttributi chiaveDescrizione
xqore_lockowner, amountEmesso quando QOR viene bloccato in xQORE
xqore_unlockowner, amount, penalty, burned, redistributed, returnedEmesso quando xQORE viene sbloccato e riconvertito in QOR

Modulo PRISM Consensus (RL Consensus)​

Questi sono eventi di fine blocco, consegnati sul flusso NewBlock.

Tipo di eventoAttributi chiaveDescrizione
rl_observation_collectedheightEmesso quando viene effettuata un'osservazione PRISM (circa ogni 10 blocchi)
rl_reward_computedheight, rewardEmesso quando viene calcolata la ricompensa PRISM
rl_action_appliedheight, agent_modeEmesso quando l'agente PRISM applica una regolazione di parametro
rl_agent_mode_changedheight, agent_modeEmesso quando cambia la modalità dell'agente
rl_circuit_breaker_triggeredheightEmesso quando il circuit breaker PRISM blocca un'azione
rl_circuit_breaker_recoveredheightEmesso quando il circuit breaker si ripristina

Modulo AI​

Tipo di eventoAttributi chiaveDescrizione
ai_anomaly_checkscore_millionths, action, is_anomalousEmesso per ogni transazione con punteggio di anomalia

Esempio di client JavaScript​

WebSocket EVM (ethers.js)​

import { ethers } from "ethers";

// Own node: ws://localhost:8546. Public testnet: wss://evm-ws-testnet.qore.host
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);
});

WebSocket RPC di QoreChain (nativo)​

// Own node: ws://localhost:26657/websocket. Public: wss://rpc.qore.host/websocket
const ws = new WebSocket("ws://localhost:26657/websocket");

ws.onopen = () => {
// Subscribe to bridge deposits
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "subscribe",
params: { query: "tm.event='Tx' AND bridge_deposit.chain 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);
}
};

Note​

  • Limiti di connessione: su un nodo gestito da voi stessi, il numero massimo predefinito di connessioni WebSocket è illimitato (max-open-connections = 0). Impostate un limite in app.toml per gli ambienti di produzione. Gli endpoint pubblici applicano limiti propri.
  • Buffer degli eventi: il WebSocket RPC memorizza in buffer un numero limitato di eventi per sottoscrizione (200 per impostazione predefinita su un nodo self-hosted). Se il client rimane indietro, gli eventi più vecchi vengono scartati.
  • Riconnessione: i client dovrebbero implementare la riconnessione automatica con backoff esponenziale, poiché le connessioni WebSocket possono essere interrotte durante i riavvii o gli aggiornamenti del nodo.