以太坊開發DApp入門教程——區塊鏈投票系統(一)

概述前端

對初學者,首先要了解以太坊開發相關的基本概念。react

 

學習以太坊開發的通常前序知識要求,最好對如下技術已經有一些基本瞭解:angularjs

  • 一種面向對象的開發語言,例如:Python,Ruby,Java...web

  • 前端開發語言:HTML/CSS/JavaScript算法

  • Linxu命令行的使用數據庫

  • 數據庫的基本概念瀏覽器

項目簡介緩存

咱們構建一個去中心化的(Decentralized)投票應用。利用這個投票應用, 用戶能夠在不可信(trustless)的分佈環境中對特定候選人投票,每次投票都會被記錄在區塊 鏈上:安全

 
所謂去中心化應用( DApp:Dcentralized Application),就是一個不存在中心服務器 的應用。在網絡中成百上千的電腦上,均可以運行該應用的副本,這使得它幾乎不可能 出現宕機的狀況。

基於區塊鏈的投票是徹底去中心化的,所以無須任何中心化機構的存在。服務器

 

之因此選擇投票做爲咱們的第一個區塊鏈應用,是由於集體決策 —— 尤爲是投票機制 —— 是以太坊的 一個核心的價值主張。

另外一個緣由在於,投票是不少複雜的去中心化應用的基礎構件,因此咱們選擇了投票應用做爲學習區塊鏈 應用開發的第一個項目。

 

初識區塊鏈

若是你熟悉關係型數據庫,就應該知道一張數據表裏能夠包含不少行數據記錄。例如,下面的數據表中 包含了6條交易記錄:

 
 

本質上,區塊鏈首先就是一個分佈式(Distributed)數據庫,這個數據庫維護了一個不斷增加的記錄列表。 如今,讓咱們對數據進行批量(batch)存儲,好比每批 100 行,並將各存儲批次鏈接起來,是否是就像一條鏈?

 
在區塊鏈裏,多個數據記錄組成的批次就被稱爲塊( block),塊裏的每一行數據記錄就被稱爲交易( transaction):
 
 

最開始的那個塊,一般被稱爲創世塊(genesis block),它不指向任何其餘塊。

不可篡改性

區塊鏈的一個顯著特色是,數據一旦寫入鏈中,就不可篡改重寫。

在傳統的關係型數據庫中,你能夠很容易地更新一條數據記錄。可是,在區塊鏈中,一旦數據寫入就沒法 再更新了 —— 所以,區塊鏈是一直增加的。

那麼,區塊鏈是如何實現數據的不可篡改特性?

這首先得益於哈希(Hash)函數 —— 若是你還沒接觸過哈希函數,不妨將它視爲一個數字指紋的計算函數: 輸入任意長度的內容,輸出定長的碼流(指紋)。哈希函數的一個重要特性就是,輸入的任何一點微小變化,都會 致使輸出的改變。所以能夠將哈希值做爲內容的指紋來使用。 

因爲區塊鏈裏的每一個塊都存儲有前一個塊內容的哈希值,所以若是有任何塊的內容被篡改,被篡改的塊以後 全部塊的哈希值也會隨之改變,這樣咱們就很容易檢測出區塊鏈的各塊是否被篡改了。

去中心化的挑戰

一旦徹底去中心化,在網絡上就會存在大量的區塊鏈副本(即:全節點),不少事情都會變得比以前中心化 應用環境複雜的多,例如:

  • 如何保證全部副本都已同步到最新狀態?

  • 如何保證全部交易都被廣播到全部運行和維護區塊鏈副本的節點計算機上?

  • 如何防止惡意參與者篡改區塊鏈

  • ......

經過與經典的C/S架構的對比,咱們將逐步理解去中心化應用的核心思路, 並掌握如何構建以太坊上的去中心化應用。

C/S架構以服務器爲中心

理解去中心化應用架構的最好方法,就是將它與熟悉的Client/Server架構進行對比。若是你是一個web開發者, 應該對下圖很瞭解,這是一個典型的Client/Server架構:

 
 

一個典型web應用的服務端一般由 Java,Ruby,Python 等等語言實現。前端代碼由 HTML/CSS/JavaScript 實現。 而後將整個應用託管在雲端,好比 AWS、Google Cloud Platform、Heroku....,或者放在你租用的一個VPS 主機上。

