Rust智能合約養成日記(3)
BlockSec
2022-03-29 10:29
本文约4130字,阅读全文需要约17分钟
合約部署,函數調用,及explorer使用。

相關文章:

Rust Rust 智能合約養成日記(1)合約狀態數據定義與方法實現

Rust 智能合約養成日記(2)編寫Rust 智能合約單元測試

Rust 智能合約養成日記(2)編寫Rust 智能合約單元測試

在本期Rust 智能合約開發Blog 中,BlockSec 將為大家介紹如何將一個簡單的示例智能合約部署至NEAR 測試網絡(TestNet) 中,執行合約,並查詢合約的執行結果。

當合約的開發者們實現了合約的主要邏輯,進行了單元測試後,開發者可將該合約項目編譯成WASM 字節碼,部署到NEAR 的測試鏈上,為最後部署到主網(MainNet)做準備。

  • TestNet

    1. NEAR 網絡介紹

  • MainNet

    NEAR Protocol 作為一種協議,意味著可以存在有基於該協議的多種獨立網絡。 NEAR 協議所製定的規範與標準NEAR Protocol Specifications and Standards指明了基於NEAR 協議的不同鏈,其創世區塊配置GenesisConfig中chain_id各不相同。

  • LocalNet

    我們常用的主要有如下三種網絡:

每一個智能合約項目最終都需要在區塊鍊網絡上運行,以實現項目的功能。然而,對於一個新項目來說,項目團隊往往會先將項目部署在測試網(TestNet) 上,用來測試該智能合約項目的功能和相關業務邏輯。

當合約在測試網絡中進行了多輪的測試和獨立的安全審查(如有必要的話)之後,開發團隊可以選擇將該合約正式地部署至主網(MainNet)中。

$ sudo npm install -g near-cli

LocalNet 不同於TestNet。 LocalNet 運行於本地,因此部署在該鏈上的合約與交易數據均不向外部網絡公開。如果在合約項目部署至TestNet 或MainNet 之前,開發者不希望洩漏任何該項目相關的重要信息,LocalNet 將是一個不錯的選擇。

$ near --version

2. NEAR CLI 安裝

NEAR CLI (Command Line Interface) 是一個NodeJS 命令行接口,它底層利用near-api-js 連接到上述所介紹的網絡中,並與之交互。因此在安裝之前,我們需要首先安裝npm (全稱Node Package Manager),隨後我們將在Linux 中利用npm 執行如下安裝命令安裝NEAR CLI。

執行如下命令可查看NEAR CLI 的安裝版本,並檢查是否安裝成功。https://wallet.testnet.near.org3. 在TestNet 中部署合約

3.1. 註冊TestNet 賬戶https://explorer.testnet.near.org新用戶可在

頁面中註冊新的TestNet 錢包,只需要輸入用戶名即完成註冊,例如statusmessage.testnet。

隨後在

中,我們可以搜索並查看有關TestNet 中該賬戶的有關信息,如下所示:

$ near login

在TestNet 中,每一個新建賬戶中將含有200Ⓝ的原生餘額。

3.2. 在NEAR CLI 中登錄該賬戶

由於我們已經安裝NEAR CLI,且已申請了NEAR TestNet 中的用戶賬戶。下面可以嘗試在NAER 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' 
}

隨著上述命令的執行,NEAR CLI 將喚起一個鏈接,並需要用戶手動點擊登陸上述statusmessage.testnet 賬戶。

3.3. 查看賬戶相關信息

$ RUSTFLAGS='-C link-arg=-s' cargo +stable build --target wasm32-unknown-unknown --release

同時,我們可以通過NEAR CLI 查詢特定賬戶的相關信息

$ 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.

3.4. 合約編譯與部署

$ near deploy --accountId contract01.$MASTER_ACCOUNT \
                        --wasmFile status_message.wasm

在將合約部署之前,我們首先需要對合約進行編譯,如下命令可利用cargo 編譯得到具體的WASM 文件status_message.wasm. 它通常位於項目的target/wasm32-unknown-unknown/release/ 目錄下。

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

同時,我們可以給statusmessage.testnet 創建一個子賬戶,名為contract01.statusmessage.testnet, 用於合約的部署

接著我們便可以使用near deploy 命令來幫助我們部署該合約。

$ near call --accountId $MASTER_ACCOUNT \
      contract01.$MASTER\_ACCOUNT set\_status '{"message":"Hi!2021"}'

若合約部署成功,我們可以獲得如下信息:

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) ''

3.5 調用合約函數

當我們成功部署合約至TestNet 後,部署該合約的賬戶contract01.statusmessage.testnet,即為該合約的地址。為驗證TestNet 中StatusMessage 合約是否能夠正常運行。我們可以調用set_status 來設定合約內置的屬性。

如下是調用該合約中函數set_status 返回的信息

可見該筆StatusMessage 合約函數調用交易能夠正常執行,並返回了具體的Transaction ID,即E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesNhttps://explorer.testnet.near.org/transactions/E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN

3.6 交易查詢

NEAR 為社區提供了一個數據瀏覽查詢平台NEAR Explorer。用戶可以在該平台中搜索指定網絡中的賬戶ID,交易哈希,交易區塊等實時鏈上信息。

BlockSec
作者文库