banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

以太坊之DApp開發實戰

什麼是 DApp(去中心化應用)#

目前常見的 Web 應用如微博、豆瓣、百度都是基於客戶端 - 伺服器的模式,所有的資源都由中心伺服器控制。以訪問微博為例,在瀏覽器中輸入 www.weibo.com 這個 URL 地址,由 DNS 伺服器解析 URL 並返回微博伺服器的 IP 地址給瀏覽器,瀏覽器通過這個 IP 地址發送請求給微博伺服器,微博伺服器將對應的內容返回給瀏覽器,瀏覽器收到內容後展示返回結果給用戶。這一過程中微博伺服器發揮著主要作用,客戶端(瀏覽器)只是起到連接伺服器和展示的作用。中心伺服器對客戶端來說是不透明的,客戶端無法知道伺服器端的行為,容易造成個人隱私和數據的洩露,加上中心伺服器運行產生的高額成本最終還是需要用戶承擔,而且一旦中心伺服器出現問題就可能導致整個系統的應用無法正常使用。為了規避中心伺服器的弊端,去中心化應用的概念應運而生。

去中心化應用(Decentralized Application,DApp),是運行在去中心化網絡上的應用。不同於傳統 App 依賴於中心伺服器,DApp 的運行依賴於區塊鏈以及在區塊鏈上的智能合約。目前 DApp 主要基於以太坊、EOS、Steem、TRON 等區塊鏈平台進行開發。另外,DApp 需要在具有錢包功能(詳見 3.2.2 節錢包簡介)的環境中運行。比如基於以太坊開發的 DApp,可以在以太坊瀏覽器 Mist、以太坊客戶端 Parity、手機端瀏覽器 Status,以及安裝有 MetaMask 錢包插件的瀏覽器中運行。

DApp 由智能合約和用戶界面(UI)組成。其中智能合約是運行在區塊鏈上的代碼,負責與區塊鏈交互,而 UI 是由 HTML 和 JavaScript 實現的前端頁面,供用戶進行操作。在以太坊中,用戶界面可以通過 Web3.js 庫對智能合約進行調用,DApp 的結構如圖

image

其中,Mist 和 Parity 等是上面提到的支持 DApp 的錢包。EVM(Ethereum Virtual Machine)以太坊虛擬機,是以太坊中智能合約的運行環境,類似於 Java 虛擬機(JVM)用於執行 Java 程序,EVM 用來執行智能合約。在 DApp 運行的過程中可能需要消耗以太坊上的加密數字貨幣 —— 以太幣。由於以太幣的價格變動較大,為了保證執行費用相對穩定,以太坊上使用了另一個計量單位,叫作 Gas。所以在 DApp 的開發過程中提到 Gas 這個詞時,它指代的就是以太幣。HTML 和 JavaScript 就是開發網頁的語言,Web3.js 是以太坊提供的一個 JavaScript 庫,它封裝了以太坊的 JSON RPC API,提供了一系列與區塊鏈交互的 JavaScript 對象和函數,包括查看網絡狀態、查看本地賬戶、查看交易和區塊、發送交易、編譯 / 部署智能合約以及調用智能合約等,其中最重要的是與智能合約交互的 API。

DApp 的特點#

與常見的中心化應用不同,DApp 通常具有以下特點。

●公開透明、去信任。DApp 底層一般依賴於區塊鏈技術,其數據也和區塊鏈一樣具有公開透明、去信任的特點。

●無中心故障點。由於 DApp 是去中心化的,沒有中心伺服器,故不會由於單個結點的故障導致應用無法正常運行。

●共識機制。在中心化應用中,數據的更新和生效都是由中心伺服器決定的。而運行於區塊鏈技術之上的 DApp,整個區塊鏈中所有結點根據共識機制共同決定哪些數據有效,哪些數據無效,單個結點無法讓數據在整個區塊鏈中更新生效。

●獎勵機制。在區塊鏈中,整個系統是由所有結點一起生成和維護的。在 DApp 中也是如此,所以運行 DApp 還能獲得一定的加密數字貨幣獎勵。

知名的 DApp#

基於這些特點,開發者們在以太坊上創建了大量的 DApp。這裡列舉幾個比較知名且應用比較廣泛的 DApp,如 Augur、Golem 和 Aragon。

1.Augur