用戶經過客戶端(Client)與 web 應用(Server)進行交互。典型的客戶端包括瀏覽器、命令行工具(curlwget等)、 或者是API訪問代碼。注意在這種架構中,老是存在一個(或一組)中心化的 web 服務器,全部的客戶端都須要 與這一(組)服務器進行交互。當一個客戶端向服務器發出請求時,服務器處理該請求,與數據庫/緩存進行交互, 讀/寫/更新數據庫,而後向客戶端返回響應。

這是咱們熟悉的中心化架構。

去中心化架構——彼此平等的節點

下圖給出了基於以太坊的去中心化應用架構:

 
 

你應該已經注意到,每一個客戶端(瀏覽器)都是與各自的節點應用實例進行交互,而不是向 一箇中心化的服務器請求服務。

在一個理想的去中心化環境中,每一個想要跟DApp交互的人,都須要在他們的計算機或手機上面運行 一個的完整區塊鏈節點 —— 簡言之,每一個人都運行一個全節點。這意味着,在可以真正使用一個 去中心化應用以前,用戶不得不下載整個區塊鏈。

不過咱們並不是生活在一個烏托邦裏,期待每一個用戶都先運行一個全節點,而後再使用你的應用是不現實的。 可是去中心化背後的核心思想,就是不依賴於中心化的服務器。因此,區塊鏈社區已經出現了 一些解決方案,例如提供公共區塊鏈節點的Infura, 以及瀏覽器插件Metamask等。經過這些方案, 你就不須要花費大量的硬盤、內存和時間去下載並運行完整的區塊鏈節點,同時也能夠利用去中心化 的優勢。咱們將會之後的課程中對這些解決方案分別進行評測。

以太坊——世界計算機

以太坊是一種區塊鏈的實現。在以太坊網絡中,衆多的節點彼此鏈接,構成了以太坊網絡:

 
 

以太坊節點軟件提供兩個核心功能:數據存儲、合約代碼執行。

在每一個以太坊全節點中,都保存有完整的區塊鏈數據。以太坊不只將交易數據保存在鏈上,編譯後 的合約代碼一樣也保存在鏈上。

以太坊全節點中,同時還提供了一個虛擬機來執行合約代碼。

交易數據

以太坊中每筆交易都存儲在區塊鏈上。當你部署合約時,一次部署就是一筆交易。當你爲候選者投票時,一次投票 又是另外一筆交易。全部的這些交易都是公開的,每一個人均可以看到並進行驗證。這個數據永遠也沒法篡改。

爲了確保網絡中的全部節點都有着同一份數據拷貝,而且沒有向數據庫中寫入任何無效數據,以太坊 目前使用工做量證實 (POW:Proof Of Work)算法來保證網絡安全,即經過礦工挖礦(Mining)來達成共識(Consensus)—— 將數據同步到全部節點。

工做量證實不是達成共識的惟一算法,挖礦也不是區塊鏈的惟一選擇。如今,咱們只須要了解,共識是指各節點 的數據實現了一致,POW只是衆多用於創建共識的算法中的一種,這種算法須要經過礦工的挖礦來實現非可信環境下的 可信交易。共識是目的,POW是手段。

合約代碼

以太坊不只僅在鏈上存儲交易數據,它還能夠在鏈上存儲合約代碼。

在數據庫層面,區塊鏈的做用就是存儲交易數據。那麼給候選者投票、或者檢索投票結果的邏輯放在哪兒呢? 在以太坊的世界裏,你可使用Solidity語言來編寫業務邏輯/應用代碼(也就是合約:Contract), 而後將合約代碼編譯爲以太坊字節碼,並將字節碼部署到區塊鏈上:

 
 

編寫合約代碼也可使用其餘的語言,不過 Solidity是到目前爲止最流行的選擇。

以太坊虛擬機

以太坊區塊鏈不只存儲數據和代碼,每一個節點中還包含一個虛擬機(EVM:Ethereum Virtual Machine)來執行 合約代碼 —— 聽起來就像計算機操做系統。

事實上,這一點是以太坊區別於比特幣(Bitcoin)的最核心的一點:虛擬機的存在使區塊鏈邁入了2.0 時代,也讓區塊鏈第一次成爲應用開發者友好的平臺。

JS開發庫

爲了便於構建基於web的DApp,以太坊還提供了一個很是方便的JavaScript庫web3.js,它封裝了以太坊節點的API 協議,從而讓開發者能夠輕鬆地鏈接到區塊鏈節點而沒必要編寫繁瑣的RPC協議包。因此,咱們能夠在經常使用的JS框架 (好比 reactjs、angularjs 等)中直接引入該庫來構建去中心化應用:

 
 
本文參考: http://www.dwz.cn/7zBqC2
相關文章
相關標籤/搜索