相关文章:
在本期 Rust 智能合约开发 Blog 中,BlockSec 将为大家介绍如何将一个简单的示例智能合约部署至 NEAR 测试网络 (TestNet) 中,执行合约,并查询合约的执行结果。
当合约的开发者们实现了合约的主要逻辑,进行了单元测试后,开发者可将该合约项目编译成 WASM 字节码,部署到 NEAR 的测试链上,为最后部署到主网 (MainNet) 做准备。
1. NEAR 网络介绍
NEAR Protocol 作为一种协议,意味着可以存在有基于该协议的多种独立网络。NEAR 协议所制定的规范与标准NEAR Protocol Specifications and Standards指明了基于 NEAR 协议的不同链,其创世区块配置GenesisConfig中chain_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 将主要从安全的角度,向大家进一步展示如何编写一个安全的智能合约。