7.4 為投注合約建立客戶端
為了方便發現比賽ID以及部署和投資合約,需要建立一個UI客戶端。先來建立一個客戶端,它有兩個路徑,即home路 徑(用於部署合約和投注比賽)和other路徑(用於發現比賽列表)。我們將允許使用者使用離線賬戶進行部署和押注,這樣投注的整個過程就是去中心化的,無 法作弊。
在開始建立客戶端之前,確保同步測試網,因為Oraclize只在以太坊的測試網/主網上工作,不在私有網路上工作。可以跳轉到測試網,下載測試網區塊鏈,用--testnet選項替換--dev選項,例如:
7.4.1 專案結構
在本章的練習檔案中,使用者將發現Final和Initial兩個目錄。Final包含專案的最終原始碼,而Initial包含可用於迅速建立應用的空的原始碼檔案和庫。
為了測試Final目錄,需要在其中執行npm install。然後,使用Final目錄中的node app.js命令執行該應用。
在Initial目錄中,使用者將發現一個public目錄和兩個檔案(app.js和package.json)。package.json包含應用後端的相關內容,把應用後端的原始碼放在app.js裡。
public目錄包含與前端相關的檔案。在public/css中會發現bootstrap.min.css,它是 Bootstrap庫;在public/html中會發現index.html,把應用的HTML程式碼放在這裡;在public/js目錄中會發現 web3.js和ethereumjs-tx的.js檔案;在public/js中還會發現一個main.js檔案,把應用的前端JS程式碼放在這裡。使用者 還將發現用於加密查詢的Oraclize Python工具。
7.4.2 建立後端
先來建立App後端。首先在Initial目錄中執行npm install,安裝後端所需的相關內容。
如下後端程式碼用於執行快捷服務並用於index.html檔案和靜態檔案,並設定試圖引擎(view engine):
上述程式程式碼無須解釋說明。應用將出現一個新的頁面,顯示最近比賽的列表,包括比賽ID和結果(如果比賽結束了)。相關程式碼如下:
這裡發出API請求以抓取最近比賽的列表,然後把結果傳送給matches.ejs檔案,這樣它可以在使用者友好的UI 中展示結果。API結果將比賽開始時間作為時間戳,因此需要時間把它轉換為人類可以閱讀的格式。我們從後端(而不是前端)發出這個請求,這樣不會把API key暴露給使用者。
後端將給前端提供一個API,以供前端在部署合約之前加密查詢。應用不會提示使用者建立API key,因為這是一個不好的UX實踐。應用開發者控制API key不會造成危害,因為開發者不能修改來自API服務端的結果,因此,即使應用開發者知道了API key,使用者仍將信任該App。
加密的相關程式碼如下:
我們學習瞭如何使用這個工具。為了成功執行,應先在系統中安裝Python。即使已經安裝了Python,也可能會顯示錯誤,表示沒有安裝Python的cryptography和base58模組。所以如果工具有提示,就要確保安裝這些模組。
7.4.3 建立前端
現在開始建立App前端。前端將允許使用者看到近期比賽的列表、部署投注合約以及押注一場比賽,並讓他們看到關於投注合約的資訊。
首先實現matches.ejs檔案,它將顯示近期比賽的列表。
執行過程如下:
1)分別在投注合約ByteCode和投注合約ABI變數中儲存合約、位元組碼和ABI。
2)建立一個Web3例項,它連線到測試網節點。
3)定義getAJAXobject函式(一個跨瀏覽器相容的函式),它返回一個AJAX物件。
4)向第一張表新增submit事件監聽器(event listener),用於部署合約。在事件監聽器的回撥函式中,通過傳送matchId向getURL終點發出請求,獲得加密的查詢字串。然後生成資料 部署合約。接著找出gasRequired。使用函式物件的estimateGas方法計算所需的gas,也可以使用 web3.eth.estimateGas方法(它們的實參不同),即在前面的方法裡不需要傳送交易資料。記住,如果函式呼叫引發異 常,estimateGas將返回區塊gas上限。隨後計算隨機數。這裡使用getTransactionCount方法,而非我們之前學習的實際過程。 這樣做是為了簡化程式碼。最後建立原始交易,簽名並廣播。一旦挖出交易,就顯示合約地址。
5)接下來向第二張表新增submit事件監聽器,用於投注合約。這裡生成交易的資料部分,計算所需的gas,建立原 始交易,簽名並廣播。在計算交易所需的gas時,從賬戶地址和value物件屬性傳送合約地址,因為它是函式呼叫,而且gas隨著value、from地 址和合約地址的變化而變化。記住,在計算合約函式呼叫所需的gas時,可以傳送to、from和value屬性,因為gas取決於這些數值。
7.4.4 測試客戶端
至此,建立投注平臺的操作就完成了,下面開始進行測試。測試之前,應確保測試網區塊鏈已經被完全下載,並在尋找新進入的區塊。
使用之前建立的錢包服務,生成三個賬戶。用http://faucet.ropsten.be:3001/ 在每個賬戶中新增一個以太幣。
然後在Initial目錄中執行node app.js,接著訪問http://localhost:8080/matches ,即可看到圖7-1所示的介面。
這裡可以複製任何比賽ID。如果想測試第一場比賽(即123945),那麼訪問http://localhost:8080 ,將會看到圖7-2所示的介面。
圖 7-1
圖 7-2
現在部署合約,填好第一個表的輸入欄,單擊Deploy按鈕,如圖7-3所示。使用第一個賬戶部署合約。
圖 7-3
現在用第二個賬戶押注主隊,用第三個賬戶押注客隊,介面如圖7-4所示。
圖 7-4
現在把合約地址輸入第三張表,單擊Find按鈕檢視合約細節,就會看到與圖7-5所示類似的介面。
圖 7-5
一旦挖出兩個交易,再次稽核合約細節,即可看到與圖7-6所示類似的介面。
圖 7-6
可以看到,合約沒有任何以太幣,以太幣都被轉到賭主隊贏的賬戶裡了。
來源:我是碼農,轉載請保留出處和連結!
本文連結:http://www.54manong.com/?id=546
相關文章
- Nacos - 客戶端心跳續約及客戶端總結客戶端
- 如何建立NEO輕客戶端客戶端
- 使用 Webix 建立 Email 客戶端WebAI客戶端
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- C#之使用CefSharp建立客戶端C#客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端
- Laravel後臺作為客戶端,socket.io作為服務端,App或其他作為另一個客戶端Laravel客戶端服務端APP
- 【新特性速遞】表格的客戶端合計客戶端
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- 如果呼叫遠端遠端url介面為https,且存在客戶端證書驗證,如何在客戶端處理HTTP客戶端
- Fabric1.4原始碼解析:客戶端建立通道過程原始碼客戶端
- 在.NET 6 中如何建立和使用 HTTP 客戶端 SDKHTTP客戶端
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- java websocket 客戶端JavaWeb客戶端
- redis客戶端管理Redis客戶端
- iscsi linux客戶端Linux客戶端
- Zookeeper 客戶端 API客戶端API
- 客戶端加解密客戶端解密
- Tower:GIt客戶端Git客戶端
- YouTube macYouTube客戶端Mac客戶端
- Redis-客戶端Redis客戶端
- 客戶端筆記客戶端筆記
- 一款功能簡約到可憐的SQL 客戶端SQL客戶端
- 以客戶端為中心的錯誤處理客戶端
- ftp客戶端,ftp客戶端軟體具體怎麼使用?FTP客戶端
- bilibili mac客戶端 嗶哩嗶哩 b站mac客戶端Mac客戶端
- ASP.NET Core 中建立 gRPC 客戶端和伺服器ASP.NETRPC客戶端伺服器
- Ascend2:為潛在客戶轉化建立關係
- VNC客戶端推薦,Windows系統下VNC客戶端推薦VNC客戶端Windows
- VNC客戶端是Windows,VNC客戶端是Windows如何進行操作VNC客戶端Windows
- 基於CFSSL工具建立CA證書,服務端證書,客戶端證書服務端客戶端
- 如何安裝和配置 Chrony 作為 NTP 客戶端?客戶端
- Spring RestTemplate作為負載平衡器客戶端SpringREST負載客戶端