以太坊Dapp終極教程——如何構建一個完整的全棧去中心化應用(一)

今天,我將向你展現如何在以太坊區塊鏈上構建你的第一個去中心化應用程序或dApp。我將告訴你如何編寫你的第一個以太坊智能合約,咱們將在兩個候選人之間舉行選舉。咱們將針對智能合約編寫測試,將其部署到以太坊區塊鏈,並開發容許賬戶投票的客戶端應用程序。咱們還將研究關鍵概念,如「什麼是區塊鏈?」,「什麼是智能合約?」,以及「dApp如何工做?」。php

什麼是區塊鏈?

讓咱們用一個類比來理解區塊鏈是什麼以及它是如何工做的。咱們來看一個Web應用程序。前端

一般,當你與Web應用程序交互時,你使用Web瀏覽器經過網絡鏈接到中心服務器。此Web應用程序的全部代碼都位於此中心服務器上,而且全部數據都位於中央數據庫中。不管什麼時候與應用程序進行交易,都必須與Web上的此中心服務器進行通訊。java

若是咱們要在網上構建咱們的投票應用程序,咱們會遇到一些問題:node

    1. 能夠更改數據庫上的數據:能夠屢次計數,也能夠徹底刪除。
    1. Web服務器上的源代碼也能夠隨時更改。

咱們不想在網絡上構建咱們的應用程序。咱們但願在區塊鏈上構建它,任何鏈接到網絡的人均可以參與選舉。咱們但願確保他們的投票獲得統計,而且他們只計算一次。那麼讓咱們來看看它是如何工做的。python

區塊鏈不是擁有網絡,中心服務器和數據庫,而是一個網絡和數據庫。區塊鏈是計算機的點對點網絡,稱爲節點,共享網絡中的全部數據和代碼。所以,若是你是鏈接到區塊鏈的設備,則你是網絡中的節點,而且你能夠與網絡中的全部其餘計算機節點進行通訊。你如今擁有區塊鏈上全部數據和代碼的副本。沒有更多的中心服務器。只是一堆在同一網絡上相互通訊的計算機。android

而不是集中式數據庫,區塊鏈中節點之間共享的全部交易數據都包含在稱爲塊的記錄包中,這些記錄捆綁在一塊兒以建立公共分類賬。此公共分類賬表示區塊鏈中的全部數據。公共分類賬中的全部數據都經過加密散列來保護,並經過一致性算法進行驗證。網絡上的節點參與以確保經過網絡分發的全部數據副本是相同的。這是咱們在區塊鏈上構建投票申請的一個很是重要的緣由,由於咱們但願確保咱們的投票獲得計算,而且它沒有改變。程序員

咱們的應用程序用戶對區塊鏈進行投票會是什麼樣子?那麼,對於初學者來講,用戶須要一個帶有錢包地址的賬戶,其中有一些Ether,以太坊的加密貨幣。一旦他們鏈接到網絡,他們就會投票並支付一筆小額交易費用來將此交易寫入區塊鏈。這筆交易費用稱爲gas。不管什麼時候投票,網絡上的一些節點(稱爲礦工)都會競爭完成此交易。完成此交易的礦工將得到咱們付款投票的以太幣。web

做爲回顧,當我投票時,我支付gas價格進行投票,當個人投票被記錄時,網絡上的一臺計算機得到個人以太網費用。我反過來相信個人投票是永遠準確記錄的。算法

因此一樣重要的是要注意,對區塊鏈進行投票會花費以太幣,但只是看到候選人名單沒有。這是由於從區塊鏈中讀取數據是免費的,但寫入區塊鏈則不是。mongodb

什麼是智能合約?

這就是投票過程的工做原理,但咱們如何實際編寫應用程序代碼呢?好吧,以太坊區塊鏈容許咱們使用名爲智能合約的東西在區塊鏈上使用以太坊虛擬機(EVM)執行代碼。

智能合約是咱們應用程序的全部業務邏輯所在。這是咱們實際編寫應用程序去中心化部分的地方。智能合約負責向區塊鏈讀取和寫入數據,以及執行業務邏輯。智能聯繫人使用名爲Solidity的編程語言編寫,看起來很像Javascript。它是一個完整的編程語言,它容許咱們執行Javascript所能提供的許多相同類型的事物,但因爲它的用例,它的行爲有點不一樣,正如咱們在本教程中將看到的那樣。

區塊鏈上智能合約的功能與網絡上的微服務很是類似。若是公共分類賬表示區塊鏈的數據庫層,那麼智能合約就是與該數據進行交易的全部業務邏輯所在的位置。

此外,他們被稱爲智能合約,由於他們表明契約或協議。在咱們的投票dApp的狀況下,這是一項協議,個人投票將被計算,其餘投票只計算一次,而且投票最多的候選人實際上將贏得選舉。

如今讓咱們快速瀏覽一下咱們正在構建的dApp的結構。

