XION:玩转您的第一个智能合约

XION是一个专为去中心化应用设计的区块链平台,支持使用CosmWasm开发智能合约。本文将基于官方文档,详细介绍如何在Windows的WSL2(WindowsSubsystemforLinux2)环境下,基于Ubuntu设置开发环境、配置XION链、部署与交互

XION 是一个专为去中心化应用设计的区块链平台,支持使用 CosmWasm 开发智能合约。本文将基于官方文档,详细介绍如何在 Windows 的 WSL2(Windows Subsystem for Linux 2)环境下,基于 Ubuntu 设置开发环境、配置 XION 链、编写并上传与实例化一个简单的 CosmWasm 智能合约并交互。

1.jpg

步骤 1:设置环境

1.1 安装 WSL2

WSL2 是 Windows 提供的 Linux 子系统,适合开发区块链应用。首先,确保你的 Windows 系统支持 WSL2(Windows 10 版本 2004 或更高,或 Windows 11)。按照以下步骤安装:

  1. 打开 PowerShell(以管理员身份运行)并输入:

    wsl --install
  2. 如果您已在使用 WSL1,则可以使用以下内容升级到 WSL2
    wsl --set-version Ubuntu 2
  3. 设置ubuntu用户名和密码
    单击 Windows 开始菜单按钮,然后在搜索字段中输入Ubuntu ubuntu.png 单击 Ubuntu 应用程序以打开发行版,在加载的终端中,系统将要求您为 Linux 发行版创建用户名和密码。此用户名和密码特定于您安装的 每个单独的 Linux 发行版,与您的 Windows 用户名无关。 set user pwd.png
  4. 更新和升级软件包 在 Ubuntu 终端中,使用以下命令更新 Ubuntu 发行版,以减少软件包无法正常工作的可能性:
      sudo apt update && sudo apt upgrade
  5. 安装Build Essentials 和开发工具
      sudo apt install -y build-essential pkg-config libssl-dev curl git jq unzip wget

1.2 安装 Rust

<!--StartFragment--> Rust 是在 XION 上开发智能合约的编程语言。Rust 以其性能、安全性和内存安全性而闻名,非常适合区块链开发。要构建、测试和部署智能合约,开发人员需要一个正确配置的 Rust 工具链。

  1. 安装所需依赖项:
     sudo apt update && sudo apt install -y curl build-essential
    1. 然后使用 rustup 安装 Rust:
      curl --proto '=https' --tlsv1.2 -sSf https\://sh.rustup.rs | sh
    2. 设置环境:
      source $HOME/.cargo/env
    3. 验证安装:
      rustc --version

      您应该会看到类似于以下内容的输出:

      rustc 1.82.0-nightly (c1a6199e9 2024-07-24)
    4. 检查Cargo是否已安装:
      cargo --version

      如果安装了 Cargo,您应该会看到类似于以下内容的输出:

      cargo 1.82.0-nightly (5f6b9a922 2024-07-19)

      如果缺少 Cargo,请按照以下步骤安装:

      sudo apt update && sudo apt install -y cargo
    5. 安装 cargo-generate:
      cargo install cargo-generate

      安装后,确认安装成功:

      cargo generate --version

      如果安装了 cargo-generate,您应该会看到类似于以下内容的输出:

      cargo generate-generate 0.17.3

      我在安装 cargo-generate 的时候,遇到了报错: install-cargo-generate-err.jpg 解决办法,使用 nightly 版本:

      rustup default nightly
      rustup update

      再次安装,安装成功:

cargo generate --version.jpg

1.3 安装 Go

某些区块链开发任务需要 Go,例如使用 XION 的工具和依赖项。请根据您的作系统执行以下安装步骤:

sudo apt update && sudo apt install -y golang

或者,从官方网站手动下载并安装 Go

  1. 验证安装:
    go version

    如果安装了 go,您应该会看到类似于以下内容的输出:

    go version go1.22.3 darwin/arm64
  2. 要确保 Go 模块正常工作,请设置 Go 环境:
    echo 'export GOPATH=$HOME/go' >> ~/.bashrc
    echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
    source ~/.bashrc

    我在安装Go的时候,遇到了报错:

