はじめてのArchway

動作環境

OS は Ubuntu 20.04,nodenv でバージョン制御しています.

terminal
$ node -v
v14.15.0
$ npm -v
8.1.2
$ cargo version
cargo 1.55.0 (32da73ab1 2021-08-23)

インストール

Cargo

cargo はインストールされていましたが,cargo generate が利用できなかったため追加でインストールします.

terminal
$ cargo install cargo-generate --features vendored-openssl
$ cargo generate --version
cargo-generate 0.10.3

Rust 環境は以下の要領で簡単に導入できます.

Archwayd

Archway のローカルテストネットをインストールします.

ソースからインストールする方法は 2021.10.31 時点でまだ公開されていないため,Docker Hub から持ってきます.

terminal
$ docker pull drewstaylor/archwayd:latest

イメージが存在するか否かは docker images で確認できます.

コマンドが呼び出せるようにエイリアスを設定します.

.zshrc
alias archwayd="docker run drewstaylor/archwayd:latest archwayd"

Archway Developer CLI

terminal
$ npm i -g @archwayhq/cli

参考:Installation | Archway Network

DApp作成

テンプレートを使用して雛形を作っておきます.この手順を省くとネットワーク設定を行うことができません.

terminal
$ archway new
Creating new Archway dApp...

Configure environment (Y/N default: N)?: y

1. Testnet
2. Localhost
3. Mainnet

Select environment type (1-3 default: 1): 1

1. Constantine [stable]
2. Titus [nightly]

