JSON-RPC — Compatible Solana
QoreChain fournit une interface JSON-RPC compatible avec Solana via son runtime SVM (Solana Virtual Machine), permettant aux outils et SDK Solana existants d'interagir nativement avec QoreChain.
Depuis la version de chaîne v3.1.89 (22 août), suite à un incident, la voie d'exécution SVM est désactivée pour l'ensemble du réseau pour la soumission de transactions — toute transaction renvoie code 11, "SVM module is disabled". Cela s'applique à l'ensemble du réseau, pas seulement aux points de terminaison publics en lecture seule. Les méthodes de type lecture du tableau ci-dessous (par ex. getBalance, getAccountInfo) répondent normalement sur les points de terminaison publics, mais ne tentez pas d'intégration réelle qui soumet des transactions SVM tant que la voie n'a pas rouvert — il s'agit d'une désactivation au moment de la compilation, et non d'un paramètre d'exécution, elle ne peut donc pas être réactivée par un vote de gouvernance ; elle devrait rester désactivée jusqu'à ce qu'un audit externe la valide.
Connexion
| Transport | Adresse |
|---|---|
| HTTP (nœud propre) | http://127.0.0.1:8899 |
| HTTPS (public, mainnet, lecture seule) | https://svm.qore.host |
| HTTPS (public, testnet, lecture seule) | https://svm-testnet.qore.host |
Le serveur JSON-RPC est démarré par qorechaind start et est activé par défaut, à l'écoute sur 127.0.0.1:8899. Il est configuré via une section [svm-rpc] dans app.toml (enable + address). Un nœud tout juste démarré sert déjà cette interface — aucun processus supplémentaire n'est requis. Les points de terminaison publics sont en lecture seule (la soumission de transactions est désactivée en périphérie).
Depuis la version de chaîne v3.1.82, l'interface SVM sert le solde QOR natif du compte — les mêmes fonds unifiés visibles sur les interfaces Cosmos et EVM — libellé en lamports (9 décimales ; 1 uqor = 1 000 lamports). Voir QOR natif sur l'interface SVM.
Méthodes
| Méthode | Paramètres | Description |
|---|---|---|
getAccountInfo | pubkey (chaîne base58) | Renvoie les données du compte, le propriétaire, les lamports et l'indicateur exécutable |
getBalance | pubkey (chaîne base58) | Renvoie le solde QOR natif en lamports pour la clé publique donnée |
getSignaturesForAddress | address (chaîne base58) | Renvoie les signatures de transaction impliquant l'adresse (détection de dépôt) |
getSlot | aucun | Renvoie le numéro de slot actuel |
getMinimumBalanceForRentExemption | dataLength (entier) | Renvoie le solde minimum pour l'exemption de loyer compte tenu de la taille des données |
getVersion | aucun | Renvoie la version du logiciel du nœud |
getHealth | aucun | Renvoie l'état de santé du nœud ("ok" si sain) |
getBlockHeight | aucun | Renvoie la hauteur de bloc actuelle |
getLatestBlockhash | aucun | Renvoie un blockhash récent et lastValidBlockHeight |
getRecentBlockhash | aucun | Forme héritée de getLatestBlockhash |
getFeeForMessage | message (base64) | Renvoie les frais d'un message (lamports) |
getMultipleAccounts | pubkeys (tableau) | Renvoie plusieurs comptes en un seul appel |
getProgramAccounts | programId (base58) | Renvoie les comptes détenus par un programme |
getTokenAccountsByOwner | owner, filtre | Renvoie les comptes de tokens d'un propriétaire |
getTokenAccountsByDelegate | delegate, filtre | Renvoie les comptes de tokens d'un délégué |
Les méthodes absentes de cette liste, telles que getGenesisHash et getEpochInfo, renvoient -32601 method not found (vérifié sur https://svm.qore.host et https://svm-testnet.qore.host, le 20 octobre 2026). Depuis la v3.2.2, les adresses base58 dans les requêtes RPC et gRPC doivent être canoniques et de longueur bornée ; une adresse mal formée est refusée. getTransaction est accepté mais répond actuellement par une enveloppe sans champ result ; ne vous y fiez donc pas. Le slot rapporté par getSlot suit la hauteur de bloc de la chaîne.
Format de réponse
Toutes les réponses suivent la spécification JSON-RPC 2.0. Les réponses faisant référence à l'état on-chain incluent un objet context avec le slot actuel :
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"context": {
"slot": 123456
},
"value": { ... }
}
}
Exemples
getAccountInfo
Requête :
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getAccountInfo",
"params": [
"4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T",
{ "encoding": "base64" }
],
"id": 1
}'
Réponse :
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"context": {
"slot": 123456
},
"value": {
"data": ["AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "base64"],
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0
}
}
}
getBalance
Requête :
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getBalance",
"params": ["4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T"],
"id": 2
}'
Réponse :
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"context": {
"slot": 123456
},
"value": 1000000000
}
}
getVersion
Requête :
curl -X POST http://localhost:8899 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "getVersion",
"params": [],
"id": 3
}'
Réponse :
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"solana-core": "1.18.0-qorechain",
"feature-set": 0
}
}
La chaîne de version 1.18.0-qorechain indique la compatibilité avec l'interface RPC Solana 1.18.0 exécutée sur le runtime SVM de QoreChain.
Intégration @solana/web3.js
Les applications Solana existantes peuvent se connecter à QoreChain en pointant l'objet Connection vers le point de terminaison 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);
}
Notes
- Format d'adresse : les comptes SVM utilisent des clés publiques encodées en base58 (format Solana standard), et non le préfixe Bech32
qor1utilisé par les modules natifs du SDK Cosmos. - Pont inter-VM : pour déplacer des actifs entre les runtimes EVM et SVM, utilisez le module Cross-VM (
x/crossvm). Voir Commandes de transaction pour la syntaxecrossvm call. La voie SVM est désactivée etMsgCrossVMCallest désactivé sur le mainnet ; il s'agit donc aujourd'hui d'une simple référence. - Déploiement de programmes : déployez des programmes BPF via la CLI (
qorechaind tx svm deploy-program) ou par programmation via le runtime SVM. - Budget de calcul : le runtime SVM applique par défaut un budget de calcul de 1,400,000 unités de calcul par transaction. Ceci est configurable via les paramètres du module.