JSON-RPC — Compatible con Solana
QoreChain proporciona una interfaz JSON-RPC compatible con Solana a través de su entorno de ejecución SVM (Solana Virtual Machine), lo que permite que las herramientas y los SDK existentes de Solana interactúen con QoreChain de forma nativa.
A partir de la versión de cadena v3.1.89 (22 de agosto), tras un incidente, el lane de ejecución SVM está deshabilitado en toda la red para el envío de transacciones — cualquier transacción devuelve code 11, "SVM module is disabled". Esto se aplica en toda la red, no solo en los endpoints públicos de solo lectura. Los métodos de tipo lectura de la tabla siguiente (p. ej. getBalance, getAccountInfo) responden con normalidad en los endpoints públicos, pero no intentes una integración en vivo que envíe transacciones SVM hasta que el lane vuelva a abrirse — se trata de una deshabilitación en tiempo de compilación, no de un parámetro en tiempo de ejecución, por lo que no puede reactivarse mediante una votación de gobernanza; se espera que permanezca deshabilitado hasta que una auditoría externa lo apruebe.
Conexión
| Transporte | Dirección |
|---|---|
| HTTP (nodo propio) | http://127.0.0.1:8899 |
| HTTPS (público, mainnet, solo lectura) | https://svm.qore.host |
| HTTPS (público, testnet, solo lectura) | https://svm-testnet.qore.host |
El servidor JSON-RPC es iniciado por qorechaind start y está habilitado por defecto, escuchando en 127.0.0.1:8899. Se configura mediante una sección [svm-rpc] en app.toml (enable + address). Un nodo recién iniciado ya sirve esta interfaz — no se requiere ningún proceso adicional. Los endpoints públicos son de solo lectura (el envío de transacciones está deshabilitado en el borde).
A partir de la versión de cadena v3.1.82, la interfaz SVM sirve el saldo nativo de QOR de la cuenta — los mismos fondos unificados visibles en las interfaces Cosmos y EVM — denominado en lamports (9 decimales; 1 uqor = 1,000 lamports). Consulta QOR nativo en la interfaz SVM.
Métodos
| Método | Parámetros | Descripción |
|---|---|---|
getAccountInfo | pubkey (cadena base58) | Devuelve los datos de la cuenta, el propietario, los lamports y el indicador executable |
getBalance | pubkey (cadena base58) | Devuelve el saldo de QOR nativo en lamports para la clave pública dada |
getSignaturesForAddress | address (cadena base58) | Devuelve las firmas de transacciones que involucran la dirección (detección de depósitos) |
getSlot | ninguno | Devuelve el número de slot actual |
getMinimumBalanceForRentExemption | dataLength (entero) | Devuelve el saldo mínimo para la exención de renta según el tamaño de los datos |
getVersion | ninguno | Devuelve la versión del software del nodo |
getHealth | ninguno | Devuelve el estado de salud del nodo ("ok" si está sano) |
getBlockHeight | ninguno | Devuelve la altura de bloque actual |
getLatestBlockhash | ninguno | Devuelve un blockhash reciente y lastValidBlockHeight |
getRecentBlockhash | ninguno | Forma heredada de getLatestBlockhash |
getFeeForMessage | message (base64) | Devuelve la tarifa de un mensaje (lamports) |
getMultipleAccounts | pubkeys (array) | Devuelve varias cuentas en una sola llamada |
getProgramAccounts | programId (base58) | Devuelve las cuentas que pertenecen a un programa |
getTokenAccountsByOwner | owner, filtro | Devuelve las cuentas de token de un propietario |
getTokenAccountsByDelegate | delegate, filtro | Devuelve las cuentas de token de un delegado |
Los métodos fuera de esta lista, como getGenesisHash y getEpochInfo, devuelven -32601 method not found (comprobado contra https://svm.qore.host y https://svm-testnet.qore.host, 20 de octubre de 2026). Desde v3.2.2, las direcciones base58 en las consultas RPC y gRPC deben ser canónicas y de longitud acotada; una dirección mal formada se rechaza. getTransaction se acepta, pero actualmente responde con un sobre que no tiene el campo result, así que no cuentes con él. El slot que informa getSlot sigue la altura de bloque de la cadena.
Formato de respuesta
Todas las respuestas siguen la especificación JSON-RPC 2.0. Las respuestas que hacen referencia al estado en cadena incluyen un objeto context con el slot actual:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"context": {
"slot": 123456
},
"value": { ... }
}
}
Ejemplos
getAccountInfo
Solicitud:
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getAccountInfo",
"params": [
"4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T",
{ "encoding": "base64" }
],
"id": 1
}'
Respuesta:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"context": {
"slot": 123456
},
"value": {
"data": ["AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "base64"],
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0
}
}
}
getBalance
Solicitud:
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getBalance",
"params": ["4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T"],
"id": 2
}'
Respuesta:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"context": {
"slot": 123456
},
"value": 1000000000
}
}
getVersion
Solicitud:
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getVersion",
"params": [],
"id": 3
}'
Respuesta:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"solana-core": "1.18.0-qorechain",
"feature-set": 0
}
}
La cadena de versión 1.18.0-qorechain indica compatibilidad con la interfaz RPC de Solana 1.18.0 ejecutándose sobre el entorno de ejecución SVM de QoreChain.
Integración con @solana/web3.js
Las aplicaciones existentes de Solana pueden conectarse a QoreChain apuntando el objeto Connection al endpoint SVM local:
import { Connection, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
const connection = new Connection("http://127.0.0.1:8899", "confirmed");
// Check version
const version = await connection.getVersion();
console.log("Node version:", version["solana-core"]);
// Get balance
const pubkey = new PublicKey("4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T");
const balance = await connection.getBalance(pubkey);
console.log("Balance:", balance / LAMPORTS_PER_SOL);
// Get slot
const slot = await connection.getSlot();
console.log("Current slot:", slot);
// Get account info
const accountInfo = await connection.getAccountInfo(pubkey);
if (accountInfo) {
console.log("Owner:", accountInfo.owner.toBase58());
console.log("Executable:", accountInfo.executable);
console.log("Data length:", accountInfo.data.length);
}
Notas
- Formato de direcciones: las cuentas SVM usan claves públicas codificadas en base58 (formato estándar de Solana), no el prefijo Bech32
qor1utilizado por los módulos nativos del Cosmos SDK. - Puente entre VMs: para mover activos entre los entornos de ejecución EVM y SVM, usa el módulo Cross-VM (
x/crossvm). Consulta los Comandos de transacción para la sintaxis decrossvm call. El lane SVM está deshabilitado yMsgCrossVMCallestá desactivado en la mainnet, por lo que hoy es solo de referencia. - Despliegue de programas: despliega programas BPF mediante la CLI (
qorechaind tx svm deploy-program) o de forma programática a través del entorno de ejecución SVM. - Presupuesto de cómputo: el entorno de ejecución SVM aplica por defecto un presupuesto de cómputo de 1,400,000 unidades de cómputo por transacción. Esto es configurable mediante los parámetros del módulo.