メインコンテンツまでスキップ

SVM開発

QoreChainにはSolana Virtual Machine(SVM)実行環境が含まれており、開発者は使い慣れたSolanaツールを使用してSBF/BPFプログラムをデプロイ・実行できます。SVMモジュールは、Solana互換のJSON-RPCインターフェースをポート8899で公開しており、qorechaind start が自動的に起動します(下記のJSON-RPCサーバーを参照)。

注記

以下のコマンドは、2026年6月7日から稼働しているチェーンバージョンv3.1.85の**qorechain-vladi**メインネットを使用しています。テストネットの場合は --chain-id qorechain-diana に置き換えてください。


概要

x/svm モジュールは以下を提供します。

  • ファーストクラスのSVM資産としてのネイティブQOR — アカウントの統一残高がlamports単位で表示されます
  • SBF/BPFプログラムのデプロイと実行
  • データアカウントの作成と管理
  • Solana互換のJSON-RPCエンドポイント
  • QoreChainとSolanaのアドレス形式間の双方向アドレスマッピング
  • コンピュートバジェットの計測とレント(rent)ベースのストレージエコノミクス

SVMインターフェース上のネイティブQOR

チェーンバージョンv3.1.82以降、SVMインターフェースは独立したサンドボックス残高ではなく、ファーストクラスのネイティブQORインターフェースとなっています。アカウントの単一の統一残高 — Cosmosインターフェースでは uqor、EVMでは18桁小数のweiとして表示されるのと同じ資金 — が、SVM側ではlamports(9桁小数)で表示されます。

1 uqor = 1,000 lamports · 1 QOR = 1,000,000,000 lamports
  • getBalance / getAccountInfo は、アカウントのネイティブQOR(lamports単位)を返します。
  • getSignaturesForAddress は、アドレスに関係するトランザクション履歴を返します — 標準的なSolanaツールによる入金検知に利用できます。
  • System ProgramのトランスファーはネイティブQORを移動します — Solanaスタイルのトランスファー命令は、Cosmosの MsgSend やEVMトランスファーと同じ資金を移動します。
  • SVMアドレス形式 — アカウントのSVMアドレスは、20バイトのアカウントバイト列を右側に32バイトまでパディングし、base58エンコードしたものです。3つのアドレス形式(qor1...0x...、base58)はすべて同一のアカウントを指します。

