往期回顧:
在本期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. 在NEARCLI 中登錄該賬戶
由於我們已經安裝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 \
--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.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
Donedeployingtocontract01.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 E9dsw8H9ztDN18DDvXKTBPvBLWHew7TtuWsLgg6uvesN
To see the transaction in the transaction explorer, please open this url in your browser
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將主要從安全的角度,向大家進一步展示如何編寫一個安全的智能合約。