溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

發(fā)布時(shí)間:2021-12-29 14:12:48 來源:億速云 閱讀:154 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

什么是區(qū)塊鏈?

讓我們用一個(gè)類比來理解區(qū)塊鏈?zhǔn)鞘裁匆约八侨绾喂ぷ鞯?。我們來看一個(gè)Web應(yīng)用程序。

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

通常,當(dāng)你與Web應(yīng)用程序交互時(shí),你使用Web瀏覽器通過網(wǎng)絡(luò)連接到中心服務(wù)器。此Web應(yīng)用程序的所有代碼都位于此中心服務(wù)器上,并且所有數(shù)據(jù)都位于中央數(shù)據(jù)庫中。無論何時(shí)與應(yīng)用程序進(jìn)行交易,都必須與Web上的此中心服務(wù)器進(jìn)行通信。

如果我們要在網(wǎng)上構(gòu)建我們的投票應(yīng)用程序,我們會(huì)遇到一些問題:


    1. 可以更改數(shù)據(jù)庫上的數(shù)據(jù):可以多次計(jì)數(shù),也可以完全刪除。


    1. Web服務(wù)器上的源代碼也可以隨時(shí)更改。

我們不想在網(wǎng)絡(luò)上構(gòu)建我們的應(yīng)用程序。我們希望在區(qū)塊鏈上構(gòu)建它,任何連接到網(wǎng)絡(luò)的人都可以參與選舉。我們希望確保他們的投票得到統(tǒng)計(jì),并且他們只計(jì)算一次。那么讓我們來看看它是如何工作的。

區(qū)塊鏈不是擁有網(wǎng)絡(luò),中心服務(wù)器和數(shù)據(jù)庫,而是一個(gè)網(wǎng)絡(luò)和數(shù)據(jù)庫。區(qū)塊鏈?zhǔn)怯?jì)算機(jī)的點(diǎn)對點(diǎn)網(wǎng)絡(luò),稱為節(jié)點(diǎn),共享網(wǎng)絡(luò)中的所有數(shù)據(jù)和代碼。因此,如果你是連接到區(qū)塊鏈的設(shè)備,則你是網(wǎng)絡(luò)中的節(jié)點(diǎn),并且你可以與網(wǎng)絡(luò)中的所有其他計(jì)算機(jī)節(jié)點(diǎn)進(jìn)行通信。你現(xiàn)在擁有區(qū)塊鏈上所有數(shù)據(jù)和代碼的副本。沒有更多的中心服務(wù)器。只是一堆在同一網(wǎng)絡(luò)上相互通信的計(jì)算機(jī)。

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

而不是集中式數(shù)據(jù)庫,區(qū)塊鏈中節(jié)點(diǎn)之間共享的所有交易數(shù)據(jù)都包含在稱為塊的記錄包中,這些記錄捆綁在一起以創(chuàng)建公共分類帳。此公共分類帳表示區(qū)塊鏈中的所有數(shù)據(jù)。公共分類帳中的所有數(shù)據(jù)都通過加密散列來保護(hù),并通過一致性算法進(jìn)行驗(yàn)證。網(wǎng)絡(luò)上的節(jié)點(diǎn)參與以確保通過網(wǎng)絡(luò)分發(fā)的所有數(shù)據(jù)副本是相同的。這是我們在區(qū)塊鏈上構(gòu)建投票申請的一個(gè)非常重要的原因,因?yàn)槲覀兿M_保我們的投票得到計(jì)算,并且它沒有改變。

我們的應(yīng)用程序用戶對區(qū)塊鏈進(jìn)行投票會(huì)是什么樣子?那么,對于初學(xué)者來說,用戶需要一個(gè)帶有錢包地址的帳戶,其中有一些Ether,以太坊的加密貨幣。一旦他們連接到網(wǎng)絡(luò),他們就會(huì)投票并支付一筆小額交易費(fèi)用來將此交易寫入?yún)^(qū)塊鏈。這筆交易費(fèi)用稱為gas。無論何時(shí)投票,網(wǎng)絡(luò)上的一些節(jié)點(diǎn)(稱為礦工)都會(huì)競爭完成此交易。完成此交易的礦工將獲得我們付款投票的以太幣。