Augur 可以被視為一個去中心化的市場預測平台,允許用戶對潛在交易的收益進行預測。與現實世界中的專家預測相比,Augur 利用的是 “人群的智慧” 來進行真實世界事件的預測,有時該應用程序預測的結果比專家的預測更為準確。用戶在對事件做出正確預測時,平台會給予一定獎勵。此外,市場創建者、報告事件的用戶也會得到一定報酬,Augur 的官網首頁如圖 5-2 所示。

2.Golem

Golem 利用計算機和數據中心,創建能夠對外出租的超級計算機,全球任何人都可以申請租用。該項目不依賴任何中央伺服器群,而是將計算負荷分配至願意出租其計算機進行工作的 “提供商”。這些提供商通過共享計算機資源,以換取加密數字貨幣獎勵。與集中式的項目相比,Golem 這種分佈式的算力提供方式計算速度更快,費用更低。Golem 的官網首頁如圖所示。

3.Aragon

Aragon 是以太坊上的一個應用,用來管理去中心化的自治組織。它允許用戶創建和管理一個去中心化組織,由 Aragon 基金會管理。創建該平台是為了構建和管理 DAO(去中心化自治組織),該應用可以通過加密數字貨幣來投票決定產品的未來發展方向。Aragon 的去中心化特性可用於任何組織或公司,甚至是非營利的基金會,它實現了股東名冊、代幣轉帳、投票、職位任命、融資、會計等組織機構的基礎功能。在 Aragon 上創建的組織的行為可以通過修改章程來自定義。另外,Aragon 還可以通過智能合約擴展其他需要的功能。Aragon 的官網首頁。

DApp 的應用還有很多,用途日趨廣泛、發展潛力巨大,掌握 DApp 的開發能力非常有價值。接下來就開始學習 DApp 的開發。首先是智能合約的開發及使用。

以太坊有基於 Python、Go、C++、Java 等多種語言的版本。不管基於什麼語言開發,以太坊區塊鏈架構都是由核心庫、通訊庫和客戶端三大部分組成。

●核心庫:核心庫的主要功能是區塊鏈、EVM(以太坊虛擬機)以及共識機制的實現。其中 Python 版本的核心庫對應的程序為 pyethereum,Go 語言版本對應的是 go-ethereum,C++ 版本對應的是 cpp-ethereum,Java 版本對應的是 ethereumj。

●通訊庫:通訊庫是一個 P2P 的網絡庫,主要功能是實現結點間的發現、連接和數據同步,實現去中心化網絡中的數據傳輸服務。Python 版本對應的通訊庫程序為 pydevp2p,而 Go 語言版本的通訊庫已經打包到了 go-ethereum 的 P2P 模塊之中。

●客戶端:客戶端的作用是連接到以太坊並與之進行交互,包括獲取以太坊區塊鏈網絡的數據,向網絡上發送交易、部署合約甚至編譯智能合約等。客戶端通過 JSONRPC 對外開放端口保持監聽,在收到消息後進行相應的操作。Python 版本客戶端對應的程序為 pyethapp,默認監聽 4000 端口;Go 語言對應的程序為 geth,默認監聽 8545 端口。

這裡要搭建的智能合約開發環境,其實就是選擇一個合適的客戶端連接到以太坊網絡中,由於在以太坊公鏈上做操作需要消耗以太幣(ETH),成本不低,所以對於開發者來說,很有必要在本地自行搭建一個以太坊區塊鏈網絡的測試環境進行開發。

本地以太坊環境的搭建#

以太坊社區已經提供了一系列工具幫助開發者快速搭建一套本地的以太坊開發環境。這裡選擇 Ganache(之前叫 testRPC)搭建本地以太坊測試環境。

發的 DApp 是如何運作的以及以太坊的狀態變化,包括查看賬戶餘額、合約及 Gas 成本。可以調整 Ganache 的採礦控制來更好地適應自己開發的 DApp。Ganache 的安裝步驟如下。

首先下載並安裝 Ganache。Ganache 的下載地址是https://truffleframework.org/ganache/,Ganache 的首頁。

選擇與自己的操作系統對應的版本下載 Ganache 軟件安裝包,下載完成後雙擊打開安裝包進行安裝即可。依照提示順序安裝完成後,雙擊打開生成的 Ganache 圖標可以看到 Ganache 的圖形化的主界面,如圖所示。

image

