はじめてのArchway
動作環境
ホスト環境
- OS: Windows 10 Home
- CPU: Intel Core i7-7700 4C/8T
- RAM: 32GB
ゲスト環境
(VirtualBox)
- OS: Ubuntu 20.04
- CPU: 1コア
- RAM: 16GB
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/cli
の archway
コマンドで操作ができるようになっていますが,従来のように 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 で管理され,色々入力する手間が省けるようになりました.