Terra - CW20 合约一致性对比和审计要点(一)
参考文档
Terra 是基于 cosmos sdk构造的区块链,语言的话最好是rust
构建一个 Terra 合约: https://docs.terra.money/docs/develop/dapp/smart-contracts/build-terra-dapp.html
Terra - CW 20 代币标准: https://docs.rs/crate/cw20/0.8.1
主要的标准
Write
1. 转账 Transfer{recipient, amount} 2. 转账到合约 Send{contract, amount, msg} 3. 销毁 Burn{amount} 4. 授权 IncreaseAllowance{spender, amount, expires} 5. 减少或清除授权 DecreaseAllowance{spender, amount, expires} 6. (授权)转账 TransferFrom{owner, recipient, amount} 7. (授权)转账到合约 SendFrom{owner, contract, amount, msg} 8. (授权)销毁 BurnFrom{owner, amount} 9. 铸币 Mint{recipient, amount} // 如果 env.sender 是 minter,则铸币 10. 更新logo UploadLogo{url | embedded} 11. 更新营销元数据 UpdateMarketing{project, description, marketing}
这里没有ERC20的条件竞争问题,还是很不错的
Read
1. 查询余额 Balance{address} 2. 查询合约代币信息 TokenInfo{} 3. 查询授权信息 Allowance{owner, spender} 4. 查询铸币信息 Minter{} // 返回可铸币人数和最大供应量,其中最大供应量为空 5. 查询营销元数据 MarketingInfo{} 6. 下载LOGO数据 DownloadLogo{} 7. 返回给定所有者的所有未过期配额的列表 AllAllowances{owner, start_after, limit} 8. 返回已在合约上创建的所有帐户的列表(仅是地址) AllAccounts{start_after, limit}
读的执行在浏览器就可以执行,访问https://finder.terra.money/mainnet/address/terra14z56l0fp2lsf86zy3hty2z47ezkhnthtr9yq76
点击Query,输入json,点击Next
{ "token_info": { } }
输出
{ "name": "Anchor Token", "symbol": "ANC", "decimals": 6, "total_supply": "1000000000000000" }
对比代码
curl "https://fcd.terra.dev/terra/wasm/v1beta1/codes/${CODE_ID}/byte_code" \ | jq ".byte_code" \ | tr -d \" \ | base64 -d \ | shasum -a 256 Or you can access the hash stored as metadata on chain like this: CODE_ID=610
或者这里直接有 code hash https://fcd.terra.dev/terra/wasm/v1beta1/codes/610
在编译完合约后(需要优化),在 artifacts目录下有 wasm文件和checksums文件,将此用于对比
合约编译
一般来说执行以下命令
docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="cosmwasm_plus_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/workspace-optimizer:0.10.2
但是0.10.2版本太老了,我换成了0.12.3
编译完成后到artiifacts目录下找到cehcksums.txt文件
da5560bab3a5e8a584b2b23ebd6bf7ac3b0a6a72e10620ad231d9ab94deba094 terraswap_factory.wasm 944cf139f66e9997589ade1400688c0505e332fbb09693fc14bb84647b22ea98 terraswap_pair.wasm 0edd75fb6ad10bffbfb1388d581412b8b66ccd8af7c222860b1fef0d8a7d70b1 terraswap_router.wasm f9b4ab2202a5110b653e7dfe3e413b336d14234ed447d882e1d9bd5512b44891 terraswap_token.wasm
这里有hash值,于是我们去和code_id的做对比,python执行
import requests import base64 import hashlib CODE_ID = 3 url = "https://fcd.terra.dev/terra/wasm/v1beta1/codes/" + str(CODE_ID) + "/byte_code" resp = requests.get(url) json_content = resp.json() d_code = base64.b64decode(json_content['byte_code']) hash_str = hashlib.sha256(d_code).hexdigest() print(hash_str)
运行gethash.py
-> python3 gethash.py
-> f9b4ab2202a5110b653e7dfe3e413b336d14234ed447d882e1d9bd5512b44891
发现返回的结果和我们允许的结果一致,因此可以证明我们审计的代码就是terra链上的代码