Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .gitbook/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -1754,6 +1754,27 @@
"group": "INJECTIVE",
"pages": [
"jp/index",
{
"group": "CosmWasm開発者",
"icon": "comet",
"expanded": false,
"pages": [
"jp/developers-cosmwasm/index",
{
"group": "CosmWasmスマートコントラクト",
"pages": [
"jp/developers-cosmwasm/smart-contracts/index",
"jp/developers-cosmwasm/smart-contracts/your-first-smart-contract",
"jp/developers-cosmwasm/smart-contracts/injective-name-service",
"jp/developers-cosmwasm/smart-contracts/neptune-service",
"jp/developers-cosmwasm/smart-contracts/cw20-convert-market-order"
]
},
"jp/developers-cosmwasm/local-development-guide",
"jp/developers-cosmwasm/mainnet-deployment-guide",
"jp/developers-cosmwasm/whitelisting-deployment-address-guide"
]
},
"jp/faq",
"jp/glossary",
"jp/references"
Expand Down
72 changes: 72 additions & 0 deletions .gitbook/jp/developers-cosmwasm/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
title: 概要
description: CosmWasmを使用したInjective上での開発に関するガイド
---

このセクションでは、Cosmosエコシステム向けのWebAssemblyベースのスマートコントラクトプラットフォームであるCosmWasmを使用してInjective上で開発を行う開発者向けの情報を提供します。
Rustコントラクトの作成、Injectiveのネイティブモジュールとの統合、ガバナンスを通じたメインネットへのデプロイまで、CosmWasm開発ライフサイクル全体にわたる包括的なガイドを参照できます。

InjectiveはWebAssemblyコントラクトと高性能な金融インフラストラクチャの間の橋渡しを行うことで、CosmWasm開発を向上させます。
コントラクトが単独で動作する標準的なCosmWasmチェーンとは異なり、Injectiveの`Any`メッセージシステムにより、Rustコントラクトとネイティブモジュール間の直接通信が可能になります。これにより、コントラクトからオンチェーンオーダーブックへの注文、Oracleの価格フィードのクエリ、TokenFactoryアセットの作成、オークションへの参加が実現します。
CW20 Adapterはさらに相互運用性を拡張し、CW20トークンをネイティブdenomに変換することでInjective Exchangeでシームレスに取引できるようにします。
`injective-test-tube`を使用することで、開発者はモックではなく実際のチェーンロジックに対してコントラクトの統合テストを行い、実際の環境での正確性を保証できます。Injectiveのサブ秒ブロックタイムとパーミッションレスなテストネットにより、CosmWasm開発者はInjectiveの金融プリミティブの全機能を活用した高度なDeFiアプリケーションを構築するための本番グレードの環境を利用できます。

## 主要コンセプト

| 用語 | 定義 |
|------|------|
| **CosmWasm** | Cosmos向けに構築されたWebAssemblyベースのスマートコントラクトプラットフォーム。Rustで安全でポータブルなコントラクトを決定論的に実行できます。 |
| **CW20 Adapter** | CW20トークンをネイティブTokenFactory denomに変換するブリッジコントラクト。CW20トークンがInjective Exchangeやその他のネイティブモジュールと連携できるようにします。 |
| **Any Messages** | CosmWasmコントラクトがInjective Exchange、Oracle、TokenFactoryなどのネイティブモジュールと連携するためのProtobufエンコードメッセージ(CosmWasm 2.0以降)。 |
| **injective-test-tube** | CosmWasmコントラクトを実際のモジュール動作(モックではなく)に対してテストするために、Injectiveチェーンロジックをインメモリで実行する統合テストライブラリ。 |
| **WASMx** | ガバナンスプロポーザルを通じたメインネットへのコードアップロードやパーミッション管理を含む、CosmWasmコントラクトデプロイメントを管理するInjectiveのモジュール。 |

## 開発を始める

<Columns cols={2}>
<Card
title="初めてのCosmWasmスマートコントラクト"
href="/developers-cosmwasm/smart-contracts/your-first-smart-contract"
arrow="true"
cta="こちらをクリック"
icon="panel-left-close"
img="">
Rustベースの初めてのCosmWasmコントラクトの作成、コンパイル、テスト、デプロイ、操作に関する初心者向けの完全ガイド。
</Card>
<Card
title="ローカル開発ガイド"
href="/developers-cosmwasm/local-development-guide/"
arrow="true"
cta="こちらをクリック"
icon="panel-left-close"
img="">
ローカルInjectiveノードのセットアップ、rust-optimizerを使用したCW20コントラクトのコンパイル、迅速な反復とテストのためのローカルネットワークへのデプロイ。
</Card>
<Card
title="メインネットデプロイガイド"
href="/developers-cosmwasm/mainnet-deployment-guide/"
arrow="true"
cta="こちらをクリック"
icon="panel-left-close"
img="">
プロポーザルの提出、インスタンス化パーミッション、コントラクトマイグレーションを含むInjective Mainnetへのコントラクトアップロードのガバナンスプロセス。
</Card>
<Card
title="Injectiveモジュールの使用"
href="/developers-cosmwasm/cosmwasm-any/"
arrow="true"
cta="こちらをクリック"
icon="panel-left-close"
img="">
CosmWasmコントラクトからInjectiveのネイティブモジュール(Exchange、Oracle、TokenFactory)と連携するためのAnyメッセージとクエリの使用方法。
</Card>
</Columns>

## その他のリソース

- **[CW20 Adapter](/developers-cosmwasm/cw20-adapter/)** —
CW20トークンをInjectiveのネイティブBankモジュールおよびExchangeにブリッジするAdapterコントラクトの技術ドキュメント。
- **[Injective Test Tube](/developers-cosmwasm/injective-test-tube/)** —
InjectiveチェーンロジックをインメモリでCosmWasmテストに対して実行する統合テストフレームワーク。
- **[スマートコントラクトの例](/developers-cosmwasm/smart-contracts/)** —
Injective Name Service、Neptune Service、CW20からマーケットオーダーへのワークフローを含むリファレンス実装。
279 changes: 279 additions & 0 deletions .gitbook/jp/developers-cosmwasm/local-development-guide.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
---
title: ローカル開発
description: ローカルInjectiveネットワークでのCW20スマートコントラクトのデプロイガイド
---

このガイドでは、コンピュータ上で動作するローカルInjectiveネットワークに`cw20`スマートコントラクトをデプロイする方法を説明します。

CosmWasmの[仕様とコントラクトのコレクション](https://github.com/CosmWasm/cw-plus)から`cw20-base`コントラクトを使用します。`cw20-base`は`cw20`互換コントラクトの基本実装で、カスタムコントラクトにインポートして構築できます。cw20仕様とすべてのExtensionの完全な実装が含まれています。`cw20-base`はそのままデプロイするか、他のコントラクトからインポートして使用できます。

### 前提条件

以下の手順に従ってGo、Rust、その他のCosmWasm依存関係をインストールしてください:

1. [Go](https://docs.cosmwasm.com/docs/getting-started/installation#go)
2. [Rust](https://docs.cosmwasm.com/docs/getting-started/installation#rust)

開始前に、[`rustup`](https://rustup.rs/)と最新バージョンの`rustc`および`cargo`がインストールされていることを確認してください。現在、Rust v1.58.1以降でテストしています。

また、`wasm32-unknown-unknown`ターゲットと`cargo-generate` Rustクレートもインストールする必要があります。

以下のコマンドでバージョンを確認できます:

```bash
rustc --version
cargo --version
rustup target list --installed
# wasm32が上記に表示されない場合、以下を実行
rustup target add wasm32-unknown-unknown
# cargo-generateをインストールするには、以下を実行
cargo install cargo-generate
```

### injectived

`injectived`がローカルにインストールされていることを確認してください。[injectivedのインストール](/developers/injectived/install/)ガイドに従って`injectived`とその他の前提条件をローカルで実行できるようにしてください。

`injectived`をインストールしたら、[ローカルチェーンインスタンスを起動](/developers/injectived/install/#start-injectived)してください。

### CosmWasmコントラクトのコンパイル

このステップでは、すべてのCW本番テンプレートコントラクトを取得し、[CosmWasm Rust Optimizer](https://github.com/CosmWasm/rust-optimizer)のDockerイメージ(複数コントラクト用の`workspace-optimizer`)を使用してコンパイルします。最新バージョンは[こちら](https://hub.docker.com/r/cosmwasm/workspace-optimizer/tags)(x86)または[こちら](https://hub.docker.com/r/cosmwasm/workspace-optimizer-arm64/tags)(ARM)を確認してください。このプロセスには時間とCPUリソースが必要です。

```bash
git clone https://github.com/CosmWasm/cw-plus
cd cw-plus
```

ARM以外(非Apple Silicon)のデバイス:

```bash
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/workspace-optimizer:0.12.12
```

Apple Siliconデバイス(M1、M2など)の場合:

```bash
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/workspace-optimizer-arm64:0.12.12
```

Dockerスクリプトはリポジトリ内のすべてのCWコントラクトをビルドおよび最適化し、コンパイル済みコントラクトは`artifacts`ディレクトリに配置されます。これで`cw20_base.wasm`コントラクト(ARMデバイスでコンパイルした場合は`cw20_base-aarch64.wasm`)をデプロイできます。

### CosmWasmコントラクトのチェーンへのアップロード

```bash
# CosmWasm/cw-plusリポジトリ内で
yes 12345678 | injectived tx wasm store artifacts/cw20_base.wasm --from=genesis --chain-id="injective-1" --yes --gas-prices=500000000inj --gas=20000000
```

**出力:**

```
code: 0
codespace: ""
data: ""
events: []
gas_used: "0"
gas_wanted: "0"
height: "0"
info: ""
logs: []
raw_log: '[]'
timestamp: ""
tx: null
txhash: 4CFB63A47570C4CFBE8E669273B26BEF6EAFF922C07480CA42180C52219CE784
```

次に`txhash`でトランザクションをクエリして、コントラクトが正常にデプロイされたことを確認します。

```bash
injectived query tx 4CFB63A47570C4CFBE8E669273B26BEF6EAFF922C07480CA42180C52219CE784
```

**出力:**

```bash
code: 0
codespace: ""
data: 0A460A1E2F636F736D7761736D2E7761736D2E76312E4D736753746F7265436F64651224080112205F8201CF5E2D7E6C15DB11ADF03D62DDDDC92B8D4FAE98C4F3C1C37F378E15D9
...
```

出力を詳しく見ると、コントラクトの`code_id`が1であることがわかります。

コントラクトコードはアップロードしましたが、まだインスタンス化する必要があります。

### コントラクトのインスタンス化

コントラクトをインスタンス化する前に、CW-20コントラクトの`instantiate`関数シグネチャを確認しましょう。

```rust
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn instantiate(
mut deps: DepsMut,
_env: Env,
_info: MessageInfo,
msg: InstantiateMsg,
) -> Result<Response, ContractError> {
```

特に、トークン名、シンボル、デシマル、その他の詳細を含む`InstantiateMsg`パラメータに注目してください。

```rust
#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)]
pub struct InstantiateMsg {
pub name: String,
pub symbol: String,
pub decimals: u8,
pub initial_balances: Vec<Cw20Coin>,
pub mint: Option<MinterResponse>,
pub marketing: Option<InstantiateMarketingInfo>,
}
```

コントラクトのインスタンス化の最初のステップは、初期CW20トークン割り当てを受け取るアドレスを選択することです。この場合、キーがすでにセットアップされているgenesisアドレスを使用できますが、新しいアドレスとキーを生成しても構いません。

<Callout icon="warning" color="#07C1FF" iconType="regular">
選択したアドレスのプライベートキーを持っていることを確認してください。そうでないと、そのアドレスからのトークン転送をテストできません。また、選択したアドレスはチェーン上の有効なアドレス(過去に資金を受け取ったことがある)である必要があり、コントラクト実行時のガス支払い用の残高が必要です。
</Callout>

genesisアドレスを確認するには:

```bash
yes 12345678 | injectived keys show genesis
```

**出力:**

```bash
- name: genesis
type: local
address: inj10cfy5e6qt2zy55q2w2ux2vuq862zcyf4fmfpj3
pubkey: '{"@type":"/injective.crypto.v1beta1.ethsecp256k1.PubKey","key":"ArtVkg9feLXjD4p6XRtWxVpvJUDhrcqk/5XYLsQI4slb"}'
mnemonic: ""
```

`code_id` `1`とJSONエンコードされた初期化引数(選択したアドレス付き)およびlabelを指定してCLIコマンドを実行し、コントラクトをインスタンス化します:

```bash
CODE_ID=1
INIT='{"name":"Albcoin","symbol":"ALB","decimals":6,"initial_balances":[{"address":"inj10cfy5e6qt2zy55q2w2ux2vuq862zcyf4fmfpj3","amount":"69420"}],"mint":{"minter":"inj10cfy5e6qt2zy55q2w2ux2vuq862zcyf4fmfpj3"},"marketing":{}}'
yes 12345678 | injectived tx wasm instantiate $CODE_ID $INIT --label="Albcoin Token" --from=genesis --chain-id="injective-1" --yes --gas-prices=500000000inj --gas=20000000 --no-admin
```

インスタンス化されたコントラクトのアドレスは`http://localhost:10337/swagger/#/Query/ContractsByCode`で取得できます。

コントラクト情報のメタデータは`http://localhost:10337/swagger/#/Query/ContractInfo`またはCLIクエリで取得できます。

```bash
CONTRACT=$(injectived query wasm list-contract-by-code $CODE_ID --output json | jq -r '.contracts[-1]')
injectived query wasm contract $CONTRACT
```

**出力:**

```bash
injectived query wasm contract $CONTRACT
address: inj14hj2tavq8fpesdwxxcu44rty3hh90vhujaxlnz
contract_info:
admin: ""
code_id: "1"
created:
block_height: "95"
tx_index: "0"
creator: inj10rdsxdgr8l8s0gvu8rynhu22nnxkfytg58cwm8
extension: null
ibc_port_id: ""
label: Albcoin Token
```

### コントラクトのクエリ

コントラクトの全状態は以下でクエリできます:

```bash
injectived query wasm contract-state all $CONTRACT
```

**出力:**

```bash
models:
- key: 000762616C616E6365696E6A31306366793565367174327A793535713277327578327675713836327A63796634666D66706A33
value: IjY5NDIwIg==
- key: 636F6E74726163745F696E666F
value: eyJjb250cmFjdCI6ImNyYXRlcy5pbzpjdzIwLWJhc2UiLCJ2ZXJzaW9uIjoiMS4wLjEifQ==
- key: 6D61726B6574696E675F696E666F
value: eyJwcm9qZWN0IjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwibG9nbyI6bnVsbCwibWFya2V0aW5nIjpudWxsfQ==
- key: 746F6B656E5F696E666F
value: eyJuYW1lIjoiQWxiY29pbiIsInN5bWJvbCI6IkFMQiIsImRlY2ltYWxzIjo2LCJ0b3RhbF9zdXBwbHkiOiI2OTQyMCIsIm1pbnQiOnsibWludGVyIjoiaW5qMTBjZnk1ZTZxdDJ6eTU1cTJ3MnV4MnZ1cTg2MnpjeWY0Zm1mcGozIiwiY2FwIjpudWxsfX0=
pagination:
next_key: null
total: "0"
```

個々のユーザーのトークン残高は以下でクエリできます:

```bash
BALANCE_QUERY='{"balance": {"address": "inj10cfy5e6qt2zy55q2w2ux2vuq862zcyf4fmfpj3"}}'
injectived query wasm contract-state smart $CONTRACT "$BALANCE_QUERY" --output json
```

**出力:**

```bash
{"data":{"balance":"69420"}}
```

### トークンの転送

```bash
TRANSFER='{"transfer":{"recipient":"inj1dzqd00lfd4y4qy2pxa0dsdwzfnmsu27hgttswz","amount":"420"}}'
yes 12345678 | injectived tx wasm execute $CONTRACT "$TRANSFER" --from genesis --chain-id="injective-1" --yes --gas-prices=500000000inj --gas=20000000
```

残高転送が成功したことを確認します:

```bash
# 最初のアドレスの残高クエリ
BALANCE_QUERY='{"balance": {"address": "inj10cfy5e6qt2zy55q2w2ux2vuq862zcyf4fmfpj3"}}'
injectived query wasm contract-state smart $CONTRACT "$BALANCE_QUERY" --output json
```

**出力:**

```bash
{"data":{"balance":"69000"}}
```

受信者が資金を受け取ったことを確認します:

```bash
# 受信者アドレスの残高クエリ
BALANCE_QUERY='{"balance": {"address": "inj1dzqd00lfd4y4qy2pxa0dsdwzfnmsu27hgttswz"}}'
injectived query wasm contract-state smart $CONTRACT "$BALANCE_QUERY" --output json
```

**出力:**

```bash
{"data":{"balance":"420"}}
```

## テストネット開発

`local`と`testnet`の開発/デプロイの主な違いは以下の通りです:

* [Injective Testnet Faucet](https://testnet.faucet.injective.network)を使用してテストネット資金をアドレスに取得できます
* [Injective Testnet Explorer](https://testnet.explorer.injective.network/smart-contracts/code/)を使用してトランザクションをクエリし詳細を確認できます
* `injectived`使用時にnodeフラグでテストネットRPCを指定する必要があります:`--node=https://testnet.sentry.tm.injective.network:443`
* `chainId`として`injective-1`の代わりに`injective-888`を使用します:`--chain-id="injective-888"`
* [Injective Testnet Explorer](https://testnet.explorer.injective.network/smart-contracts/code/)を使用して、アップロードされたスマートコントラクトの`codeId`の確認やインスタンス化されたスマートコントラクトの検索ができます

`injectived`の使用方法と`testnet`に対するクエリ/トランザクション送信については、[injectivedの使用](/developers/injectived/use/)ガイドを参照してください。
Loading