摘要:首先我們需要要記住,以太坊是由共享同一份數據的相同拷貝的節點構成的。你可以運行你自己的以太坊節點來作為。在你部署智能合約以后,它將獲得一個以太坊上的永久地址。如果你還記得第二課,在以太坊上的地址是。
通過前邊的學習,DApp 的 Solidity 合約部分就完成了?,F在我們來做一個基本的網頁好讓你的用戶能玩它。 要做到這一點,我們將使用以太坊基金發布的 JavaScript 庫 —— Web3.js.一、Web3.js簡介 什么是 Web3.js?
還記得么?以太坊網絡是由節點組成的,每一個節點都包含了區塊鏈的一份拷貝。當你想要調用一份智能合約的一個方法,你需要從其中一個節點中查找并告訴它:
1、智能合約的地址
2、你想調用的方法,以及
3、你想傳入那個方法的參數
以太坊節點只能識別一種叫做 JSON-RPC 的語言。這種語言直接讀起來并不好懂。當你你想調用一個合約的方法的時候,需要發送的查詢語句將會是這樣的:
// 哈……祝你寫所有這樣的函數調用的時候都一次通過 // 往右邊拉…… ==> {"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xb60e8dd61c5d32be8058bb8eb970870f07233155","to":"0xd46e8dd67c5d32be8058bb8eb970870f07244567","gas":"0x76c0","gasPrice":"0x9184e72a000","value":"0x9184e72a","data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],"id":1}
幸運的是 Web3.js 把這些令人討厭的查詢語句都隱藏起來了, 所以你只需要與方便易懂的 JavaScript 界面進行交互即可。
你不需要構建上面的查詢語句,在你的代碼中調用一個函數看起來將是這樣:
CryptoZombies.methods.createRandomZombie("Vitalik Nakamoto") .send({ from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", gas: "3000000" })
我們將在接下來的幾章詳細解釋這些語句,不過首先我們來把 Web3.js 環境搭建起來
準備工作取決于你的項目工作流程和你的愛好,你可以用一些常用工具把 Web3.js 添加進來:
// 用 NPM npm install web3 // 用 Yarn yarn add web3 // 用 Bower bower install web3 // ...或者其他。
甚至,你可以從 github直接下載壓縮后的 .js 文件 然后包含到你的項目文件中:
因為我們不想讓你花太多在項目環境搭建上,在本教程中我們將使用上面的 script 標簽來將 Web3.js 引入。
實戰演練新建一個HTML 項目空殼 —— index.html。假設在和 index.html 同個文件夾里有一份 web3.min.js
使用上面的 script 標簽代碼把 web3.js 添加進去以備接下來使用。
index.html
二、Web3提供者CryptoZombies front-end
現在我們的項目中有了Web3.js, 來初始化它然后和區塊鏈對話吧。
首先我們需要 Web3 Provider.
要記住,以太坊是由共享同一份數據的相同拷貝的 節點 構成的。 在 Web3.js 里設置 Web3 的 Provider(提供者) 告訴我們的代碼應該和 哪個節點 交互來處理我們的讀寫。這就好像在傳統的 Web 應用程序中為你的 API 調用設置遠程 Web 服務器的網址。
你可以運行你自己的以太坊節點來作為 Provider。 不過,有一個第三方的服務,可以讓你的生活變得輕松點,讓你不必為了給你的用戶提供DApp而維護一個以太坊節點— Infura.
InfuraInfura 是一個服務,它維護了很多以太坊節點并提供了一個緩存層來實現高速讀取。你可以用他們的 API 來免費訪問這個服務。 用 Infura 作為節點提供者,你可以不用自己運營節點就能很可靠地向以太坊發送、接收信息。
你可以通過這樣把 Infura 作為你的 Web3 節點提供者:
var web3 = new Web3(new Web3.providers.WebsocketProvider("wss://mainnet.infura.io/ws"));
不過,因為我們的 DApp 將被很多人使用,這些用戶不單會從區塊鏈讀取信息,還會向區塊鏈 寫 入信息,我們需要用一個方法讓用戶可以用他們的私鑰給事務簽名。
注意: 以太坊 (以及通常意義上的 blockchains )使用一個公鑰/私鑰對來對給事務做數字簽名。把它想成一個數字簽名的異常安全的密碼。這樣當我修改區塊鏈上的數據的時候,我可以用我的公鑰來 證明 我就是簽名的那個。但是因為沒人知道我的私鑰,所以沒人能偽造我的事務。
加密學非常復雜,所以除非你是個專家并且的確知道自己在做什么,你最好不要在你應用的前端中管理你用戶的私鑰。
不過幸運的是,你并不需要,已經有可以幫你處理這件事的服務了: Metamask.
MetamaskMetamask 是 Chrome 和 Firefox 的瀏覽器擴展, 它能讓用戶安全地維護他們的以太坊賬戶和私鑰, 并用他們的賬戶和使用 Web3.js 的網站互動(如果你還沒用過它,你肯定會想去安裝的——這樣你的瀏覽器就能使用 Web3.js 了,然后你就可以和任何與以太坊區塊鏈通信的網站交互了)
作為開發者,如果你想讓用戶從他們的瀏覽器里通過網站和你的DApp交互(就像我們在 CryptoZombies 游戲里一樣),你肯定會想要兼容 Metamask 的。
注意: Metamask 默認使用 Infura 的服務器做為 web3 提供者。 就像我們上面做的那樣。不過它還為用戶提供了選擇他們自己 Web3 提供者的選項。所以使用 Metamask 的 web3 提供者,你就給了用戶選擇權,而自己無需操心這一塊。使用Metamask的web3提供者
Metamask 把它的 web3 提供者注入到瀏覽器的全局 JavaScript對象web3中。所以你的應用可以檢查 web3 是否存在。若存在就使用 web3.currentProvider 作為它的提供者。
這里是一些 Metamask 提供的示例代碼,用來檢查用戶是否安裝了MetaMask,如果沒有安裝就告訴用戶需要安裝MetaMask來使用我們的應用。
window.addEventListener("load", function() { // 檢查web3是否已經注入到(Mist/MetaMask) if (typeof web3 !== "undefined") { // 使用 Mist/MetaMask 的提供者 web3js = new Web3(web3.currentProvider); } else { // 處理用戶沒安裝的情況, 比如顯示一個消息 // 告訴他們要安裝 MetaMask 來使用我們的應用 } // 現在你可以啟動你的應用并自由訪問 Web3.js: startApp() })
你可以在你所有的應用中使用這段樣板代碼,好檢查用戶是否安裝以及告訴用戶安裝 MetaMask。
注意: 除了MetaMask,你的用戶也可能在使用其他他的私鑰管理應用,比如 Mist 瀏覽器。不過,它們都實現了相同的模式來注入 web3 變量。所以我這里描述的方法對兩者是通用的。實戰演練
我們在HTML文件中的
標簽前面放置了一個空的 script 標簽??梢园堰@節課的 JavaScript 代碼寫在里面。
把上面用來檢測 MetaMask 是否安裝的模板代碼粘貼進來。請粘貼到以 window.addEventListener 開頭的代碼塊中。
index.html
CryptoZombies front-end