作為回顧,當(dāng)我投票時(shí),我支付gas價(jià)格進(jìn)行投票,當(dāng)我的投票被記錄時(shí),網(wǎng)絡(luò)上的一臺(tái)計(jì)算機(jī)獲得我的以太網(wǎng)費(fèi)用。我反過來相信我的投票是永遠(yuǎn)準(zhǔn)確記錄的。

所以同樣重要的是要注意,對區(qū)塊鏈進(jìn)行投票會(huì)花費(fèi)以太幣,但只是看到候選人名單沒有。這是因?yàn)閺膮^(qū)塊鏈中讀取數(shù)據(jù)是免費(fèi)的,但寫入?yún)^(qū)塊鏈則不是。

什么是智能合約?

這就是投票過程的工作原理,但我們?nèi)绾螌?shí)際編寫應(yīng)用程序代碼呢?好吧,以太坊區(qū)塊鏈允許我們使用名為智能合約的東西在區(qū)塊鏈上使用以太坊虛擬機(jī)(EVM)執(zhí)行代碼。

智能合約是我們應(yīng)用程序的所有業(yè)務(wù)邏輯所在。這是我們實(shí)際編寫應(yīng)用程序去中心化部分的地方。智能合約負(fù)責(zé)向區(qū)塊鏈讀取和寫入數(shù)據(jù),以及執(zhí)行業(yè)務(wù)邏輯。智能聯(lián)系人使用名為Solidity的編程語言編寫,看起來很像Javascript。它是一個(gè)完整的編程語言,它允許我們執(zhí)行Javascript所能提供的許多相同類型的事物,但由于它的用例,它的行為有點(diǎn)不同,正如我們在本教程中將看到的那樣。

區(qū)塊鏈上智能合約的功能與網(wǎng)絡(luò)上的微服務(wù)非常相似。如果公共分類帳表示區(qū)塊鏈的數(shù)據(jù)庫層,那么智能合約就是與該數(shù)據(jù)進(jìn)行交易的所有業(yè)務(wù)邏輯所在的位置。

此外,他們被稱為智能合約,因?yàn)樗麄兇砥跫s或協(xié)議。在我們的投票dApp的情況下,這是一項(xiàng)協(xié)議,我的投票將被計(jì)算,其他投票只計(jì)算一次,并且投票最多的候選人實(shí)際上將贏得選舉。

現(xiàn)在讓我們快速瀏覽一下我們正在構(gòu)建的dApp的結(jié)構(gòu)。

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

我們將擁有一個(gè)用HTML,CSS和Javascript編寫的傳統(tǒng)前端客戶端。該客戶端將連接到我們將安裝的本地以太坊區(qū)塊鏈,而不是與后端服務(wù)器通信。我們將使用Solidity編程語言在選舉智能合約中編寫關(guān)于dApp的所有業(yè)務(wù)邏輯。我們將這個(gè)智能合約部署到我們當(dāng)?shù)氐腅therum區(qū)塊鏈,并允許賬戶開始投票。

現(xiàn)在我們已經(jīng)看到了區(qū)塊鏈?zhǔn)鞘裁匆约八侨绾喂ぷ鞯?。我們已?jīng)看到了為什么我們要在區(qū)塊鏈而不是當(dāng)前的網(wǎng)絡(luò)上構(gòu)建我們的投票dApp。我們已經(jīng)看到,我們希望通過編寫將部署到以太坊區(qū)塊鏈的智能合約來編寫我們的dApp代碼?,F(xiàn)在讓我們跳進(jìn)去開始編程吧!

我們將要構(gòu)建什么

以下是我們將要構(gòu)建的投票dApp的演示。

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

我們將構(gòu)建一個(gè)客戶端應(yīng)用程序,它將與我們在區(qū)塊鏈上的智能合約進(jìn)行對話。此客戶端應(yīng)用程序?qū)⒂幸粋€(gè)候選人表,列出每個(gè)候選人的ID,姓名和投票計(jì)數(shù)。它將有一個(gè)表格,我們可以為我們想要的候選人投票。它還會(huì)在你的帳戶your account下顯示我們與區(qū)塊鏈關(guān)聯(lián)的帳戶。

安裝依賴項(xiàng)

為了構(gòu)建我們的dApp,我們首先需要一些依賴項(xiàng)。