Select a testnet to use (1-2 default: 1): 1
Use Docker to run "archwayd" daemon (Y/N default: N)?: y
Use starter template? (Y/N default: N): y
1. Increment [https://github.com/drewstaylor/archway-template/blob/main/README.md]
Select starter template (1-1): 1
Name of project ("My Project") My Project

...

✨  Done! New project created path/to/my-project

セットアップ

ネットワーク設定

terminal
$ archway network
Printing network settings...


1. Testnet*
2. Localhost
3. Mainnet


Using:  Constantine Testnet
RPC:    https://rpc.constantine-1.archway.tech:443
Faucet: https://faucet.constantine-1.archway.tech


Migrate to another network? (Y/N default: N): 
Ok!

DAppディレクトリの config.json を参照することで設定されます.この設定ファイルがない状態で実行しようとしてもエラーが表示されて進みません.

Error locating dApp config at path path/to/config.json. Please run this command from the root folder of an Archway project.

アカウント作成

terminal
$ archway accounts -add mywallet
Error adding wallet mywallet to keychain Error: spawn archwayd ENOENT

上記エラーは child_process.spawn の第一引数のパスが適切に設定されていない場合に発生するようです.

パッケージでは第一引数に archwayd が指定されていますが,Docker イメージを利用している場合は上記エイリアス設定をしないと PC 上でパスが通りません.

また,ネットワーク設定より前にアカウント作成を行おうとしても,同様のエラーが発生します.

Faucet

Faucet するときにはアドレスの入力が求められます.

アドレスがわからない場合,ENTER キーを押すとリストが表示されて終了するので,もう一度同一のコマンドを実行してコピペすれば OK です.

terminal
$ archway faucet
Enter an address to receive Testnet funds (e.g. "archway1x35egm8883wzg2zwqkvcjp0j4g25p4hed4yjuv"; Or, hit <enter> to list accounts): archway1youraddress
Requesting faucet funds to account archway1youraddress...

{ transfers: [ { coin: '10000000uconst', status: 'ok' } ] }
Requested funds to archway1youraddress on network constantine-1 using faucet https://faucet.constantine-1.archway.tech 
Success! REQUEST SENT

実際に残高を確認してみます.

terminal
$ archwayd q bank balances archway1youraddress $ARCHWAY_NODE 
balances:
- amount: "10000000"
  denom: uconst
pagination: {}

権限の設定

デフォルトでは root 権限が必要になってしまうようなので,変更しておきます.

terminal
$ sudo chown <username>:<groupname> /var/tmp/.archwayd

この設定を行わなかった場合,デプロイ時に以下のようなエラーが発生します.

Cannot copy "my_project.wasm" to "/var/tmp/.archwayd"

(参考)環境変数の設定

Archway では @archwayhq/cliarchway コマンドで操作ができるようになっていますが,従来のように archwayd を用いることもできます.

その場合は毎回入力がめんどくさいので,一部環境変数にして呼び出すのがおすすめです.

.archway_env
export ARCHWAY_NODE=(--node https://rpc.constantine-1.archway.tech:443)

ターミナル起動後に読み込めば利用できます.

terminal
$ source ~/.archway_env

ただし,archway コマンドを利用した方が楽です.

コントラクトのデプロイ

--dryrun オプションをつけて deploy コマンドを叩くと,cargo wasm と同様のコンパイルが実行されます.

terminal
$ archway deploy --dryrun

オプションをつけないで叩くと,cosmwasm/rust-optimizer コンテナを利用した最適化済みコンパイルとネットワークへのデプロイが実行されます.

CosmWasm のコンパイルやデプロイ時に必ず使用する引数は config.json に書き込まれているものが適用されます.

テンプレートのコントラクトをデプロイ

--args でコントラクトのインスタンス生成時に必要なメッセージを指定できます.

terminal
$ archway deploy --args '{"count":0}'
Building optimized wasm binary...

...

Ok!

Uploading optimized executable to constantine-1...

Send tx from which wallet in your keychain? (e.g. "main" or crtl+c to quit): mywallet
Enter keyring passphrase:
gas estimate: 1020770

confirm transaction before signing and broadcasting [y/N]:y

...

Downloading build artifact from constantine-1 and saving as "download.wasm"...

Successfully updated config file: path/to/my-project/config.json

Downloading wasm code to download.wasm
Integrity check Ok!

Deploying an instance of my-project to constantine-1...

Send tx from which wallet in your keychain? (e.g. "main" or crtl+c to quit): mywallet
Label this deployment? (e.g. "my deployment label", default: my-project 0.0.1): 

Warning: Rewards address in developer config currently unset.

Enter an address to receive developer rewards (e.g. "archway1x35egm8883wzg2zwqkvcjp0j4g25p4hed4yjuv"): archway1youraddress
Enter keyring passphrase:
gas estimate: 169967

...

Successfully updated config file: path/to/my-project/config.json

デプロイが終了すると config.json の内容が更新されます.具体的には JSON の network.developer.deployments で状態が管理されるようです.

コントラクトをアップロードしたときの codeId やインスタンス作成時のコントラクトアドレスが記録されています.

NFTコントラクトのデプロイ

今回は,デプロイのテスト用にトークンのコントラクトを持ってきます.

Archway のテンプレートでは cosmwasm-std のバージョンに 0.16.2 が指定されているため,それに合わせたバージョンを使用します.

terminal
$ git clone https://github.com/CosmWasm/cw-nfts.git
$ cd ./cw-nfts
$ git checkout v0.9.2

従来の CosmWasm とデプロイ方法が異なるため,テンプレートを上書きしてデプロイしてみます.

既存の examples, schema, src ディレクトリを削除し,コピーします.

terminal
$ cd path/to/my-project
$ rm -rf ./<dir>
$ cp -r path/to/cw-mfts/contracts/cw721-base/<dir>

また,必要なパッケージの追加も必要です.

Cargo.toml
[dependencies]
cw0 = "0.9.1"
cw2 = "0.9.1"
cw721 = "0.9.2"

この状態でコンパイルして正常に終了することが確認できたため,constantine-1 テストネットにデプロイします.

terminal
$ archway deploy --args '{"name":"<token name>","symbol":"<token symbol>","minter":"<minter's address>"}'

コントラクトとのインタラクション

Execute

NFT を発行してみます.

terminal
$ archway tx --args '{"mint":{"token_id":"1","owner":"archway1youraddress","token_uri":"https://example.com/nft/1"}}'

Query

NFT を発行したため,トークンの数は1になっています.

terminal
$ archway query contract-state smart --args '{"num_tokens":{}}'
Attempting query...

{"data":{"count":1}}

Ok!

token_id で NFT の詳細を確認すると,入力した内容が反映されています.

terminal
$ archway query contract-state smart --args '{"nft_info":{"token_id":"1"}}'
Attempting query...

{"data":{"token_uri":"https://example.com/nft/1","extension":null}}

Ok!

まとめ

Archway CLI では deploy することで Docker コンテナのオプティマイザを利用したコンパイルと instantiate が実行されます.また,コントラクトの実行やクエリは tx, query コマンドで提供されます.

Cosmos の多くのプロダクトでは CLI が統合される流れにありますが,Archway では別途用意しています.引数は config.js で管理され,色々入力する手間が省けるようになりました.

参考