---
# System prepended metadata

title: CosmWasmをStarportで作ったCosmosチェーンにのせる

---

# CosmWasmをStarportで作ったCosmosチェーンにのせる

https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108

https://docs.starport.network/extra/cosmwasm.html


## チェーンの初期化
starport scaffold chain github.com/example/contracts


## wasmモジュールを入れる

```
cd contracts
starport scaffold wasm
```

チェーンを立ち上げる

```
starport chain serve
```

ここで出てくるaliceとbobのmnemonicをメモしておく。

```
Cosmos SDK's version is: Stargate v0.40.0 (or later)

🛠️  Building proto...
📦 Installing dependencies...
🛠️  Building the blockchain...
💿 Initializing the app...
🙂 Created account "alice" with address "cosmos1arqrmevza6vvl898es5qegh9g2wf0a97apc3jy" with mnemonic: "luxury resist club rude digital remove pluck dust coast tent flavor easy reason dentist glide proof minute tomorrow typical enhance silk victory ski enhance"
🙂 Created account "bob" with address "cosmos1w90xm9kcghtj6jzn6tr8le78ml97np3j7qyn92" with mnemonic: "small drop obtain alcohol math siren nominee balcony face owner dune omit wine lens orient mistake smooth defense speed rigid flash census slogan wife"
Genesis transaction written to "/Users/kosamit/.contracts/config/gentx/gentx-b7419f23a8c8fb6e2fe8f02efa12c79bce3ca34e.json"
🌍 Tendermint node: http://0.0.0.0:26657
🌍 Blockchain API: http://0.0.0.0:1317
🌍 Token faucet: http://0.0.0.0:4500
```


これで

```
contractsd tx wasm
```
が使えるようになる。

```
Available Commands:
  clear-contract-admin Clears admin for a contract to prevent further migrations
  execute              Execute a command on a wasm contract
  instantiate          Instantiate a wasm contract
  migrate              Migrate a wasm contract to a new code version
  set-contract-admin   Set new admin for a contract
  store                Upload a wasm binary
```

## CosmWasmのデプロイ
CosmosでCosmWasmを動かすには以下の手順が必要となる。
1. CosmWasmでスマコン作成
2. ビルドしてwasmを生成
3. wasmをCosmos上にアップロード
4. Cosmos上のwasmをインスタンス化

今回は1をサンプルを使って省略する。

### ビルドしてwasmを生成
Rustをインストールする。(説明省略)

#### cargo-generateのインストール
```
cargo install cargo-generate --features vendored-openssl
```
cargo generateコマンドを使えるようになる
Rustのプロジェクトを簡単に始められるツール。

#### サンプルを使う
カウンターのサンプルをcloneする。
スマコン用のフォルダを別で作って管理した方がいいので、contractsのフォルダから抜けて、スマコン用のフォルダを作ってその中にクローンする。

```
cd ..
mkdir smartcontracts
cd smartcontracts
cargo generate --git https://github.com/CosmWasm/cosmwasm-template.git --branch 0.14 --name counter
```

#### ビルドする
```
cd counter
rustup target add wasm32-unknown-unknown
cargo wasm
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/rust-optimizer:0.11.4
```

これでcounter/artifactsにcounter.wasmができる。

### wasmをCosmos上にアップロード
counter.wasmをcontracts/artifactsに移動し、以下を実行しする。
(starport chain serveでチェーンは動かしておく。)

```
contractsd tx wasm store artifacts/counter.wasm --from alice --gas 1000000
```

これでチェーン上にアップできた。
以下でスマコンを確認できる。

```
contractsd q wasm list-code
```

### Cosmos上のwasmをインスタンス化
この段階ではまだスマコンを実行できない。
アップしたスマコンのインスタンスを作成する必要がある。
contractsd tx wasm instantiateでインスタンスを作成できる。

```
contractsd tx wasm instantiate 1 '{"count": 5}' --from alice --label mycounter --gas 1000000
```
instantiateの引数の1はcontractsd q wasm list-codeで確認できるcode_idである。


以下で作成されたインスタンスを確認できる。

```
contractsd q wasm list-contract-by-code 1
```

```結果
contracts:
- cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5
pagination:
  next_key: null
  total: "0"
```


## スマコンのステートの確認

以下で確認できる。

```
contractsd q wasm contract-state all cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5
```

valueはbase64でエンコードされている。

```結果
models:
- key: "7374617465"
  value: eyJjb3VudCI6NSwib3duZXIiOiJjb3Ntb3MxYXJxcm1ldnphNnZ2bDg5OGVzNXFlZ2g5ZzJ3ZjBhOTdhcGMzankifQ==
pagination:
  next_key: null
  total: "0"
```

デコードして内容を見ると、countが5であることが分かる。

```
$ echo eyJjb3VudCI6NSwib3duZXIiOiJjb3Ntb3MxYXJxcm1ldnphNnZ2bDg5OGVzNXFlZ2g5ZzJ3ZjBhOTdhcGMzankifQ== | base64 --decode
{"count":5,"owner":"cosmos1arqrmevza6vvl898es5qegh9g2wf0a97apc3jy"}
```


## スマコンの実行
contractsd tx wasm executeで実行できる。

```
contractsd tx wasm execute cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5 '{"increment": {}}' --from alice --gas 1000000
```


結果を確認する。

```
$ contractsd q wasm contract-state all cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5
models:
- key: "7374617465"
  value: eyJjb3VudCI6Niwib3duZXIiOiJjb3Ntb3MxYXJxcm1ldnphNnZ2bDg5OGVzNXFlZ2g5ZzJ3ZjBhOTdhcGMzankifQ==
pagination:
  next_key: null
  total: "0"
$ echo eyJjb3VudCI6Niwib3duZXIiOiJjb3Ntb3MxYXJxcm1ldnphNnZ2bDg5OGVzNXFlZ2g5ZzJ3ZjBhOTdhcGMzankifQ== | base64 --decode
{"count":6,"owner":"cosmos1arqrmevza6vvl898es5qegh9g2wf0a97apc3jy"}
```