節(jié)點(diǎn)包管理器(NPM)

我們需要的第一個(gè)依賴是Node Package Manager,或NPM,它隨Node.js一起提供。你可以通過轉(zhuǎn)到終端并鍵入以下內(nèi)容來查看是否已安裝節(jié)點(diǎn):

$ node -v
Truffle框架

下一個(gè)依賴是Truffle Framework,它允許我們在以太坊區(qū)塊鏈上構(gòu)建去中心化的應(yīng)用程序。它提供了一套工具,允許我們使用Solidity編程語言編寫智能聯(lián)系人。它還使我們能夠測試我們的智能合約并將其部署到區(qū)塊鏈。它還為我們提供了開發(fā)客戶端應(yīng)用程序的空間。

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

$ npm install -g truffle
Ganache

下一個(gè)依賴項(xiàng)是Ganache,一個(gè)本地內(nèi)存中的區(qū)塊鏈。你可以通過從Truffle Framework網(wǎng)站下載來安裝Ganache。它將為我們提供10個(gè)外部賬戶,并在我們當(dāng)?shù)氐囊蕴粎^(qū)塊鏈上提供地址。每個(gè)帳戶都預(yù)裝了100個(gè)假以太坊幣。

Metamask

下一個(gè)依賴項(xiàng)是Google Chrome的Metamask擴(kuò)展。為了使用區(qū)塊鏈,我們必須連接到它(記住,我說塊鏈?zhǔn)且粋€(gè)網(wǎng)絡(luò))。我們必須安裝一個(gè)特殊的瀏覽器擴(kuò)展才能使用以太坊區(qū)塊鏈。這就是metamask的用武之地。我們將能夠通過我們的個(gè)人賬戶連接到我們當(dāng)?shù)氐囊蕴粎^(qū)塊鏈,并與我們的智能合約進(jìn)行互動(dòng)。

我們將在本教程中使用Metamask chrome擴(kuò)展,因此如果你還沒有安裝Google Chrome瀏覽器,則還需要安裝它。要安裝Metamask,請?jiān)贕oogle Chrome網(wǎng)上應(yīng)用店中搜索Metamask Chrome插件。安裝完成后,請確保在擴(kuò)展列表中選中它。安裝后,你會(huì)在Chrome瀏覽器的右上角看到狐貍圖標(biāo)。如果卡住了,請參考視頻演示!

語法突出顯示

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

Smoke測試 - 第1步

現(xiàn)在我們已經(jīng)安裝了依賴項(xiàng),讓我們開始構(gòu)建我們的dApp!

首先,找到你下載Ganache的地方,然后打開它。現(xiàn)在Ganache啟動(dòng)了,你有一個(gè)本地區(qū)塊鏈運(yùn)行。

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

Ganache為我們提供了10個(gè)預(yù)裝了100個(gè)假以太坊的帳戶(這在主要的以太坊網(wǎng)絡(luò)上是不值得的)。每個(gè)帳戶都有一個(gè)唯一的地址和一個(gè)私鑰。每個(gè)帳戶地址將作為我們選舉中每位選民的唯一標(biāo)識(shí)符。

現(xiàn)在讓我們在命令行中為dApp創(chuàng)建一個(gè)項(xiàng)目目錄,如下所示:

$ mkdir election
$ cd election

現(xiàn)在我們已經(jīng)進(jìn)入了我們的項(xiàng)目,我們可以使用Truffle box快速啟動(dòng)和運(yùn)行。我們將在本教程中使用Pet Shop box。從項(xiàng)目目錄中,從命令行安裝Pet Shop box,如下所示:

$ truffle unbox pet-shop

讓我們看看Pet Shop box給了我們什么:

以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧

  • 合約目錄:這是所有智能聯(lián)系人所在的地方。我們已經(jīng)有一個(gè)遷移合約來處理我們到區(qū)塊鏈的遷移。

  • 遷移目錄:這是所有遷移文件所在的位置。這些遷移類似于需要遷移來更改數(shù)據(jù)庫狀態(tài)的其他Web開發(fā)框架。每當(dāng)我們將智能合約部署到區(qū)塊鏈時(shí),我們都會(huì)更新區(qū)塊鏈的狀態(tài),因此需要遷移。

  • node_modules目錄:這是我們所有Node依賴項(xiàng)的主頁。

  • src目錄:這是我們開發(fā)客戶端應(yīng)用程序的地方。

  • 測試目錄:這是我們?yōu)橹悄芎霞s編寫測試的地方。

  • truffle.js文件:這是我們的Truffle項(xiàng)目的主要配置文件。

