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.host、https://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 に接続できます。getVersion は 1.18.0-qorechain を報告し、getBalance / getAccountInfo はオンチェーンの実際のSVMアカウントを返します。
| プロパティ | 値 |
|---|---|
| デフォルトURL | http://127.0.0.1:8899 |
| 有効化 | はい、デフォルトで有効 |
| 起動元 | qorechaind start |
| 互換性 | Solana JSON-RPC(サブセット) |
getVersion | 1.18.0-qorechain |
サポートされているメソッド
| メソッド | 説明 |
|---|---|
getAccountInfo | アカウントデータとlamports残高の取得 |
getBalance | lamports単位のアカウント残高(ネイティブQOR)の取得 |
getSignaturesForAddress | アドレスのトランザクション履歴 |
getSlot | 現在のスロット番号 |
getMinimumBalanceForRentExemption | 指定データサイズに対する最小残高 |
getVersion | SVMランタイムのバージョン情報 |
getHealth | SVMエンドポイントのヘルスチェック |
プログラムのデプロイと操作
最新のSBF実行環境。 SVM実行エンジンはsolana-sbpf 0.21.1にモダナイズされているため、現行のSolanaツールチェーン(platform-tools v1.53 / agave 4.x)で新たにコンパイルしたSBFプログラムは、QoreChain上でデプロイと実行の両方が可能です — デプロイのみではなく、実行が完全にサポートされています。cargo build-sbf --arch v0 または --arch v3 のいずれでビルドしたプログラムもサポートされます。
-
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 programqorechaind tx svm deploy-program ./my_program.so \--from mykey \--gas auto \--gas-adjustment 1.3 \-yトランザクションのレスポンスには、base58形式のプログラムIDが含まれます。
-
命令(Instruction)の実行 — 命令データを指定してオンチェーンのBPFプログラムを呼び出します。
# Execute instructionqorechaind tx svm execute <program-id-base58> <data-hex> \--from mykey \--gas auto \-yパラメータ 形式 説明 program-id-base58Base58文字列 デプロイ済みプログラムのアドレス data-hex16進エンコードされたバイト列 シリアライズされた命令データ -
データアカウントの作成 — プログラムは多くの場合、状態を保存するためのアカウントを必要とします。サイズと所有者を指定して作成します。
# Create data accountqorechaind tx svm create-account <owner-base58> <space> <lamports> \--from mykey \--gas auto \-yパラメータ 説明 owner-base58このアカウントを所有するプログラム(base58) spaceデータフィールドのサイズ(バイト単位) lamports初期残高(レント免除の最小額を満たす必要があります) 指定サイズに対するレント免除の最小残高を照会します。
# RPC: getMinimumBalanceForRentExemptioncurl -X POST http://localhost:8899 \-H "Content-Type: application/json" \-d '{"jsonrpc": "2.0","id": 1,"method": "getMinimumBalanceForRentExemption","params": [1024]}' -
@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 healthconst health = await connection.getHealth();console.log("SVM health:", health);// Get slotconst slot = await connection.getSlot();console.log("Current slot:", slot);// Get account infoconst pubkey = new PublicKey("YourBase58ProgramId...");const accountInfo = await connection.getAccountInfo(pubkey);console.log("Account data:", accountInfo);// Get balanceconst balance = await connection.getBalance(pubkey);console.log("Balance (lamports):", balance);
アドレスマッピング
QoreChainは、ネイティブのBech32アドレス(qor1...)とSolanaスタイルのbase58アドレスの間で双方向アドレスマッピングを維持しています。
| 方向 | 例 |
|---|---|
| ネイティブ→SVM | qor1abc...xyz は決定論的なbase58アドレスにマッピングされます |
| SVM→ネイティブ | Base58のプログラムアドレスは対応する qor1... にマッピングされます |
このマッピングは決定論的であり、x/svm モジュールによって管理されます。両方の表現は同一の基礎アカウントを指します。
レントモデル
SVMモジュールは、状態の肥大化を防ぐためにレント(rent)ベースのストレージモデルを採用しています。
| パラメータ | 値 |
|---|---|
| 1バイトあたり年間のlamports | 3,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_size | 10 MB |
max_account_data_size | 10 MB |
compute_budget_max | 1,400,000 CU |
max_cpi_depth | 4 |
lamports_per_byte_year | 3,480 |
rent_exemption_multiplier | 2.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相互運用性を参照してください。
次のステップ
- クロスVM相互運用性 — SVM、EVM、CosmWasm間の通信
- EVM開発 — QoreChain上のSolidityスマートコントラクト
- CosmWasm開発 — RustベースのWebAssemblyコントラクト