以太坊 DApp 開發入門實戰! 用Node.js和truffle架構搭建——區塊鏈投票系統!

來源:互聯網
上載者:User

標籤:以太坊   區塊鏈   Node.js   truffle   DApp   

第一節 概述

面向初學者,內容涵蓋以太坊開發相關的基本概念,並將手把手地教大家如何構建一個 基於以太坊的完整去中心化應用 —— 區塊鏈投票系統。

通過學習,你將掌握:

  • 以太坊區塊鏈的基本知識

  • 開發和部署以太坊合約所需的軟體環境

  • 使用進階語言(solidity)編寫以太坊合約

  • 使用NodeJS編譯、部署合約並與之互動

  • 使用Truffle架構開發分布式應用

  • 使用控制台或網頁與合約進行互動

前序知識要求

為了順利完成,最好對以下技術已經有一些基本瞭解:

  • 一種物件導向的開發語言,例如:Python,Ruby,Java...

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

  • Linxu命令列的使用

  • 資料庫的基本概念

所有代碼均已在Ubuntu(Trusty、Xenial)和 macOS 上測試過。

第二節 簡介

我們將會構建一個去中心化的(Decentralized)投票應用。利用這個投票應用, 使用者可以在不可信(trustless)的分布環境中對特定候選人投票,每次投票都會被記錄在區塊 鏈上:

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

基於區塊鏈的投票是完全去中心化的,因此無須任何中心化機構的存在。

第三節 開發迭代

將涵蓋應用開發的整個過程,我們將通過三次迭代來漸進地引入區塊鏈應用 開發所涉及的相關概念、語言和工具:

  • Vanilla:在第一個迭代周期,我們不藉助任何開發架構,而僅僅使用NodeJS來進行應用開發, 這有助於我們更好地理解區塊鏈應用的核心理念。

  • Truffle:在第二個迭代周期,我們將使用最流行的去中心化應用開發架構Truffle進行開發。 使用開發架構有助於我們提高開發效率。

  • Token:在第三個迭代周期,我們將為投票應用引入代幣(Token) —— 現在大家都改口 稱之為通證了 —— 都是ICO惹的禍。代幣是公鏈上不可或缺的激勵機制,也是區塊鏈 應用區別於傳統的中心化應用的另一個顯著特徵。

為什麼選擇投票應用作為課程項目?

之所以選擇投票作為我們的第一個區塊鏈應用,是因為集體決策 —— 尤其是投票機制 —— 是以太坊的 一個核心的價值主張。

另一個原因在於,投票是很多複雜的去中心化應用的基礎構件,所以我們選擇了投票應用作為學習區塊鏈 應用開發的第一個項目。

第四節 初識區塊鏈

如果你熟悉關係型資料庫,就應該知道一張資料表裡可以包含很多行資料記錄。例如,下面的資料表中 包含了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存取碼。注意在這種架構中,總是存在一個(或一組)中心化的 網頁伺服器,所有的用戶端都需要 與這一(組)伺服器進行互動。當一個用戶端向伺服器發出請求時,伺服器處理該請求,與資料庫/緩衝進行互動, 讀/寫/更新資料庫,然後向用戶端返迴響應。

這是我們熟悉的中心化架構。在下一節,我們將會看到基於區塊鏈的去中心化架構的一些顯著區別。

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

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

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

在一個理想的去中心化環境中,每個想要跟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 等)中直接引入該庫來構建去中心化應用:

以太坊 DApp 開發入門實戰! 用Node.js和truffle架構搭建——區塊鏈投票系統!

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.