install go-error-2.jpg 我的解决办法:

  1. 查看 sources.list.d 目录
       ls /etc/apt/sources.list.d/
  2. 根据报错信息,在目录下找到 naon.list 文件,这里需要根据你的报错信息去找对应的文件,打开这个文件,里面有一行:
       deb https://deb.dmz.ator.dev anon-live-jammy main
    1. 由于 https://deb.dmz.ator.dev anon-live-jammy 仓库返回 404 错误,说明它可能已不可用。你可以选择禁用或移除该仓库,禁用的话,直接在前面加一个# 注释掉,移除就可以直接删除 naon.list 文件,操作之后,再重新安装,问题解决:

install-success.jpg

1.4 安装 Docker

使用 Rust Optimizer 优化 Rust 智能合约需要 Docker,这可确保有效地编译合约以在 XION 上部署。它还可用于运行 .您可以在此处为您的操作系统安装 Docker。 docker 的话,请自行参考我给出的官方文档安装,不难,有问题可以联系我,嘻嘻

1.5 安装 xiond

xiond是运行 XION 区块链并与之交互的核心命令行工具。它充当区块链守护进程,使开发人员和节点运营商能够管理网络作、部署智能合约并与 XION 生态系统交互。

可以使用安装程序、下载预构建的二进制文件源代码构建或使用 docker 构建。确保您使用的发行版与您将与之交互的网络中使用的版本相对应的版本。 我这里使用ubuntu安装。

  1. 下载存储库密钥:
    wget -qO - https://packages.burnt.com/apt/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/burnt-keyring.gpg
    1. 将 burnt 仓库添加到你的 apt 源列表中,包括签名密钥:
      echo "deb [signed-by=/usr/share/keyrings/burnt-keyring.gpg] http://packages.burnt.com/apt /" | sudo tee /etc/apt/sources.list.d/burnt.list
    2. 更新源,并安装 xiond:
      sudo apt update
      sudo apt install xiond
  2. 验证安装:
    xiond version

install-xiond-success.jpg

步骤 2:优化并上传合约

前面我们设置好了环境,接下来我们来处理合约。

2.1 优化合约

  1. 将官方给的示例代码拉取下来
     git clone https://github.com/burnt-labs/cw-counter
     cd cw-counter
  2. 接下来,使用 CosmWasm Optimizing Compiler 编译和优化智能合约。您需要运行 Docker 才能执行以下命令:

    docker run --rm -v "$(pwd)":/code \
      --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \
      --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
      cosmwasm/optimizer:0.16.0

    run-cosmwasm.jpg

    1. 编译完成后,优化的合约将在以下位置:
      ./artifacts/cw_counter.wasm
  3. 用 vscode 打开代码查看:
    code .

code.jpg

2.2 设置账户

  1. 使用以下命令创建新的密钥对并将其添加到您的本地密钥存储中:

    xiond keys add &lt;keyname>

    keyname 是你自己取的名称,生成时,需要输入一个密码,可以看到,我们这里有了 wallet address : keys.jpg

  2. 输入密码,查看已经生成的密钥对信息:

      xiond keys show &lt;keyname>

    show-key.jpg

  3. 获取测试币, 打开 https://faucet.xion.burnt.com/ 输入 wallet address:

faucet-2.jpg

  1. 查看余额:
    xiond query bank balances &lt;your-wallet-address> --node  https://rpc.xion-testnet-2.burnt.com:443

    get-balances.jpg

    2.3 上传合约

  2. 首先,通过在终端中执行以下作来设置您的钱包地址或密钥名称:
    WALLET="your-wallet-address-or-key-name-here"
  3. 将优化后的合约上传到区块链:
    RES=$(xiond tx wasm store ./artifacts/cw_counter.wasm \
      --chain-id xion-testnet-2 \
      --gas-adjustment 1.3 \
      --gas-prices 0.001uxion \
      --gas auto \
      -y --output json \
      --node https://rpc.xion-testnet-2.burnt.com:443 \
      --from $WALLET)
    1. 提取交易hash:
      echo $RES

      记住这里的 txhash,一会有用 deploy-contract.jpg

