開發DApp,這些工具你必須瞭解
網際網路是一個去中心化的網路。相較於傳統客戶端/伺服器應用,網際網路的巨大優勢在於其提供了開放、透明、公平的競爭環境。更多的競爭意味著更多的創新,這最終體現在為消費者提供更好的使用者體驗。其餘的都是歷史,網際網路已經勝利了。
但是web時代和移動時代的應用再次以效率的名義出現了強大的權力集中。通過在單一平臺提供方下聚合所有的資料和服務,網際網路應用變得更加好用,並且也易於盈利。然而,正如最近公眾對Facebook、Google、Uber等網際網路巨頭的強烈反彈所表現的那樣,網際網路應用的中心化已經使得網際網路的體驗逐步變差,甚至與上一代公司所建立的私有網路一樣糟糕。
在中心化的網際網路上,使用者沒有隱私可言,也無法從自己的資料中獲益。在沒有制衡的情況下,大公司制定、操縱並執行規則來使自己利益最大化,而小商家在這些中心化平臺上的利潤空間不斷萎縮。
去中心化的應用(DApp)是下一代開放式網路應用程式。DApp使用公共區塊鏈來儲存關鍵資料,而不是使用不透明公司的私有資料庫。公鏈的資料是透明的、不可篡改的,並且使用者能夠通過私鑰直接控制自己的資料。
如同web或移動網際網路的早期階段,開發者社群仍在探索構建複雜且高度可用的DApp的最佳方法。今天,DApp架構,開發者工具和部署環境都難以使用甚至難以理解。這對廣大開發人員造成了很高的門檻。
在這篇文章,我會介紹當前最新的DApp開發技術基礎架構和工具,解釋一些術語併為開發人員開發DApp提供實用指南。
總覽
與傳統的web應用不同,DApp的核心資料和事務邏輯儲存在公鏈上。部署在區塊鏈上的全自動不可更改的軟體稱為智慧合約。在智慧合約內部,資料和操作可以精細化到只允許特定的賬戶持有者訪問,從而實現了個人的資料所有權。
DApp的web或移動前端UI是任何人都可以部署的應用程式。它們與區塊鏈智慧合約進行互動。前端應用程式可以建立自己的資料庫來儲存非核心資料。但是由於核心資料和邏輯位於公鏈上,因此任何人都可以建立和部署前端應用程式,這就是DApp名字的由來。
DApp架構概述
智慧合約
智慧合約是DApp的核心,是公鏈上的不可變軟體。當滿足預設條件時,執行區塊鏈的公共節點計算機會自動執行智慧合約的程式碼。
這一小節將探討智慧合約開發所需的軟體。
程式語言支援
開發人員可能會用到如下程式語言:
Solidity 由以太坊開創,是目前使用最廣泛的智慧合約程式語言。Solidity語法簡單,側重程式碼的確定性行為,這是區塊鏈共識的關鍵要求。也就是在執行智慧合約程式碼時,所有的節點必須產生完全相同的結果。Solidity目前是開發者首選的智慧合約程式語言。
Lity 是一種新的智慧合約程式語言,對Solidity進行了擴充套件,為其添加了新的語言功能和操作碼。Lity針對商業用例優化了Solidity和以太坊虛擬機器。例如,通過名為 libENI (以太坊本地介面)的機制,Lity允許區塊鏈虛擬機器動態新增本機C++擴充套件,這讓虛擬機器能夠為某些計算任務提供專門的優化以實現 高效能 。Lity還支援新的語言結構,例如構建基於規則應用的 正式規則語言 。
Vyper 與Python類似,是以太坊虛擬機器的程式語言。與Python不同的是,Vyper刪除了語言中所有的非確定性功能。相較於Solidity,Vyper設計地更加容易使用,目前仍處於測試階段。
C / C++是像EOS一樣基於WebAssembly的區塊鏈虛擬機器選擇的程式語言。但是C / C++和WebAssemly並不是為區塊鏈所需的確定性共識而設計的,使用C / C++的修訂版本存在著學習曲線。同樣,由於WebAssembly通過LLVM IR可以支援多種通用程式語言,所以理論上,基於WebAssembly的區塊鏈虛擬機器可以使用幾種不同的語言。但實際情況是,要支援除C++以外的任何LLVM語言,社群仍然需要做大量的工作。
Lua 是一種輕量級的指令碼語言,通常用於嵌入式硬體應用。由於Lua虛擬機器輕巧且易於使用,因此有時會在區塊鏈系統中用作智慧合約虛擬機器。不過這種情況並不常見。
編譯器和部署工具
為了編譯和執行智慧合約,你需要工具。更準確點,需要組合工具。在這一小節中,我們將重點放在以太坊生態系統中的工具,因為這是使用最廣泛的工具。
- 編譯器和區塊鏈節點
編譯器將智慧合約構建為位元組碼(bytecode),區塊鏈節點將位元組碼部署到區塊鏈上以供下一步執行。
Solidity的編譯器是 solc
。執行GETH或Parity的以太坊節點可以上傳並部署 solc
編譯過的位元組碼到以太坊網路上。
Lity的編譯器是 lityc
,它在 solc
之上提供了合規性和附加安全性檢查,並且支援Lity特定的語言功能和增強功能。通過 Travis 節點軟體 ,可以將編譯後的Lity應用程式部署到CyberMiles區塊鏈。
- Remix和MetaMask
則支援用Lity語言編寫的智慧合約。Remix可以在Chrome瀏覽器中編譯和測試智慧合約。
然而,為了讓Remix與像以太坊、CyberMiles這樣的公鏈一起工作,其必須與”錢包”應用協同工作。因為很多區塊鏈上的智慧合約操作,如部署、建立新的合約,呼叫合約功能,都需要支付小額gas費。在以太坊上,Remix需要MetaMask錢包才能執行。在CyberMiles上,Europa 需要 Venus 才能執行。
Remix和MetaMask的組合適用於基於圖型介面的重複手動開發。
- Truffle和Infura
等公共以太坊節點服務提供商一起,開發者可以使用Truffle在公鏈上部署智慧合約,並呼叫智慧合約上的功能。
在CyberMiles,通過Lity語言的 lityc
編譯器,Truffle的效能得到了增強,可用於檢查智慧合約程式碼中已知的安全問題和模式。在CyberMiles,Truffle 稱為 Saturn 。公共的CyberMiles主鏈節點( rpc.cybermiles.io:8545
)可以作為RPC服務,與Saturn協同工作。
去中心化的應用程式
一旦我們構建並測試了智慧合約,就可以構建DApp UI,讓使用者與智慧合約進行互動。
不同於依賴中央伺服器的的Web應用,DApp可以在使用者自己的機器上儲存管理使用者資料,並利用包括區塊鏈服務在內的多個後端服務來實現去中心化。
DApp通常作為JavaScript應用程式的客戶端在使用者的裝置中執行。DApp的主要功能是提供使用者介面,與核心資料和應用程式邏輯的區塊鏈智慧合約進行互動。 DApp還可以與其他公共服務,甚至是本地服務進行互動,以儲存和管理鏈下資料。 例如,DApp可以利用HTML5本地儲存API來儲存特定於此裝置上的使用者資料。
你可以用任何JavaScript客戶端框架編寫DApp,熱門的例子包括jQuery和ReactJS。
在Tuffle專案中,你也可以找到好些用JavaScript框架建立的DApp模板。
Web3庫
JavaScript應用程式通過名為 web3.js
的庫與區塊鏈服務相連線。目前, web3.js
僅支援以太坊區塊鏈,並且尚未達到1.0版本。然而, web3.js
仍然是連線DApp與區塊鏈服務最廣泛應用的庫。
與以太坊相容的區塊鏈需要自己定製的 web3.js
版本。例如,CyberMiles區塊鏈提供了 web3-cmt.js
庫,與 web3.js
向後相容,但支援CyberMiles在其 web3.cmt
包下的增加的交易型別。
這個web3.js庫需要一個私鑰來簽署傳送給區塊鏈的交易與程式碼。就像我們已經討論過的那樣,區塊鏈賬戶的私鑰由錢包應用程式儲存和管理。DApp應該與相容的錢包應用程式結合使用,如MetaMask,Venus或者CMT Wallet。這樣的錢包也被稱為web3提供方。DApp JavaScript程式碼應該檢測web3提供的物件的可用性和有效性。
- Mateamask是以太坊官方的測試鏈和主鏈的web3提供方。它為Chrome瀏覽器上的所有web應用程式提供web3例項。
- Venus是CyberMiles區塊鏈在Chrome瀏覽器的web3提供方。
- CMT Wallet為移動端應用程式提供web3。這些程式以移動網頁的形式在CMT Wallet內開啟。以太坊也有類似的移動錢包,如Trust Wallet可以執行以太坊DApp。
Venus和CMT Wallet都為DApp提供了web3-cmt物件,以便與CyberMiles測試鏈和主鏈進行互動。
在web3.js以外,ethereumJS庫可以在沒有錢包應用的情況下籤署以太坊交易。但是,要執行此操作,JavaScript程式碼必須能夠訪問賬戶私鑰。ethereumJS庫提供了一個JavaScript庫,用於在DApp中實現嵌入式錢包。
注意:Scatter這樣的跨鏈應用程式與錢包相類似,但是用於執行DApp。Sactter提供了JavaScript物件來簽署和提交區塊鏈事務。
外部服務
正如我們所描述的那樣,DApp在區塊鏈智慧合約上只儲存核心邏輯和程式碼。在區塊鏈上儲存大量的資料太慢並且過於昂貴。大多數應用還需要媒體檔案,資料庫和其他鏈下資料才能執行。
DApp可以利用線上服務來儲存和管理資料,下面是一些例子。
- IPFS是基於區塊鏈的媒體檔案儲存和交換服務協議。 DApp可以在IPFS上儲存大型使用者檔案,並使它們易於訪問。
- Swarm是一個基於以太坊的檔案儲存和共享解決檔案。
- Github,Dropbox和Google Drive等傳統網際網路檔案分享服務可以給DApp使用者提供鏈下檔案儲存和共享服務。
- DBaaS (DataBase 即服務) 提供者,如 Microsoft Azure SQL , AWS Relational Database Service (RDS) , Google BigQuery , MongoDB Atlas ,可以為DApp提供資料庫服務儲存。
一個確保鏈下資料安全不可更改的常見設計實踐是,將鏈下檔案資料的雜湊值儲存在鏈上智慧合約。
總結
DApp比大多數web應用更復雜。從一開始,你需要設計程式的哪一部分是基於區塊鏈智慧合約,哪一部分利用鏈下伺服器端資料,哪一部分是客戶端UI。以上每一個部分都需要一組軟體棧來執行,並與應用的其他部分進行互動。本文概述了DApp開發涉及的技術總覽。如何開發自己的DApp?請繼續關注後續教程。
Happy coding!
首發|區塊鏈大本營 作者| CyberMiles 首席科學家 Michael Yuan 博士