咱們將擁有一個用HTML,CSS和Javascript編寫的傳統前端客戶端。該客戶端將鏈接到咱們將安裝的本地以太坊區塊鏈,而不是與後端服務器通訊。咱們將使用Solidity編程語言在選舉智能合約中編寫關於dApp的全部業務邏輯。咱們將這個智能合約部署到咱們當地的Etherum區塊鏈,並容許帳戶開始投票。

如今咱們已經看到了區塊鏈是什麼以及它是如何工做的。咱們已經看到了爲何咱們要在區塊鏈而不是當前的網絡上構建咱們的投票dApp。咱們已經看到,咱們但願經過編寫將部署到以太坊區塊鏈的智能合約來編寫咱們的dApp代碼。如今讓咱們跳進去開始編程吧!

咱們將要構建什麼

如下是咱們將要構建的投票dApp的演示。

咱們將構建一個客戶端應用程序,它將與咱們在區塊鏈上的智能合約進行對話。此客戶端應用程序將有一個候選人表,列出每一個候選人的ID,姓名和投票計數。它將有一個表格,咱們能夠爲咱們想要的候選人投票。它還會在你的賬戶your account下顯示咱們與區塊鏈關聯的賬戶。

安裝依賴項

爲了構建咱們的dApp,咱們首先須要一些依賴項。

節點包管理器(NPM)

咱們須要的第一個依賴是Node Package Manager,或NPM,它隨Node.js一塊兒提供。你能夠經過轉到終端並鍵入如下內容來查看是否已安裝節點:

$ node -v

Truffle框架

下一個依賴是Truffle Framework,它容許咱們在以太坊區塊鏈上構建去中心化的應用程序。它提供了一套工具,容許咱們使用Solidity編程語言編寫智能聯繫人。它還使咱們可以測試咱們的智能合約並將其部署到區塊鏈。它還爲咱們提供了開發客戶端應用程序的空間。

你能夠在命令行中使用NPM安裝Truffle,以下所示:

$ npm install -g truffle

Ganache

下一個依賴項是Ganache,一個本地內存中的區塊鏈。你能夠經過從Truffle Framework網站下載來安裝Ganache。它將爲咱們提供10個外部帳戶,並在咱們當地的以太坊區塊鏈上提供地址。每一個賬戶都預裝了100個假以太坊幣。

Metamask

下一個依賴項是Google Chrome的Metamask擴展。爲了使用區塊鏈,咱們必須鏈接到它(記住,我說塊鏈是一個網絡)。咱們必須安裝一個特殊的瀏覽器擴展才能使用以太坊區塊鏈。這就是metamask的用武之地。咱們將可以經過咱們的我的帳戶鏈接到咱們當地的以太坊區塊鏈,並與咱們的智能合約進行互動。

咱們將在本教程中使用Metamask chrome擴展,所以若是你尚未安裝Google Chrome瀏覽器,則還須要安裝它。要安裝Metamask,請在Google Chrome網上應用店中搜索Metamask Chrome插件。安裝完成後,請確保在擴展列表中選中它。安裝後,你會在Chrome瀏覽器的右上角看到狐狸圖標。若是卡住了,請參考視頻演示!

語法突出顯示

依賴項是可選的,但建議使用。我建議爲Solidity編程語言安裝語法高亮顯示。大多數文本編輯器和IDE沒有開箱即用的Solidity語法高亮顯示,所以你必須安裝一個軟件包才能支持此功能。我正在使用Sublime Text,我已經下載了Ethereum軟件包,它爲Solidity提供了很好的語法高亮。

Smoke測試 - 第1步

如今咱們已經安裝了依賴項,讓咱們開始構建咱們的dApp!

首先,找到你下載Ganache的地方,而後打開它。如今Ganache啓動了,你有一個本地區塊鏈運行。

Ganache爲咱們提供了10個預裝了100個假以太坊的賬戶(這在主要的以太坊網絡上是不值得的)。每一個賬戶都有一個惟一的地址和一個私鑰。每一個賬戶地址將做爲咱們選舉中每位選民的惟一標識符。

如今讓咱們在命令行中爲dApp建立一個項目目錄,以下所示:

$ mkdir election
$ cd election

如今咱們已經進入了咱們的項目,咱們可使用Truffle box快速啓動和運行。咱們將在本教程中使用Pet Shop box。從項目目錄中,從命令行安裝Pet Shop box,以下所示:

$ truffle unbox pet-shop

讓咱們看看Pet Shop box給了咱們什麼:

  • 合約目錄:這是全部智能聯繫人所在的地方。咱們已經有一個遷移合約來處理咱們到區塊鏈的遷移。
  • 遷移目錄:這是全部遷移文件所在的位置。這些遷移相似於須要遷移來更改數據庫狀態的其餘Web開發框架。每當咱們將智能合約部署到區塊鏈時,咱們都會更新區塊鏈的狀態,所以須要遷移。
  • node_modules目錄:這是咱們全部Node依賴項的主頁。
  • src目錄:這是咱們開發客戶端應用程序的地方。
  • 測試目錄:這是咱們爲智能合約編寫測試的地方。
  • truffle.js文件:這是咱們的Truffle項目的主要配置文件。