現(xiàn)在讓我們開始寫我們的智能合約!這個(gè)智能合約將包含我們的dApp的所有業(yè)務(wù)邏輯。它將負(fù)責(zé)讀取和寫入以太坊區(qū)塊鏈。它將允許我們列出將參加選舉的候選人,并跟蹤所有選票和選民。它還將管理所有選舉規(guī)則,例如強(qiáng)制執(zhí)行只投票一次的帳戶。從項(xiàng)目的根目錄開始,在contract目錄中創(chuàng)建一個(gè)新的合約文件,如下所示:

$ touch contracts/Election.sol

讓我們首先創(chuàng)建一個(gè)冒煙測試,確保我們正確設(shè)置項(xiàng)目,并且我們可以成功地將合約部署到區(qū)塊鏈。打開文件并從以下代碼開始:

pragma solidity 0.4.2;

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

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

讓我解釋一下這段代碼。我們首先使用pragma solidity語句聲明solidity版本。接下來,我們使用contract關(guān)鍵字聲明智能合約,然后是合約名稱。接下來,我們聲明一個(gè)狀態(tài)變量,它將存儲(chǔ)候選名稱的值。狀態(tài)變量允許我們將數(shù)據(jù)寫入?yún)^(qū)塊鏈。我們已聲明此變量將是一個(gè)字符串,并且我們已將其可見性設(shè)置為public。因?yàn)樗枪_的,所以solidity將為我們提供免費(fèi)的getter功能,這將允許我們在合約之外訪問此值。我們稍后會(huì)在控制臺(tái)中看到它!

然后,我們創(chuàng)建一個(gè)構(gòu)造函數(shù),只要我們將智能合約部署到區(qū)塊鏈,就會(huì)調(diào)用它。這是我們將設(shè)置候選狀態(tài)變量的值,該變量將在遷移時(shí)存儲(chǔ)到區(qū)塊鏈中。請注意,構(gòu)造函數(shù)與智能合約具有相同的名稱。這就是Solidity知道函數(shù)是構(gòu)造函數(shù)的方式。

現(xiàn)在我們已經(jīng)為智能合約創(chuàng)建了基礎(chǔ),讓我們看看我們是否可以將它部署到區(qū)塊鏈。為此,我們需要在遷移目錄中創(chuàng)建一個(gè)新文件。從項(xiàng)目根目錄,從命令行創(chuàng)建一個(gè)新文件,如下所示:

$ touch migrations/2_deploy_contracts.js

請注意,我們使用數(shù)字對遷移目錄中的所有文件進(jìn)行編號(hào),以便Truffle知道執(zhí)行它們的順序。讓我們創(chuàng)建一個(gè)新的遷移來部署合約,如下所示:

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

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

首先,我們需要我們創(chuàng)建的合約,并將其分配給名為Election的變量。接下來,我們將其添加到已部署合約的清單中,以確保在我們運(yùn)行遷移時(shí)部署它。現(xiàn)在讓我們從命令行運(yùn)行我們的遷移,如下所示:

$ truffle migrate

現(xiàn)在我們已成功將智能合約遷移到當(dāng)?shù)匾蕴粎^(qū)塊鏈,讓我們打開控制臺(tái)與智能合約進(jìn)行互動(dòng)。你可以從命令行打開松露控制臺(tái),如下所示:

$ truffle console

現(xiàn)在我們已進(jìn)入控制臺(tái),讓我們獲取已部署智能合約的實(shí)例,看看我們是否可以從合約中讀取候選人的姓名。從控制臺(tái),運(yùn)行以下代碼:

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

這里Election是我們在遷移文件中創(chuàng)建的變量的名稱。我們使用deployed()函數(shù)檢索了部署的合約實(shí)例,并將其分配給promise的回調(diào)函數(shù)中的app變量。

現(xiàn)在我們可以像這樣讀取候選變量的值:

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

“以太坊Dapp怎么構(gòu)建一個(gè)完整的全棧”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI