以太坊升級完成你也做不出爆款應用, 就因為你不知道這個!

買賣虛擬貨幣



【區塊鏈大本營編者按】據 etherscan.io 資料顯示,經歷一波又一波「挫折」後,今日凌晨 03:52,以太坊區塊高度達到 7280000,君士坦丁堡及聖彼得堡硬分叉完成,以太坊升級成功!對於區塊鏈開發者而言,此次升級意味著什麼?主要表現在:

EIP145 和 EIP1052 透過提升智慧合約的驗證速度,能有效改進某些大型智慧合約的執行時間和成本。簡而言之,此次升級對開發者是極為友好的


但俗話說,「打鐵還需自身硬,磨刀不誤砍柴工」,對以太坊開發者而言,要開發一款可規模落地、使用者體驗極棒的 DApp,全面瞭解以太坊 DApp 生態則顯得尤為必要。

作者 | Michael Yuan,CyberMiles 首席科學家

責編 | 佩奇

出品 | CSDN、區塊鏈大本營



網際網路是一個去中心化的網路。相較於傳統客戶端/伺服器應用,網際網路的巨大優勢在於其提供了開放、透明、公平的競爭環境。更多的競爭意味著更多的創新,這最終體現在為消費者提供更好的使用者體驗。其餘的都是歷史,網際網路已經勝利了。


但 Web 時代和移動時代的應用再次以效率的名義出現了強大的權力集中。透過在單一平臺提供方下聚合所有的資料和服務,網際網路應用變得更加好用,並且也易於盈利。然而,正如最近公眾對 Facebook、Google、Uber 等網際網路巨頭強烈反彈所表現的那樣,網際網路應用的中心化已經使得網際網路的體驗逐步變差,甚至與上一代公司所建立的私有網路一樣糟糕。


在中心化的網際網路上,使用者沒有隱私可言,也無法從自己的資料中獲益。在沒有制衡的情況下,大公司制定、操縱並執行規則來使自己利益最大化,而小商家在這些中心化平臺上的利潤空間不斷萎縮。


去中心化的應用(DApp)是下一代開放式網路應用程式。DApp 使用公共區塊鏈來儲存關鍵資料,而不是使用不透明公司的私有資料庫。公鏈的資料是透明的、不可篡改的,並且使用者能夠透過私鑰直接控制自己的資料。


如同 Web 或移動網際網路的早期階段,開發者社羣仍在探索構建複雜且高度可用的 DApp 的最佳方法。今天,DApp 架構、開發者工具和部署環境都難以使用甚至難以理解。這對廣大開發人員造成了很高的門檻。


在本文中,我會介紹當前最新的 DApp 開發技術基礎架構和工具,解釋一些術語併為開發人員開發 DApp 提供實用指南。



與傳統的 Web 應用不同,DApp 的核心資料和事務邏輯儲存在公鏈上。部署在區塊鏈上的全自動不可更改的軟體稱為智慧合約。在智慧合約內部,資料和操作可以精細化到只允許特定的賬戶持有者訪問,從而實現了個人的資料所有權。


DApp 的 Web 或移動前端 UI 是任何人都可以部署的應用程式。它們與區塊鏈智慧合約進行互動。前端應用程式可以建立自己的資料庫來儲存非核心資料。但是由於核心資料和邏輯位於公鏈上,因此任何人都可以建立和部署前端應用程式,這就是 DApp 名字的由來。DApp架構如下圖:


DApp架構



智慧合約


智慧合約是 DApp 的核心,是公鏈上的不可變軟體。當滿足預設條件時,執行區塊鏈的公共節點計算機會自動執行智慧合約的程式碼。


智慧合約路徑


接下來,繼續探討智慧合約開發所需的軟體。


程式語言支援


開發人員可能會用到如下程式語言:


Solidity 由以太坊開創,是目前使用最廣泛的智慧合約程式語言。Solidity 語法簡單,側重程式碼的確定性行為,這是區塊鏈共識的關鍵要求。也就是在執行智慧合約程式碼時,所有的節點必須產生完全相同的結果。Solidity 目前是開發者首選的智慧合約程式語言。


