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

QoreChain Native開発

QoreChainはQoreChain Nativeスマートコントラクトをサポートしています。QoreChain Nativeは、QoreChainが自身のCosmWasmランタイムにつけた名称で、開発者は標準のCosmWasmライブラリ(cosmwasm-std)を使ってRustで安全かつサンドボックス化されたプログラムを記述し、WebAssemblyへコンパイルします。QoreChain Nativeコントラクトは、QoreChainのトリプルVMアーキテクチャの中でEVMおよびSVMプログラムと並行して実行されます。

注記

以下のコマンドは、2026年6月7日から稼働しているメインネット**qorechain-vladi(高さ3,742,566まではノードリリースv3.2.3**、そのブロックからはv3.2.4。ガバナンス提案13)を対象としています。テストネット(2026年10月19日からv3.2.4を実行)の場合は --chain-id qorechain-diana に置き換えてください。

コードのアップロードとインスタンス化には現在、明示的な権限が必要です

本稿執筆時点で、code_upload_access と instantiate_default_permission はメインネットとテストネットの両方で**Nobody**に設定されています。つまり、QoreChain Nativeが基盤とするランタイムであるCosmWasmに対する業界全体のセキュリティ勧告に従い、MsgStoreCode と MsgInstantiateContract はデフォルトでは任意のアカウントに開放されていません。以下の手順を成功させるには、事前にガバナンスによってアカウント(または特定のアドレスリスト)にアップロード/インスタンス化の権限を付与してもらう必要があります。これはまさにガバナンスによって変更され得る種類の設定であるため、まず現行のパラメータを確認してください(メインネットには現在、保存済みのコントラクトコードが一切ありません)。

qorechaind query wasm params
# or: curl -s https://api.qore.host/cosmwasm/wasm/v1/codes/params (substitute api-testnet.qore.host for testnet)

MsgStoreCode、MsgInstantiateContract、MsgInstantiateContract2 の各メッセージタイプも、両ネットワークでチェーンのサーキットブレーカーによって無効化されています(qorechaind query circuit disabled-list)。そのため、権限を引き上げるだけでは足りず、これらのエントリが解除されるまで実行できません。

この制限は、既にインスタンス化済みのコントラクトには影響しません — 既存のコントラクトに対する execute と query は、この設定にかかわらず通常どおり動作します。

tx pqc cosign で署名します

メインネットとテストネットでは、Cosmosレーンのすべてのトランザクションにハイブリッドのポスト量子署名が必要です。そのため、このページの tx コマンドは記載のままではブロードキャストされません。これらは --generate-only > tx.json でトランザクションを構築します。その後、qorechaind tx pqc cosign tx.json --from mykey --pqc-key mypqc --chain-id <chain-id> で署名してブロードキャストしてください(ダウンロードマニフェストのリリースバイナリには署名機能が含まれていますが、公開ソースからのビルドには含まれていません)。ネットワークの手数料下限はガス1単位あたり0.1 uqorで、これが --gas-prices 0.1uqor の意味です。ハイブリッド署名はシミュレーションに含まれない約47,000ガスを追加するため、1.5 の調整を行っています。ポスト量子署名を参照してください。


前提条件​

依存関係バージョン用途
Rust最新の安定版コントラクトのコンパイル
wasm32-unknown-unknownターゲットWebAssemblyコンパイルターゲット
cargo-generate最新版プロジェクトの雛形生成
cosmwasm-std1.5以上CosmWasm標準ライブラリ

Wasmターゲットをインストールします。

rustup target add wasm32-unknown-unknown

コントラクトのライフサイクル​

QoreChain Nativeコントラクトは、Build(ビルド)、Store(保存)、Instantiate(インスタンス化)、Execute(実行)、**Query(クエリ)**という5段階のライフサイクルに従います。

  1. Build — コントラクトを最適化されたWebAssemblyにコンパイルします。

    cd my-contract

    # Standard build
    cargo build --release --target wasm32-unknown-unknown

    # Optimized build (recommended for deployment)
    docker run --rm -v "$(pwd)":/code \
    cosmwasm/rust-optimizer:0.15.0

    最適化された .wasm ファイルは artifacts/ ディレクトリに出力されます。

  2. Store — コンパイル済みコントラクトをチェーンにアップロードします。

    qorechaind tx wasm store contract.wasm \
    --from mykey \
    --gas auto --gas-adjustment 1.5 --gas-prices 0.1uqor \
    --generate-only > tx.json

    トランザクションが確定したら(上記のとおり tx pqc cosign で tx.json に署名してブロードキャストします)、保存されたコードIDを照会します。

    qorechaind query wasm list-code
  3. Instantiate — 保存済みのコードIDから新しいコントラクトインスタンスを作成します。

    qorechaind tx wasm instantiate <code-id> \
    '{"count": 0, "owner": "qor1..."}' \
    --label "my-counter-contract" \
    --from mykey \
    --no-admin \
    --gas auto --gas-adjustment 1.5 --gas-prices 0.1uqor \
    --generate-only > tx.json
    フラグ説明
    <code-id>保存トランザクションから返される数値ID
    --labelこのインスタンスの人間が読めるラベル
    --no-admin管理者アドレスなし(コントラクトは不変になります)
    --admin <address>コントラクトを移行できる管理者を設定します

    コントラクトアドレスを取得します。

    qorechaind query wasm list-contract-by-code <code-id>
  4. Execute — コントラクトのexecuteエントリーポイントを呼び出し、状態を変更します。

    qorechaind tx wasm execute <contract-addr> \
    '{"increment": {}}' \
    --from mykey \
    --gas auto --gas-adjustment 1.5 --gas-prices 0.1uqor \
    --generate-only > tx.json

    資金を添付して実行します。

    qorechaind tx wasm execute <contract-addr> \
    '{"deposit": {}}' \
    --amount 1000000uqor \
    --from mykey \
    --gas auto --gas-adjustment 1.5 --gas-prices 0.1uqor \
    --generate-only > tx.json
  5. Query — トランザクションを送信せずにコントラクトの状態を読み取ります。

    qorechaind query wasm contract-state smart <contract-addr> \
    '{"get_count": {}}'

    クエリのレスポンスはJSONで返されます。