如圖所示,Ganache 主界面上有 4 個標籤,依次為賬戶信息、區塊信息、交易信息和日誌信息。Ganache 啟動後會監聽在本地的 7545 端口,並自動創建 10 個測試賬號,每個測試賬號均有 100 個以太幣供測試開發。單擊 “BLOCKS” 圖標切換到區塊信息,可以看到當前區塊鏈只有一個區塊,即創世區塊,如圖所示。

2. 安裝和使用以太坊錢包#

這裡使用插件 MetaMask 作為以太坊錢包。MetaMask 是一款瀏覽器中使用的、插件類型的以太坊數字錢包,該錢包不需要下載,只需要在瀏覽器添加對應的擴展程序即可,使用起來非常方便(目前支持火狐瀏覽器和谷歌瀏覽器)。可訪問 MetaMask 官網進行安裝,在瀏覽器中輸入網址:https://metamask.io/,打開 MetaMask 的官網首頁。

進入 MetaMask 官網首頁後單擊獲取插件即可跳轉到對應瀏覽器的插件庫中進行安裝。安裝完成後可以在瀏覽器上看到 MetaMask 的狐狸圖標,單擊該圖標打開 MetaMask。第 1 次使用時會出一個隱私提示,選擇 “Accept” 接受條款,進入登錄頁面,如圖 5-11 所示。

這裡有兩個入口,第 1 個入口是創建新的 DEN——CREATE 按鈕(DEN 是在 MetaMask 用密碼加密存儲的錢包格式),第 2 個入口是導入已有的 DEN——Import Existing DEN 鏈接。這裡以創建新的 DEN 為例,在上面的密碼框輸入密碼,並在下面一行輸入框中再次輸入進行確認,然後單擊 “CREATE” 按鈕,就成功創建了一個 MetaMask 錢包。MetaMask 會默認為用戶創建 12 個英文助記詞,這些助記詞一定要保存好,建議複製保存到安全的地方,助記詞是確認錢包賬戶所有者的憑證,在其他錢包導入這個新創建的賬戶時或者修改時有可能要用到這些助記詞。也可以直接單擊 “SAVE SEED WORDS AS FILE” 按鈕,會自動生成一份助記詞文件保存在本地。單擊 “I'VE COPYED SOMEWHERE SAFE” 按鈕就進入 MetaMask 的主界面。

進入主界面後,可以單擊右上角的圖標進行登出、切換賬戶、創建賬戶、導入賬戶和其他設置,如圖所示。

image

MetaMask 的主界面

MetaMask 自動為用戶創建了一個錢包地址,錢包餘額為 0 個以太幣,單擊賬戶左側的菜單按鈕,可以看到账戶的詳細信息和地址,如圖 5-13 所示。

MetaMask 默認連接的是以太坊的主網絡,這裡把網絡切換到 Ganache 的本地網絡。單擊 MetaMask 頁面頂端 Main Etherum Network 右邊的下拉按鈕,選擇 “Custom RPC” 選項,如圖 5-14 所示。

在新彈出的界面中輸入本地 RPC 地址http://127.0.0.1:7545,然後單擊 “Save” 按鈕,如圖 5 所示。此時已連接到本地的以太坊測試環境。

image

切換到 Ganache 的賬戶界面,單擊賬戶後面的鑰匙圖標,可以看到該賬戶的私鑰信息。

image

image

將上述私鑰複製下來,再次打開 MetaMask,選擇 “Import Account”,如圖所示將剛複製的私鑰粘貼到私鑰的輸入框中,如圖 5-19 所示。導入成功後即切換到新的賬戶 Account 3,新的賬戶有 100 個以太幣,如圖所示。

至此,以太坊的測試環境搭建完成。下面即可開始智能合約的開發。

智能合約的開發可以使用多種語言,如 Solidity(語法類似 JavaScript)、Serpernt(語法類似 Python)、LLL(語法類似 Lisp)等。其中現在最流行的是 Solidity,Solidity 是智能合約官方編程語言,所以,接下來用 Solidity 語言進行智能合約的開發。

image

Solidity 是一種用於編寫智能合約的高級語言,運行在以太坊虛擬機(EVM)上。它的語法接近於 JavaScript,是一種面向對象的語言。熟悉 JavaScript 的讀者應該可以很快學會。下面對 Solidity 的基本語法進行講解。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。