Vyper 與 Python 類似,是以太坊虛擬機器的程式語言。與 Python 不同,Vyper 刪除了語言中所有的非確定性功能。相較於 Solidity,Vyper 設計地更加容易使用,目前仍處於測試階段。


Lity 是一種新的智慧合約程式語言,對 Solidity 進行了擴充套件,為其新增了新的語言功能和操作碼。Lity 針對商業用例最佳化了 Solidity 和以太坊虛擬機器。例如,透過名為 libENI(以太坊本地介面)的機制,Lity 允許區塊鏈虛擬機器動態新增本機 C++ 擴充套件,這讓虛擬機器能夠為某些計算任務提供專門的最佳化以實現高效能。Lity 還支援新的語言結構,例如構建基於規則應用的正式規則語言。


C / C++ 是像 EOS 一樣基於 WebAssembly 的區塊鏈虛擬機器選擇的程式語言。但是 C / C++ 和 WebAssemly 並不是為區塊鏈所需的確定性共識而設計的,使用 C / C++ 的修訂版本存在著學習曲線。同樣,由於 WebAssembly 透過 LLVM IR 可以支援多種通用程式語言,所以理論上,基於 WebAssembly 的區塊鏈虛擬機器可以使用幾種不同的語言。但實際情況是,要支援除 C++ 以外的任何 LLVM 語言,社羣仍然需要做大量的工作。


Lua 是一種輕量級的指令碼語言,通常用於嵌入式硬體應用。由於Lua虛擬機器輕巧且易於使用,因此有時會在區塊鏈系統中用作智慧合約虛擬機器。不過這種情況並不常見。


編譯器和部署工具


為了編譯和執行智慧合約,你需要工具。更準確點,需要組合工具。接下來,我們將重點放在以太坊生態系統中的工具,因為這是使用最廣泛的工具。


1、編譯器和區塊鏈節點


編譯器將智慧合約構建為位元組碼(bytecode),區塊鏈節點將位元組碼部署到區塊鏈上以供下一步執行。


Solidity 的編譯器是 solc。執行 GETH 或 Parity 的以太坊節點可以上傳並部署 solc 編譯過的位元組碼到以太坊網路上。


Lity 的編譯器是 lityc,它在 solc 之上提供了合規性和附加安全性檢查,並且支援 Lity 特定的語言功能和增強功能。透過Travis節點軟體,可以將編譯後的Lity應用程式部署到 CyberMiles區塊鏈。


2、Remix和MetaMask


Remix 是基於 Web 的 IDE,用於編輯、編譯、測試、部署和執行 Solidity 智慧合約。Remix 可以在 Chrome 瀏覽器中編譯和測試智慧合約。


然而,為使 Remix 與像以太坊、CyberMiles 這樣的公鏈一起工作,其必須與”錢包”應用協同工作。因為很多區塊鏈上的智慧合約操作,如部署、建立新的合約,呼叫合約功能,都需要支付小額 gas 費。在以太坊上,Remix 需要 MetaMask 錢包才能執行。


Remix 和 MetaMask 的組合適用於基於圖型介面的重複手動開發。


3、Truffle 和 Infura


Truffle 和 Infura 為命令列和自動化開發過程設計。


Truffle 使開發者從智慧合約和 DApp 模板開始,構建越來越複雜的應用程式。Truffle 為在本地以太坊虛擬機器上構建和測試智慧合約提供了命令列工具。與 Infura 等公共以太坊節點服務提供商一起,開發者可以使用 Truffle 在公鏈上部署智慧合約,並呼叫智慧合約上的功能。



去中心化的應用程式


一旦我們構建並測試了智慧合約,就可以構建 DApp UI,讓使用者與智慧合約進行互動。


不同於依賴中央伺服器的的 Web 應用,DApp 可以在使用者自己的機器上儲存管理使用者資料,並利用包括區塊鏈服務在內的多個後端服務來實現去中心化。


