Cudos网络是一种特殊用途的区块链,旨在为所有人提供高性能,无信任,无权限的云计算。
在本教程中,我们将在 Cudos 公共测试网上部署一个 CosmWasm 智能合约。
先决条件
1) RPC 节点
首先,您必须 设置环境,在此期间,您将创建 二进制生成器 容器,我们将使用它与区块链进行交互。
为了将智能合约上传到区块链,您还需要访问RPC节点(=端口26657打开的完整节点)。 你可以使用这个,只要它向上 https://sentry1.gcp-uscentral1.cudos.org:26657
:.
如果您 无权访问外部托管的 RPC 节点(即上面的节点由于某种原因而关闭),则始终可以 设置并运行自己的 RPC节点。
2) 生锈
CosmWasm 智能合约是用 Rust编写的,因此我们需要安装 Rust 编译器。
# Install rustup. $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# Use the latest stable version. $ rustup default stable# Add the wasm32 target and make sure it was installed correctly. $ rustup target add wasm32-unknown-unknown $ rustup target list --installed
智能合约
下载现有的智能合约
为了简单起见,我们将使用CW20合约,该合约在链上部署了一个可替代的令牌(很像ERC20)。 如果您正在尝试部署自己的智能合约,则可以跳到 编译。
CW20智能合约可以从GitHub上的 CosmWasm/cw-plus 存储库下载。 对于 CUDOS,我们需要签出 v0.9.0。
$ git clone --depth 1 --branch v0.9.0 https://github.com/CosmWasm/cw-plus.git
汇编
在合约的根目录中,请运行以下命令。
# Go to root directory of CW20 contract. $ cd cw-plus# Optimize and compile the smart contract. $ 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/workspace-optimizer:0.12.4
完成编译后, .wasm
需要将可执行文件复制到 二进制生成器 容器中。
# Make sure the binary-builder is in the list of running containers. $ docker ps --format '{{.Name}}'# Copy the .wasm executable into the /usr/cudos directory of the binary-builder. $ docker cp artifacts/cw20_base.wasm binary-builder:/usr/cudos
部署
CW20智能合约需要一个 所有者 帐户,该帐户除其他外将能够铸造和烧毁代币。 如果您还没有帐户,请创建或恢复要用作合同所有者的现有帐户。
# Create a new owner account (if needed). $ cudos-noded keys add owner --keyring-backend file# To recover an account, add the --recover flag to the command above.
为了部署合同,所有者帐户需要一些CUDOS令牌来支付汽油费用,因此请从 水龙头中获取一些。
好了,我们已经准备好部署智能合约了。
$ docker exec -it binary-builder cudos-noded tx wasm store /usr/cudos/cw20_base.wasm --from owner --keyring-backend file --chain-id cudos-testnet-public --node https://sentry1.gcp-uscentral1.cudos.org:26657 --gas auto --gas-adjustment 1.3 -y | tee /dev/tty | tail -1 | tr -d '\r' | jq -r '.logs[0].events[-1].attributes[-1].value' | tee /dev/tty
输出应为您提供合约 ID。
实例
除非实例化已部署的智能合约,否则无法与之交互。 实例化本质上是将自定义值传递给合约的过程,例如令牌的名称,符号,小数点等,这在某种意义上”使合约栩栩如生”。
让我们首先设置自定义初始化参数。
$ INIT=$('{"name":"<TOKEN_NAME>","symbol":"<TOKEN_SYMBOL>","decimals":<DECIMALS>,"initial_balances":[<ACCOUNTS>],"mint":{"minter":"<MINTER_ADDR>","cap":"<TOKEN_CAP>">
- <TOKEN_NAME > 是您想给CW20令牌的名称,例如”超级库多斯”
- <TOKEN_SYMBOL > 是您的CW20代币的分母,例如”scudos”
- <DECIMALS > 是您的令牌应具有的小数位数,例如3(=最小值为0.001)
- <帐户> 是一个或多个 JSON 对象的数组,如
{"address": "<CUDOS_ADDR>","amount":<TOKEN_AMOUNT>}
哪里 <CUDOS_ADDR> 是cudos1...
给出的地址 <TOKEN_AMOUNT> 合约实例化上的代币,例如{"address": "cudos1d0new9u2f80rcmmlw0zftxeh0385c2gwpmdv8v","amount":1000}
- <TOKEN_CAP > 是明特可以铸造的最大代币数量,例如”1000000000000″
现在我们已经自定义了 CW20 合约,让我们对其进行实例化。
$ docker exec -it binary-builder cudos-noded tx wasm instantiate <CONTRACT_ID> $INIT --from owner --label "CW20" --keyring-backend file --chain-id cudos-testnet-public --node https://sentry1.gcp-uscentral1.cudos.org:26657 --gas auto --gas-adjustment 1.3 -y
- <CONTRACT_ID > 是我们通过部署它获得的合约ID
现在,检查合约状态以确保它实际上是实例化的。
$ docker exec -it binary-builder cudos-noded q wasm list-contract-by-code <CONTRACT_ID> --node https://sentry1.gcp-uscentral1.cudos.org:26657 --output json | jq -s
与合约交互
为了与合同进行交互,您需要合同的地址。
$ CONTRACT_ADDR=$(docker exec -it binary-builder cudos-noded q wasm list-contract-by-code <CONTRACT_ID> --node https://sentry1.gcp-uscentral1.cudos.org:26657 --output json | jq -r '.contracts[-1]' | tee /dev/tty | tail -1 | tr -d '\r')
每个合约都必须提供模式文件,这些文件告诉你如何与它进行交互,就像以太坊中的ABI一样。 您可以使用以下命令在存储库的根目录中自行生成它们。
$ cargo schema
让我们以 transfer
该方法为例。 该 架构 告诉我们,我们需要传入一个 "transfer"
对象,其中包含和 "amount"
一个 "recipient"
。
$ TRANSFER=$('{"transfer":{"amount":100,"recipient":"cudos1d0new9u2f80rcmmlw0zftxeh0385c2gwpmdv8v"}}')
要触发事务,请使用以下命令。 请注意,您必须为此支付gas,因为您正在更改分类帐的状态。
$ docker exec -it binary-builder cudos-noded tx wasm execute $CONTRACT_ADDR --from owner --keyring-backend file --chain-id cudos-testnet-public --node https://sentry1.gcp-uscentral1.cudos.org:26657 --gas auto --gas-adjustment 1.3 -y
查询的一个示例是检查 帐户的令牌余额。 这不会改变分类账的状态,因此不需要支付汽油费。
$ BALANCE=$('{"balance":{"address":"cudos1d0new9u2f80rcmmlw0zftxeh0385c2gwpmdv8v"}}')
将其传递到以下命令中,您将获得地址的余额。
$ docker exec -it binary-builder cudos-noded q wasm contract-state smart $CONTRACT_ADDR $BALANCE --node https://sentry1.gcp-uscentral1.cudos.org:26657