往期回顾:

在本期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. 在NEARCLI 中登录该账户

由于我们已经安装NEAR CLI,且已申请了NEAR TestNet中的用户账户。

下面可以尝试在NAER CLI中登录该账户:

$ near login

随着上述命令的执行,NEAR CLI将唤起一个链接,并需要用户手动点击登陆上述`statusmessage.testnet`账户。

3.3. 查看账户相关信息

同时,我们可以通过NEAR CLI 查询特定账户的相关信息

$ near state statusmessage.testnetAccount 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_ACCOUNTAccount contract01.statusmessage.testnet for network 'testnet' was created.

接着我们便可以使用near deploy命令来帮助我们部署该合约。

$ near deploy --accountId contract01.$MASTER_ACCOUNT \--wasmFilestatus_message.wasm

若合约部署成功,我们可以获得如下信息:

Starting deployment. Account id: contract01.statusmessage.testnet, node: https://rpc.testnet.near.org, helper: https://helper.testnet.near.org, file: status_message.wasmTransaction Id 4oDYA8wPLJuKwDumJxEGubeJBA9Ep13MLXSf34q9ydRmTo see the transaction in the transaction explorer, please open this url in your browserhttps://explorer.testnet.near.org/transactions/4oDYA8wPLJuKwDumJxEGubeJBA9Ep13MLXSf34q9ydRmDonedeployingtocontract01.statusmessage.testnet

3.5 调用合约函数

当我们成功部署合约至TestNet后,部署该合约的账户contract01.statusmessage.testnet,即为该合约的地址。

为验证TestNet中StatusMessage合约是否能够正常运行。我们可以调用set_status 来设定合约内置的属性。

$ near call --accountId $MASTER_ACCOUNT \contract01.$MASTER_ACCOUNTset_status'{'message':'Hi!2021'}'

如下是调用该合约中函数set_status返回的信息

Scheduling a call: contract01.statusmessage.testnet.set_status({'message':'Hi!2021'})TransactTransaction Id E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesNTo see the transaction in the transaction explorer, please open this url in your browserhttps://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将主要从安全的角度,向大家进一步展示如何编写一个安全的智能合约。