Rust智能合约养成日记: 合约部署,函数调用,及explorer使用

BlockSec

    往期回顾:
    
  • Rust 智能合约养成日记(1)合约状态数据定义与方法实现
  • Rust 智能合约养成日记(2)编写 Rust 智能合约单元测试

    在本期 Rust 智能合约开发 Blog 中,BlockSec 将为大家介绍如何将一个简单的示例智能合约部署至 NEAR 测试网络 (TestNet) 中,执行合约,并查询合约的执行结果。
    当合约的开发者们实现了合约的主要逻辑,进行了单元测试后,开发者可将该合约项目编译成 WASM 字节码,部署到 NEAR 的测试链上,为最后部署到主网 (MainNet) 做准备。
    1. NEAR 网络介绍
    NEAR Protocol 作为一种协议,意味着可以存在有基于该协议的多种独立网络。NEAR 协议所制定的规范与标准NEAR Protocol Specifications and Standards指明了基于 NEAR 协议的不同链,其创世区块配置GenesisConfigchain_id各不相同。
    我们常用的主要有如下三种网络:
    
  • TestNet 每一个智能合约项目最终都需要在区块链网络上运行,以实现项目的功能。然而,对于一个新项目来说,项目团队往往会先将项目部署在测试网(TestNet) 上,用来测试该智能合约项目的功能和相关业务逻辑。
  • MainNet 当合约在测试网络中进行了多轮的测试和独立的安全审查(如有必要的话)之后,开发团队可以选择将该合约正式地部署至主网(MainNet)中。
  • LocalNet LocalNet 不同于 TestNet。LocalNet 运行于本地,因此部署在该链上的合约与交易数据均不向外部网络公开。如果在合约项目部署至 TestNet 或 MainNet 之前,开发者不希望泄漏任何该项目相关的重要信息,LocalNet 将是一个不错的选择。

    2. NEAR CLI 安装
    NEAR CLI (Command Line Interface) 是一个 NodeJS 命令行接口,它底层利用 near-api-js 连接到上述所介绍的网络中,并与之交互。 因此在安装之前,我们需要首先安装 npm (全称 Node Package Manager),随后我们将在 Linux 中利用 npm 执行如下安装命令安装 NEAR CLI。
    
$ sudo npm install -g near-cli
    ?

    执行如下命令可查看 NEAR CLI 的安装版本,并检查是否安装成功。
    
$ near --version

    3. 在 TestNet 中部署合约
    3.1. 注册 TestNet 账户
    新用户可在 https://wallet.testnet.near.org 页面中注册新的 TestNet 钱包,只需要输入用户名即完成注册,例如 statusmessage.testnet
    
    随后在 https://explorer.testnet.near.org 中,我们可以搜索并查看有关 TestNet 中该账户的有关信息,如下所示:
    
    在 TestNet 中,每一个新建账户中将含有 200?的原生余额。
    3.2. 在 NEAR CLI 中登录该账户
    由于我们已经安装 NEAR CLI,且已申请了 NEAR TestNet 中的用户账户。 下面可以尝试在 NAER CLI 中登录该账户:
    
$ near login

    随着上述命令的执行,NEAR CLI 将唤起一个链接,并需要用户手动点击登陆上述 statusmessage.testnet 账户。
    
    3.3. 查看账户相关信息
    同时,我们可以通过 NEAR CLI 查询特定账户的相关信息
    
$ near state statusmessage.testnet
    Account statusmessage.testnet
    { amount: '199999959035075000000000000',
    block_hash: '8iomNEFNa4LQB54ehTPBGu8bBfotistoWrBcYJfxm8vA',
    block_height: 68318068,
    code_hash: '11111111111111111111111111111111',
    locked: '0',
    storage_paid_at: 0,
    storage_usage: 264,
    formattedAmount: '199.999959035075'?
    }
3.4. 合约编译与部署
    在将合约部署之前,我们首先需要对合约进行编译,如下命令可利用 cargo 编译得到具体的 WASM 文件 status_message.wasm. 它通常位于项目的 target/wasm32-unknown-unknown/release/ 目录下。
    
$ RUSTFLAGS='-C link-arg=-s' cargo +stable build --target wasm32-unknown-unknown --release

    同时,我们可以给 statusmessage.testnet 创建一个子账户,名为 contract01.statusmessage.testnet, 用于合约的部署
    
$ cd target/wasm32-unknown-unknown/release
    $ export MASTER_ACCOUNT=statusmessage.testnet
    $ near create-account contract01.$MASTER_ACCOUNT
    ? ? ? ? ? ? ? ? ? ? ? ? ? --initialBalance 10
    ? ? ? ? ? ? ? ? ? ? ? ? ? --masterAccount $MASTER_ACCOUNT
    Account contract01.statusmessage.testnet for network "testnet" was created.

    接着我们便可以使用 near deploy 命令来帮助我们部署该合约。
    
$ near deploy --accountId contract01.$MASTER_ACCOUNT \
    ? ? ? ? ? ? ? ? ? ? ? ? --wasmFile status_message.wasm

    若合约部署成功,我们可以获得如下信息:
    
Starting deployment. Account id: contract01.statusmessage.testnet, node: [https://rpc.testnet.near.org](https://rpc.testnet.near.org), helper: [https://helper.testnet.near.org](https://helper.testnet.near.org), file: status_message.wasm
    Transaction Id 4oDYA8wPLJuKwDumJxEGubeJBA9Ep13MLXSf34q9ydRm
    To see the transaction in the transaction explorer, please open this url in your browser[https://explorer.testnet.near.org/transactions/4oDYA8wPLJuKwDumJxEGubeJBA9Ep13MLXSf34q9ydRm](https://explorer.testnet.near.org/transactions/4oDYA8wPLJuKwDumJxEGubeJBA9Ep13MLXSf34q9ydRm) Done deploying to contract01.statusmessage.testnet
3.5 调用合约函数
    当我们成功部署合约至 TestNet 后,部署该合约的账户 contract01.statusmessage.testnet,即为该合约的地址。 为验证 TestNet 中 StatusMessage 合约是否能够正常运行。我们可以调用 set_status 来设定合约内置的属性。
    
$ near call --accountId $MASTER_ACCOUNT \
    ? ? ? contract01.$MASTER\_ACCOUNT set\_status '{"message":"Hi!2021"}'

    如下是调用该合约中函数 set_status 返回的信息
    
Scheduling a call: contract01.statusmessage.testnet.set_status({"message":"Hi!2021"})
    TransactTransaction Id E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN
    To see the transaction in the transaction explorer, please open this url in your browser[https://explorer.testnet.near.org/transactions/E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN](https://explorer.testnet.near.org/transactions/E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN) ''

    可见该笔 StatusMessage 合约函数调用交易能够正常执行,并返回了具体的 Transaction ID,即 E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN
    3.6 交易查询
    NEAR 为社区提供了一个数据浏览查询平台 NEAR Explorer。用户可以在该平台中搜索指定网络中的账户 ID,交易哈希,交易区块等实时链上信息。
    
    利用该笔交易的 ID 可以在 NEAR Explorer 查询具体的交易细节。 https://explorer.testnet.near.org/transactions/E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN
    
    本期总结和预告
    这一期中我们详细的介绍了如何将一个智能合约编译,并且部署到测试链上,接着如何调用指定的合约中的函数,并且通过 explorer 查询特定交易的状态。通过前三期的 Rust 智能合约养成日记,相信同学们大概知道如何从头开始写一个简单的合约,并且将其部署。从下一期开始 BlockSec 将主要从安全的角度,向大家进一步展示如何编写一个安全的智能合约。