如今讓咱們開始寫咱們的智能合約!這個智能合約將包含咱們的dApp的全部業務邏輯。它將負責讀取和寫入以太坊區塊鏈。它將容許咱們列出將參加選舉的候選人,並跟蹤全部選票和選民。它還將管理全部選舉規則,例如強制執行只投票一次的賬戶。從項目的根目錄開始,在contract目錄中建立一個新的合約文件,以下所示:

$ touch contracts/Election.sol

讓咱們首先建立一個冒煙測試,確保咱們正確設置項目,而且咱們能夠成功地將合約部署到區塊鏈。打開文件並從如下代碼開始:

pragma solidity 0.4.2;

contract Election {
    // Read/write candidate
    string public candidate;

    // Constructor
    function Election () public {
        candidate = "Candidate 1";
    }
}

讓我解釋一下這段代碼。咱們首先使用pragma solidity語句聲明solidity版本。接下來,咱們使用contract關鍵字聲明智能合約,而後是合約名稱。接下來,咱們聲明一個狀態變量,它將存儲候選名稱的值。狀態變量容許咱們將數據寫入區塊鏈。咱們已聲明此變量將是一個字符串,而且咱們已將其可見性設置爲public。由於它是公開的,因此solidity將爲咱們提供免費的getter功能,這將容許咱們在合約以外訪問此值。咱們稍後會在控制檯中看到它!

而後,咱們建立一個構造函數,只要咱們將智能合約部署到區塊鏈,就會調用它。這是咱們將設置候選狀態變量的值,該變量將在遷移時存儲到區塊鏈中。請注意,構造函數與智能合約具備相同的名稱。這就是Solidity知道函數是構造函數的方式。

如今咱們已經爲智能合約建立了基礎,讓咱們看看咱們是否能夠將它部署到區塊鏈。爲此,咱們須要在遷移目錄中建立一個新文件。從項目根目錄,從命令行建立一個新文件,以下所示:

$ touch migrations/2_deploy_contracts.js

請注意,咱們使用數字對遷移目錄中的全部文件進行編號,以便Truffle知道執行它們的順序。讓咱們建立一個新的遷移來部署合約,以下所示:

var Election = artifacts.require("./Election.sol");

module.exports = function(deployer) {
  deployer.deploy(Election);
};

首先,咱們須要咱們建立的合約,並將其分配給名爲Election的變量。接下來,咱們將其添加到已部署合約的清單中,以確保在咱們運行遷移時部署它。如今讓咱們從命令行運行咱們的遷移,以下所示:

$ truffle migrate

如今咱們已成功將智能合約遷移到當地以太坊區塊鏈,讓咱們打開控制檯與智能合約進行互動。你能夠從命令行打開松露控制檯,以下所示:

$ truffle console

如今咱們已進入控制檯,讓咱們獲取已部署智能合約的實例,看看咱們是否能夠從合約中讀取候選人的姓名。從控制檯,運行如下代碼:

Election.deployed().then(function(instance) { app = instance })

這裏Election是咱們在遷移文件中建立的變量的名稱。咱們使用deployed()函數檢索了部署的合約實例,並將其分配給promise的回調函數中的app變量。

如今咱們能夠像這樣讀取候選變量的值:

app.candidate()
// => 'Candidate 1'

恭喜!你剛剛編寫了第一份智能合約,已部署到區塊鏈,並檢索了部分數據。繼續學習以太坊Dapp終極教程——如何構建一個完整的全棧去中心化應用(二)

======================================================================

分享一些比特幣、以太坊、EOS、Fabric等區塊鏈相關的交互式在線編程實戰教程:

  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • c#比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在C#代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發學習課程。
  • java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • ERC721以太坊通證明戰,課程以一個數字藝術品創做與分享DApp的實戰開發爲主線,深刻講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約代碼庫二次開發,實戰項目採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • 深刻淺出玩轉EOS錢包開發,本課程以手機EOS錢包的完整開發過程爲主線,深刻學習EOS區塊鏈應用開發,課程內容即涵蓋帳戶、計算資源、智能合約、動做與交易等EOS區塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發包訪問EOS區塊鏈,以及如何在React前端應用中集成對EOS區塊鏈的支持。課程內容深刻淺出,很是適合前端工程師深刻學習EOS區塊鏈應用開發。
  • Hyperledger Fabric 區塊鏈開發詳解,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、nodejs鏈碼與應用開發的操做實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
  • Hyperledger Fabric java 區塊鏈開發詳解,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、java鏈碼與應用開發的操做實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
  • tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裏是以太坊Dapp終極教程——如何構建一個完整的全棧去中心化應用(一)

相關文章
相關標籤/搜索