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链上的代码

 

posted @ 2022-03-17 14:54  EnochLin  阅读(308)  评论(0编辑  收藏  举报