Passa al contenuto principale

Sviluppo SVM

QoreChain include un ambiente di esecuzione Solana Virtual Machine (SVM), che consente agli sviluppatori di distribuire ed eseguire programmi SBF/BPF utilizzando gli strumenti Solana con cui hanno già familiarità. Il modulo SVM espone un'interfaccia JSON-RPC compatibile con Solana sulla porta 8899, che qorechaind start avvia automaticamente (vedi JSON-RPC Server qui sotto).

nota

I comandi seguenti utilizzano la mainnet qorechain-vladi, attiva dal 7 giugno 2026 e in esecuzione sulla versione della chain v3.1.97. Sostituisci con --chain-id qorechain-diana per la testnet.


L'invio di transazioni SVM è attualmente disabilitato

A partire dalla versione della chain v3.1.89 (22 agosto), in seguito a un incidente, la lane di esecuzione SVM è disabilitata a livello di rete per l'invio di transazioni — qualsiasi transazione inviata a x/svm (distribuzione di programmi, esecuzione di istruzioni, creazione di account, trasferimenti) restituisce code 11, "SVM module is disabled". Questo vale sia per il tuo nodo personale sia per gli endpoint pubblici. I metodi RPC di sola lettura possono ancora rispondere, ma non costruire né provare un'integrazione SVM live finché la lane non viene riaperta — si tratta di una disabilitazione a livello di compilazione, non di un parametro a runtime, quindi non può essere riattivata con un voto di governance; si prevede che rimarrà disattivata finché un audit esterno non la autorizzi.

Panoramica​

Il modulo x/svm fornisce:

  • QOR nativo come asset SVM di prima classe — il saldo unificato dell'account, visibile in lamport
  • Distribuzione ed esecuzione di programmi SBF/BPF
  • Creazione e gestione di data account
  • Un endpoint JSON-RPC compatibile con Solana
  • Mappatura bidirezionale degli indirizzi tra i formati QoreChain e Solana
  • Misurazione del compute budget ed economia dello storage basata sulla rent

QOR nativo sull'interfaccia SVM​

A partire dalla versione della chain v3.1.82, l'interfaccia SVM è un'interfaccia nativa in QOR di prima classe, non un saldo separato in un sandbox. L'unico saldo unificato dell'account — gli stessi fondi visibili come uqor sull'interfaccia Cosmos e come wei a 18 decimali sull'EVM — appare sul lato SVM in lamport (9 decimali):

1 uqor = 1,000 lamports · 1 QOR = 1,000,000,000 lamports
  • getBalance / getAccountInfo restituiscono il QOR nativo dell'account (in lamport).
  • getSignaturesForAddress restituisce la cronologia delle transazioni che riguardano un indirizzo — utilizzabile per il rilevamento dei depositi con gli strumenti Solana standard.
  • I trasferimenti del System Program spostano QOR nativo — un'istruzione di trasferimento in stile Solana sposta gli stessi fondi che sposterebbe un MsgSend Cosmos o un trasferimento EVM.
  • Forma dell'indirizzo SVM — l'indirizzo SVM di un account sono i suoi 20 byte dell'account allineati a destra fino a 32 byte e codificati in base58. Tutte e tre le forme di indirizzo (qor1..., 0x..., base58) fanno riferimento allo stesso account.