パブリックエンドポイント(https://svm.qore.hosthttps://svm-testnet.qore.host)は読み取り専用です — エッジでトランザクション送信が無効化されています。SVMトランザクションを送信するには、自身のノード(ポート8899)を運用してください。


JSON-RPCサーバー

Solana互換のJSON-RPCサーバーは**qorechaind start によって起動**され、デフォルトで有効です。app.toml[svm-rpc] セクションで設定します。

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

デフォルトは enable = true および address = "127.0.0.1:8899" であり、起動したばかりのノードはすでにポート8899でSolana JSON-RPCインターフェースを提供しています — @solana/web3.js は追加設定なしで http://127.0.0.1:8899 に接続できます。getVersion1.18.0-qorechain を報告し、getBalance / getAccountInfo はオンチェーンの実際のSVMアカウントを返します。

プロパティ
デフォルトURLhttp://127.0.0.1:8899
有効化はい、デフォルトで有効
起動元qorechaind start
互換性Solana JSON-RPC(サブセット)
getVersion1.18.0-qorechain

サポートされているメソッド

メソッド説明
getAccountInfoアカウントデータとlamports残高の取得
getBalancelamports単位のアカウント残高(ネイティブQOR)の取得
getSignaturesForAddressアドレスのトランザクション履歴
getSlot現在のスロット番号
getMinimumBalanceForRentExemption指定データサイズに対する最小残高
getVersionSVMランタイムのバージョン情報
getHealthSVMエンドポイントのヘルスチェック

プログラムのデプロイと操作

備考

最新のSBF実行環境。 SVM実行エンジンはsolana-sbpf 0.21.1にモダナイズされているため、現行のSolanaツールチェーン(platform-tools v1.53 / agave 4.x)で新たにコンパイルしたSBFプログラムは、QoreChain上でデプロイと実行の両方が可能です — デプロイのみではなく、実行が完全にサポートされています。cargo build-sbf --arch v0 または --arch v3 のいずれでビルドしたプログラムもサポートされます。

  1. SBFプログラムのデプロイ — 現行のplatform-tools(v1.53 / agave 4.x)でSolanaプログラムをSBF共有オブジェクトにコンパイルし、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

    トランザクションのレスポンスには、base58形式のプログラムIDが含まれます。

  2. 命令(Instruction)の実行 — 命令データを指定してオンチェーンのBPFプログラムを呼び出します。

    # Execute instruction
    qorechaind tx svm execute <program-id-base58> <data-hex> \
    --from mykey \
    --gas auto \
    -y
    パラメータ形式説明
    program-id-base58Base58文字列デプロイ済みプログラムのアドレス
    data-hex16進エンコードされたバイト列シリアライズされた命令データ
  3. データアカウントの作成 — プログラムは多くの場合、状態を保存するためのアカウントを必要とします。サイズと所有者を指定して作成します。

    # Create data account
    qorechaind tx svm create-account <owner-base58> <space> <lamports> \
    --from mykey \
    --gas auto \
    -y
    パラメータ説明
    owner-base58このアカウントを所有するプログラム(base58)
    spaceデータフィールドのサイズ(バイト単位)
    lamports初期残高(レント免除の最小額を満たす必要があります)

    指定サイズに対するレント免除の最小残高を照会します。

    # RPC: getMinimumBalanceForRentExemption
    curl -X POST http://localhost:8899 \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getMinimumBalanceForRentExemption",
    "params": [1024]
    }'
  4. @solana/web3.jsの使用 — Solana JavaScript SDKは、QoreChainのSVMエンドポイントと直接動作します。

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

アドレスマッピング

QoreChainは、ネイティブのBech32アドレス(qor1...)とSolanaスタイルのbase58アドレスの間で双方向アドレスマッピングを維持しています。

方向
ネイティブ→SVMqor1abc...xyz は決定論的なbase58アドレスにマッピングされます
SVM→ネイティブBase58のプログラムアドレスは対応する qor1... にマッピングされます

このマッピングは決定論的であり、x/svm モジュールによって管理されます。両方の表現は同一の基礎アカウントを指します。


レントモデル

SVMモジュールは、状態の肥大化を防ぐためにレント(rent)ベースのストレージモデルを採用しています。

パラメータ
1バイトあたり年間のlamports3,480
レント免除乗数2.0
徴収頻度各エポック
  • 残高が 2 * (data_size * 3480 / seconds_per_year) lamportsを上回るアカウントは**レント免除(rent-exempt)**となり、課金されることはありません。
  • レント免除しきい値を下回るアカウントは、各エポックでレントが課金されます。残高がゼロになると、そのアカウントは削除(パージ)されます。
備考

ベストプラクティス: 予期しないアカウント削除を避けるため、データアカウントには常にレント免除の最小額を上回る資金を入金してください。


コンピュートバジェット

各命令の実行はコンピュートユニット(compute units)で計測されます。

パラメータ
命令あたりの最大コンピュートユニット1,400,000
最大CPI(クロスプログラム呼び出し)深度4
最大プログラムサイズ10 MB
最大アカウントデータサイズ10 MB

コンピュートバジェットを超過したプログラムは停止され、トランザクションはリバートされます。


パラメータ一覧

パラメータ
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
JSON-RPCポート8899

クロスVM相互運用性

SVMプログラムは、非同期のクロスVMメッセージパスを通じて、EVMおよびCosmWasmコントラクトと通信できます。

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

メッセージはキューに入れられ、EndBlockerによって処理されます。メッセージのライフサイクルとタイムアウト動作の詳細については、クロスVM相互運用性を参照してください。


次のステップ