Smart Contract Tutorial (3) — CosmWasm
Published in
2 min readMay 3, 2022
There are several ways to create a smart contract on cosmos
- Agoric Swingset : Javascript
- CosmWasm : Rust
- Ethermint : Solidity
In this tutorial, we will deploy contract on Local testnet by CosmWasm.
Run Local Testnet
Installation
$ git clone <https://github.com/CosmWasm/wasmd.git> && cd wasmd
$ git checkout v0.23.0
$ make install$ CHAIN_ID="my-chain"
$ TXFLAG="--chain-id $CHAIN_ID --gas-prices 0.025stake --gas auto --gas-adjustment 1.3"
Initialize
$ wasmd init my-node --chain-id $CHAIN_ID
$ wasmd keys add main
$ wasmd keys add validator
$ wasmd add-genesis-account $(wasmd keys show main -a) 10000000000stake
$ wasmd add-genesis-account $(wasmd keys show validator -a) 10000000000stake
$ wasmd gentx validator 1000000000stake --chain-id $CHAIN_ID
$ wasmd collect-gentxs
$ wasmd validate-genesis
$ wasmd start
Deploy Contract
Get contract example & build
$ git clone <https://github.com/CosmWasm/cw-examples>
$ cd cw-examples
$ cd contracts/nameservice
$ RUSTFLAGS='-C link-arg=-s' cargo wasm# Optimize to reduce gas
$ 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.12.4
Upload contract
$ wasmd tx wasm store artifacts/cw_nameservice.wasm --from main $TXFLAG -y -b block
Check contract on chain
$ wasmd query wasm list-code
code_infos:
- code_id: "1"
creator: wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn
data_hash: DF3C9BC1341322810523AABCA28CC3FCDCA021C85061743967CE3D20F5580093
pagination: {}# download wasm and diff with origin
$ CODE_ID=$(wasmd query wasm list-code --output json | jq -r '.code_infos[0].code_id')
$ wasmd query wasm code $CODE_ID download.wasm
$ diff artifacts/cw_nameservice.wasm download.wasm
Instantiate contract
$ INIT='{"purchase_price":{"amount":"100","denom":"stake"},"transfer_price":{"amount":"999","denom":"stake"}}'
$ wasmd tx wasm instantiate 1 "$INIT" --from main --chain-id my-chain --label "awesome name service" --no-admin$ CONTRACT=$(wasmd query wasm list-contract-by-code $CODE_ID --output json | jq -r '.contracts[-1]')# check contract state
$ wasmd query wasm contract $CONTRACT
address: wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d
contract_info:
code_id: "1"
creator: wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn
label: awesome name service
Interacting with the contract
# purchase name
$ wasmd tx wasm execute $CONTRACT '{"register":{"name":"myName"}}' --amount 100stake --from main $TXFLAG -y# query registered name
$ NAME_QUERY='{"resolve_record": {"name": "myName"}}'
$ wasmd query wasm contract-state smart $CONTRACT "$NAME_QUERY" --output json
{"data":{"address":"wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn"}}# Transfer name to another account
$ TRANSFER='{"transfer":{"name":"myName","to":"wasm197wa2y42zp3sy84d8y4tkvztpuq5etqpq7q30h"}}'
$ wasmd tx wasm execute $CONTRACT --amount 1000stake --from main $TXFLAG# you can find the owner address is changed
$ wasmd query wasm contract-state smart $CONTRACT "$NAME_QUERY" --output json
{"data":{"address":"wasm197wa2y42zp3sy84d8y4tkvztpuq5etqpq7q30h"}}
References
https://docs.cosmwasm.com/docs/1.0/
https://hub.cosmos.network/main/hub-tutorials/deploy-testnet.html
https://docs.rs/cosmwasm-std/latest/cosmwasm_std/