Gli endpoint pubblici (https://svm.qore.host, https://svm-testnet.qore.host) sono di sola lettura — l'invio di transazioni è disabilitato a livello di edge. Normalmente dovresti eseguire il tuo nodo (porta 8899) per inviare transazioni SVM, ma vedi l'avviso sopra: la lane di transazione x/svm stessa è attualmente disabilitata a livello di rete, incluso sul tuo stesso nodo.


JSON-RPC Server​

Il server JSON-RPC compatibile con Solana viene avviato da qorechaind start ed è abilitato di default. Viene configurato tramite una sezione [svm-rpc] in app.toml:

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

I valori predefiniti sono enable = true e address = "127.0.0.1:8899", quindi un nodo appena avviato serve già l'interfaccia JSON-RPC Solana sulla porta 8899 — @solana/web3.js si connette a http://127.0.0.1:8899 senza configurazioni aggiuntive. getVersion riporta 1.18.0-qorechain, e getBalance / getAccountInfo restituiscono account SVM on-chain live.

ProprietàValore
URL predefinitohttp://127.0.0.1:8899
AbilitatoSì, di default
Avviato daqorechaind start
CompatibilitàSolana JSON-RPC (subset)
getVersion1.18.0-qorechain

Metodi supportati​

MetodoDescrizione
getAccountInfoRecupera i dati dell'account e il saldo in lamport
getBalanceOttiene il saldo dell'account in lamport (QOR nativo)
getSignaturesForAddressCronologia delle transazioni per un indirizzo
getSlotNumero dello slot corrente
getMinimumBalanceForRentExemptionSaldo minimo per una data dimensione dei dati
getVersionInformazioni sulla versione del runtime SVM
getHealthControllo dello stato dell'endpoint SVM

Distribuzione e interazione con i programmi​

informazioni

Esecuzione SBF moderna. Il motore di esecuzione SVM è stato modernizzato su solana-sbpf 0.21.1, quindi i programmi SBF compilati di recente con l'attuale toolchain Solana (platform-tools v1.53 / agave 4.x) vengono sia distribuiti che eseguiti su QoreChain — l'esecuzione è pienamente supportata, non solo la distribuzione. I programmi compilati con cargo build-sbf --arch v0 o --arch v3 sono entrambi supportati.

  1. Distribuire un programma SBF — Compila il tuo programma Solana in un shared object SBF con l'attuale platform-tools (v1.53 / agave 4.x), quindi distribuiscilo su 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

    La risposta della transazione include il program ID in formato base58.

  2. Eseguire un'istruzione — Chiama un programma BPF on-chain con dati di istruzione:

    # Execute instruction
    qorechaind tx svm execute <program-id-base58> <data-hex> \
    --from mykey \
    --gas auto \
    -y
    ParametroFormatoDescrizione
    program-id-base58Stringa base58L'indirizzo del programma distribuito
    data-hexByte codificati in hexDati dell'istruzione serializzati
  3. Creare un data account — I programmi spesso hanno bisogno di account per memorizzare lo stato. Creane uno con una dimensione e un owner specificati:

    # Create data account
    qorechaind tx svm create-account <owner-base58> <space> <lamports> \
    --from mykey \
    --gas auto \
    -y
    ParametroDescrizione
    owner-base58Il programma proprietario di questo account (base58)
    spaceDimensione del campo dati in byte
    lamportsSaldo iniziale (deve soddisfare il minimo di esenzione dalla rent)

    Interroga il saldo minimo esente da rent per una data dimensione:

    # RPC: getMinimumBalanceForRentExemption
    curl -X POST http://localhost:8899 \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getMinimumBalanceForRentExemption",
    "params": [1024]
    }'
  4. Utilizzo di @solana/web3.js — L'SDK JavaScript di Solana funziona direttamente con l'endpoint SVM di QoreChain:

    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);

Mappatura degli indirizzi​

QoreChain mantiene una mappatura bidirezionale degli indirizzi tra gli indirizzi Bech32 nativi (qor1...) e gli indirizzi base58 in stile Solana:

DirezioneEsempio
Da nativo a SVMqor1abc...xyz viene mappato su un indirizzo base58 deterministico
Da SVM a nativoGli indirizzi di programma base58 vengono mappati sugli equivalenti qor1...

La mappatura è deterministica ed è gestita dal modulo x/svm. Entrambe le rappresentazioni fanno riferimento allo stesso account sottostante.


Modello di rent​

Il modulo SVM utilizza un modello di storage basato sulla rent per prevenire il bloat dello stato:

ParametroValore
Lamport per byte all'anno3,480
Moltiplicatore di esenzione dalla rent2.0
Frequenza di riscossioneOgni epoch
  • Gli account con un saldo superiore a 2 * (data_size * 3480 / seconds_per_year) in lamport sono esenti dalla rent e non vengono mai addebitati.
  • Gli account al di sotto della soglia di esenzione dalla rent vengono addebitati a ogni epoch. Se il saldo raggiunge lo zero, l'account viene eliminato.
informazioni

Best practice: finanzia sempre i data account al di sopra del minimo di esenzione dalla rent per evitare l'eliminazione imprevista dell'account.


Compute Budget​

Ogni esecuzione di istruzione viene misurata con unità di calcolo:

ParametroValore
Massimo di unità di calcolo per istruzione1,400,000
Profondità massima di CPI (cross-program invocation)4
Dimensione massima del programma10 MB
Dimensione massima dei dati dell'account10 MB

I programmi che superano il compute budget vengono interrotti e la transazione viene annullata.


Riepilogo dei parametri​

ParametroValore
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
Porta JSON-RPC8899

Interoperabilità Cross-VM​

I programmi SVM possono comunicare con i contratti EVM e CosmWasm tramite il percorso di messaggistica cross-VM asincrono:

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

I messaggi vengono accodati ed elaborati dall'EndBlocker. Vedi Interoperabilità Cross-VM per i dettagli sul ciclo di vita dei messaggi e sul comportamento in caso di timeout.


Prossimi passi​