よく使うクエリ​

# List all stored code
qorechaind query wasm list-code

# List all instances of a specific code ID
qorechaind query wasm list-contract-by-code <code-id>

# Get contract info (code ID, admin, label)
qorechaind query wasm contract <contract-addr>

# Get raw contract state by key
qorechaind query wasm contract-state raw <contract-addr> <key-hex>

# Get full contract state (all keys)
qorechaind query wasm contract-state all <contract-addr>

# Get contract history (instantiate/migrate events)
qorechaind query wasm contract-history <contract-addr>

コントラクト構造​

典型的なQoreChain Nativeコントラクトには、3つのエントリーポイントがあります。

use cosmwasm_std::{
entry_point, Binary, Deps, DepsMut, Env, MessageInfo,
Response, StdResult,
};

#[entry_point]
pub fn instantiate(
deps: DepsMut,
_env: Env,
info: MessageInfo,
msg: InstantiateMsg,
) -> StdResult<Response> {
// Initialize contract state
Ok(Response::new().add_attribute("method", "instantiate"))
}

#[entry_point]
pub fn execute(
deps: DepsMut,
env: Env,
info: MessageInfo,
msg: ExecuteMsg,
) -> StdResult<Response> {
// Handle state-changing operations
Ok(Response::new().add_attribute("method", "execute"))
}

#[entry_point]
pub fn query(
deps: Deps,
_env: Env,
msg: QueryMsg,
) -> StdResult<Binary> {
// Handle read-only queries
Ok(Binary::default())
}

クロスVM呼び出し​

クロスVM呼び出しは、x/crossvm モジュールを通じて MsgCrossVMCall トランザクションとして送信されます。メッセージのライフサイクルについては、クロスVM相互運用性を参照してください。QoreChain NativeコントラクトにはクロスVM呼び出しを開始するためのコントラクト側のバインディングがありません(コントラクトが発行できるカスタムの QoreChainMsg メッセージは存在しません)。そのため、コントラクトは自身の execute エントリーポイントの内部からEVMまたはSVMのコントラクトを呼び出すことはできません。v3.2.3 以降、呼び出し元自身のレーンへの呼び出しは拒否され、失敗したキュー内の呼び出しは副作用を一切残しません。

クロスVM呼び出しは現在メインネットで無効化されています

MsgCrossVMCall はメインネットのサーキットブレーカーのリストに含まれており(qorechaind query circuit disabled-list)、SVMレーンも両ネットワークで無効化されています。そのため、現時点ではクロスVMのパスを通常のトランザクションで利用することはできません。


モジュール連携​

QoreChain Nativeコントラクトは、標準的なメッセージパッシングを通じてCosmos SDKモジュールと連携できます。

// Send native tokens via the bank module
let send_msg = BankMsg::Send {
to_address: "qor1recipient...".to_string(),
amount: vec![Coin {
denom: "uqor".to_string(),
amount: Uint128::new(1_000_000),
}],
};

// Delegate to a validator via the staking module
let delegate_msg = StakingMsg::Delegate {
validator: "qorvaloper1...".to_string(),
amount: Coin {
denom: "uqor".to_string(),
amount: Uint128::new(1_000_000),
},
};

コントラクトの移行​

コントラクトが --admin アドレス付きでインスタンス化されていた場合、管理者はそれを新しいコードIDに移行できます。

qorechaind tx wasm migrate <contract-addr> <new-code-id> \
'{"migrate_msg": {}}' \
--from admin-key \
--gas auto --gas-adjustment 1.5 --gas-prices 0.1uqor \
--generate-only > tx.json

これにより、既存のコントラクト状態を保持したまま、新しいコードの migrate エントリーポイントが呼び出されます。


次のステップ​

  • クロスVM相互運用性 — QoreChain NativeからEVMおよびSVMコントラクトを呼び出す
  • SVM開発 — QoreChain上にBPFプログラムをデプロイする
  • EVMプリコンパイル — 計画中のSolidityプリコンパイルのリファレンス(現時点で有効なものはありません)