步骤 3:实例化合约

<!--StartFragment-->

上传 WASM 字节码时,您将合约代码存储在区块链上,但尚未创建合约实例。上传的代码可用于创建多个合约实例,每个实例都有自己的状态。

<!--EndFragment-->

  1. 设置您在上面检索到的交易哈希
    TXHASH="your-txhash"
  2. 查询区块链获取Code ID
    CODE_ID=$(xiond query tx $TXHASH \
    --node https://rpc.xion-testnet-2.burnt.com:443 \
    --output json | jq -r '.events[-1].attributes[1].value')
  3. 检查获取到的Code ID
     echo $CODE_ID

    get code id.jpg

  4. 设置合约的初始化消息:
     MSG='{ "count": 1 }'
  5. 实例化合约:
     xiond tx wasm instantiate $CODE_ID "$MSG" \
     --from $WALLET \
    --label "cw-counter" \
    --gas-prices 0.025uxion \
    --gas auto \
    --gas-adjustment 1.3 \
    -y --no-admin \
    --chain-id xion-testnet-2 \
    --node https://rpc.xion-testnet-2.burnt.com:443

    把 txhash 复制出来,待会要用到: init contract.jpg

步骤 4:测试合约

  1. 从合约实例化步骤中设置新的交易哈希:

     TXHASH="your-txhash-here"
  2. 查询区块链获取合约地址:

     CONTRACT=$(xiond query tx $TXHASH \
    --node https://rpc.xion-testnet-2.burnt.com:443 \
    --output json | jq -r '.events[] | select(.type == "instantiate") | .attributes[] |    select(.key ==   "_contract_address") | .value')
  3. 显示合约地址:

     echo $CONTRACT

query-contract-address.jpg

  1. 部署的合约包括一个查询当前 count 值的方法。您可以使用它来检索 stored 状态。要获取当前计数,请使用以下内容:

    QUERY='{"get_count":{}}'
  2. 运行以下命令,将查询请求发送到合约:

    xiond query wasm contract-state smart $CONTRACT "$QUERY" --output json --node https://rpc.xion-testnet-2.burnt.com:443

    可以看到,查询到了count = 1 qurey count.jpg

  3. 让我们发送一个事务,将计数器增加 1 ,这是修改合约内部状态,所以需要支付gas:

    TRY_INCREMENT='{"increment": {}}'
    xiond tx wasm execute $CONTRACT "$TRY_INCREMENT" \
    --from $WALLET \
    --gas-prices 0.025uxion \
    --gas auto \
    --gas-adjustment 1.3 \
    -y \
    --node https://rpc.xion-testnet-2.burnt.com:443 \
    --chain-id xion-testnet-2

    输入账号的密码,执行事务
    increment.jpg

  4. 再次运行 get_count 查询,可以看到已经变成了 2: qurey count 2.jpg

    1. 让我们发送一个事务将计数重置为特定值 例如 0,与增量交易一样,reset 交易 也会修改合约的状态并需要 gas 费用:
      RESET='{"reset": {"count": 0}}'
      xiond tx wasm execute $CONTRACT "$RESET" \
      --from $WALLET \
      --gas-prices 0.025uxion \
      --gas auto \
      --gas-adjustment 1.3 \
      -y \
      --node https://rpc.xion-testnet-2.burnt.com:443 \
      --chain-id xion-testnet-2

reset.jpg 再次查询:

reset-query.jpg OK,结果正确!我们完成了一个完整的智能合约上链,实例化,并且进行交互,非常酷!

总结

我们超级详细的学习了如何去搭建 XION合约开发环境,实操了如何部署合约,实例化合约,与合约进行交互,我操作一遍下来,感觉很爽,有些地方还是和 evm 链有些区别的,请多多实操,多多对比,OK,今天先到这里,后续我会出更多的 XION 教程,请多多关注!

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
BraisedSix
BraisedSix
0x6100...b2d4
一个热爱web3的篮球爱好者