在分片公鏈 NEAR 搭建 DApp 的邏輯幾何?結合源碼實踐分析 DApp 在部署與區塊鏈交互背後的邏輯過程。

原文標題:《NEAR 應用與區塊鏈交互解析》
撰文:倪森

NEAR 是一個通過分片來提高區塊鏈擴展性、專注於性能和用戶體驗的下一代公鏈項目,致力於提供一個能推動 Dapp 大規模使用的平臺。

本文通過創建一個實例項目,結合源碼分析,探究 Dapp 在部署、與區塊鏈交互背後的邏輯過程

創建部署 Dapp

首先創建一個簡單的 Dapp。

環境安裝

在執行下述步驟前,確保已安裝 npm、node、near-shell 和構建工具,如 gulp。

創建項目

什麼是 create-near-app
create-near-app 是一個用來快速生成項目基礎框架的模板工具,目前支持 react 模板和原生模板。

採用 create-near-app 在當前目錄下創建一個簡單的項目框架 myapp:

npx create-near-app --vanilla myapp

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

下圖爲一個創建成功的基本項目。其中,hide 負責存放主要代碼,assembly 存放合約代碼,neardev 則用來存放一些賬戶配置。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

創建賬戶並授權

項目創建完成後,如無 NEAR 賬戶,先前往 https://wallet.nearprotocol.com/ 錢包創建一個賬戶,並在項目目錄下執行 near login,根據操作步驟進行賬戶授權,此時會在 neardev 文件夾下創建對應賬戶文件。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

接下來爲合約創建賬戶:

near create_account myappaccount --masterAccount=hashquark --initialBalance 2

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

將 hide/config.js 中的合約名稱修改爲剛創建的合約名稱:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

打包並啓動

採用 npm install && npm start 安裝依賴並啓動項目後,即可前往本地 5000 端口打開網站。登錄至錢包並完成授權後即返回首頁展示歡迎用戶(如下圖所示)。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

過程分析

下文將結合源碼分析,探究上述步驟的過程邏輯。

合約編譯

什麼是 wasm
WebAssembly 也稱 wasm,是一個實驗性的低端編程語言,應用於瀏覽器內的客戶端。Wasmer 則是一個獨立於瀏覽器外的 wasm 運行環境。NEAR 的智能合約虛擬機基於 wasmer 實現,其智能合約也需要先編譯爲 wasm 文件。

NEAR 智能合約目前支持採用 AssemblyScript 或 Rust 進行編寫。在構建項目時,智能合約最終會被編譯成 wasm 文件,存放在 out 目錄下,在 gulp 的配置文件中可看到相關邏輯:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

合約部署

NEAR 工具介紹
near-shell 是一個用來與 near 協議進行交互的命令行工具,基於 nearlib 實現。nearlib 是和 near 協議交互的 Javascript SDK。

在執行 npm start 啓動項目時,會先執行 near deploy 來部署合約,near deploy 命令是 near-shell 的命令,主要代碼如下圖所示:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

可以看到,near deploy 通過 neardev 文件夾下的賬戶執行了 nearlib 的 deployContract 方法,該方法調用 signAndSendTransaction 發送部署合約的交易:

![實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯](https://img.chainnews.com/material/images/3b3338202d7afdf93ce48237d7680c58.jpg

)實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

不難看出,部署合約核心是用合約數據構造一筆交易,並用賬戶簽名,再將簽名後的交易發送給節點。

發送交易本質上是將數據編碼後,向節點發送一個方法名爲「broadcast_tx_commit」的 JsonRpc 請求。

合約部署的調用關係圖參考如下:
實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

接下來,節點又將如何處理 JsonRpc 請求?

節點處理部署請求

什麼是 nearcore
nearcore 是 near 協議的一個官方節點實現,採用 Rust 編寫。
nearcore 的實現中採用了 actix 框架進行併發與異步處理,actix 是一個基於 Actor 的併發模型,通過消息傳遞來交換數據並行處理。

nearcore 節點啓動時,會開啓一個 http 服務,用以處理節點的 RPC 請求;ViewClientActor、ClientActor 和 PeerManagerActor 也同時啓動,以此響應不同事件的發生:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

由下圖可知,http 服務主要採用 JsonRpcHandler 來處理各個請求。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

而 JsonRpcHandler 的主要處理函數如下,因此當我們接收到一個方法名爲「broadcast_tx_commit」的請求時,會調用 send_tx_commit 方法來處理:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

send_tx_commit 方法的核心是向其綁定的 ClientActor 發送一個類別爲 Transaction 的 NetworkClientMessages 消息。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

在 ClientActor 中可以看到對該消息採用 process_tx 處理:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

而在 process_tx 方法中,會先檢查這筆交易是否屬於自己所處的分片中:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

如屬於,則檢查交易有效性並確定自己是否爲活躍驗證人,若非活躍驗證人,則交由其他驗證人處理。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

如不屬於,則交由其他節點處理。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

之後內存池的交易會經過共識存儲在區塊鏈上,這樣一來,我們的合約也就存在了區塊鏈上。

以上流程可以參考如下簡圖:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

合約調用 view 方法

智能合約部署完成後,調用合約的方法,會發生什麼情況?

合約 view 方法和 change 方法

NEAR 智能合約的方法可分爲 view 方法和 change 方法,view 方法不改變區塊鏈的狀態,而 change 方法則恰恰相反,因此通常需要用戶授權等。

在 myapp/main.js 裏會先調用 nearlib 的方法來創建和 near 節點的連接以及實例化合約方法,在 myapp 項目裏,實例化時指定了我們所要調用的 view 方法——welcome。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

在實例化合約時採用 loadContract 方法生成一個合約對象:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

生成合約對象時,通過構造方法綁定賬戶、合約名稱及具體接口:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

之後在登錄後的處理函數裏,調用了合約裏定義的 welcome 方法,將結果顯示在頁面上。調用 welcome 方法時,即執行實例化時綁定的 viewFunction。

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

可以看到,調用合約的 welcome 方法本質上是向節點發送方法名爲「query」的 JsonRpc 請求,參數 path 爲「call/${contractId}/${methodName}」, data 爲 methodName 的參數。

以上流程可參考下圖:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

節點處理 view 方法

同前述 near 處理「broadcast_tx_commit」 類似,處理「query」 RPC 請求會調用 JsonRpcHandler 的 query 方法處理。

query 方法實現的核心是向 JsonRpcHandler 綁定的 ViewClientActor 發送 Query 消息,交由其處理。

ViewClientActor 對 Query 消息的處理核心:首先查詢自身有無查詢內容所處的分片信息,如有就調用自身查詢(包括調用虛擬機執行方法等),如無則路由到其他節點來處理。

以上流程可參考如下簡圖:

實踐解析分片公鏈 NEAR 生態 DApp 部署與交互邏輯

總結

本文通過創建、部署、調用一個簡單的 NEAR 智能合約,分析了在此過程中 Dapp 是如何發起請求、NEAR 節點又是如何處理該請求的。希望通過詳述該過程,能對讀者及 NEAR 技術愛好者予以啓示。

來源鏈接:mp.weixin.qq.com