DApp 通常作為 JavaScript 應用程式的客戶端在使用者的裝置中執行。DApp 的主要功能是提供使用者介面,與核心資料和應用程式邏輯的區塊鏈智慧合約進行互動。DApp 還可以與其他公共服務,甚至是本地服務進行互動,以儲存和管理鏈下資料。例如,DApp 可以利用 HTML5 本地儲存 API 來儲存特定於此裝置上的使用者資料。


你可以用任何 JavaScript 客戶端框架編寫 DApp,熱門的例子包括 jQuery 和 ReactJS。 在 Tuffle 專案中,你也可以找到好些用 JavaScript 框架建立的 DApp 模板。


DApp設計路線


1、Web3 庫


JavaScript 應用程式透過名為 web3.js 的庫與區塊鏈服務相連線。目前,web3.js 僅支援以太坊區塊鏈,並且尚未達到1.0版本。然而,web3.js 仍然是連線 DApp 與區塊鏈服務最廣泛應用的庫。


與以太坊相容的區塊鏈需要自己定製的 web3.js 版本。例如,CyberMiles 區塊鏈提供了 web3-cmt.js 庫(也稱作 Mercury),與 web3.js 向後相容,但支援 CyberMiles 在其 web3.cmt 包下的增加的交易型別。


這個 web3.js 庫需要一個私鑰來簽署傳送給區塊鏈的交易與程式碼。就像我們已經討論過的那樣,區塊鏈賬戶的私鑰由錢包應用程式儲存和管理。DApp 應該與相容的錢包應用程式結合使用,如 MetaMask,Venus 或者 CMT Wallet。這樣的錢包也被稱為 Web3 提供方。DApp JavaScript 程式碼應該檢測 Web3 提供的物件的可用性和有效性。


  • MetaMask 是以太坊官方的測試鏈和主鏈的 Web3 提供方。它為 Chrome 瀏覽器上的所有 Web 應用程式提供 Web3 例項。

  • Venus(MetaMaskforCMT) 是 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 物件來簽署和提交區塊鏈事務。


2、外部服務


DApp 在區塊鏈智慧合約上只儲存核心邏輯和程式碼。在區塊鏈上儲存大量的資料太慢並且過於昂貴。大多數應用還需要媒體檔案,資料庫和其他鏈下資料才能執行。


DApp 可以利用線上服務來儲存和管理資料,下面是一些例子。


  • IPFS 是基於區塊鏈的媒體檔案儲存和交換服務協議。DApp 可以在 IPFS 上儲存大型使用者檔案,並使它們易於訪問。

  • Swarm 是一個基於以太坊的檔案儲存和共享解決檔案。

  • Github、Dropbox 和 GoogleDrive 等傳統網際網路檔案分享服務可以給 DApp 使用者提供鏈下檔案儲存和共享服務。

  • DBaaS(DataBase即服務) 提供者,如 MicrosoftAzureSQL、AWSRelationalDatabaseService(RDS)、Google BigQuery、MongoDB Atlas,可以為 DApp 提供資料庫服務儲存。


一個確保鏈下資料安全不可更改的常見設計實踐是:將鏈下檔案資料的雜湊值儲存在鏈上智慧合約。

總之,DApp 比大多數 Web 應用更復雜。從一開始,你需要設計程式的哪一部分是基於區塊鏈智慧合約,哪一部分利用鏈下伺服器端資料,哪一部分是客戶端 UI。以上每一個部分都需要一組軟體棧來執行,並與應用的其他部分進行互動。


Happy coding!

Michael Yuan 博士,CyberMiles 基金會聯合創始人&首席科學家。畢業於美國德克薩斯大學奧斯汀分校,獲天體物理學博士學位。


Michael 在開源軟體開發方面擁有豐富經驗,曾參與火狐瀏覽器、Fedora 和 JBoss 等專案,也是多項美國政府支援研究專案的負責人。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;