0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Dapp系統(tǒng)項(xiàng)目開發(fā)部署流程

搭建punk2558 ? 來源:搭建punk2558 ? 作者:搭建punk2558 ? 2022-09-16 14:18 ? 次閱讀

如何在以太坊上搭建一個Dapp?對于開發(fā)人員來說,最好的學(xué)習(xí)辦法就是親自動手做一個小項(xiàng)目。所以,接下來將會以一個投票程序?yàn)槔?,帶著你在以太坊平臺上搭建一個dapp,并且通過借助這樣一個例子介紹Dapp的編譯、部署及交互過程。

這個程序的功能很簡單,只是設(shè)定一組候選項(xiàng),讓所有人都可以給這些候選項(xiàng)投票,以及顯示每個候選項(xiàng)收到的總票數(shù)。

事先說明,因?yàn)樗衐app框架都會隱藏掉一些底層細(xì)節(jié),對初學(xué)者來說,貿(mào)然使用框架可能會形成對系統(tǒng)認(rèn)識上的障礙,所以本文不會介紹如何借助框架搭建dapp。這樣等將來需要甄選框架時,你也能清楚地看到框架到底幫你做了什么。

首先,準(zhǔn)備開發(fā)環(huán)境,學(xué)習(xí)在開發(fā)環(huán)境中的合約編寫、編譯和部署流程,通過node.js控制臺與區(qū)塊鏈上的合約交互,通過一個簡單的網(wǎng)頁與合約交互,在頁面上提供投票功能并顯示候選項(xiàng)及相應(yīng)的票數(shù)。

整個程序的開發(fā)都是在一臺干凈的ubuntu 16.04 xenial上完成的。除此之外,我還在一臺macos上重復(fù)了一遍搭建和測試過程。

準(zhǔn)備開發(fā)環(huán)境

按web開發(fā)的說法,真實(shí)區(qū)塊鏈(live blockchain)相當(dāng)于生產(chǎn)環(huán)境,我們自然不應(yīng)該在生產(chǎn)環(huán)境上做開發(fā),因此本文用了一個名為ganache的內(nèi)存區(qū)塊鏈(相當(dāng)于區(qū)塊鏈模擬器)。本教程的第二篇文章才會跟真正的區(qū)塊鏈交互。

下面是在linux操作系統(tǒng)上安裝ganache和web3js,以及啟動測試區(qū)塊鏈的步驟。在macos上可以用同樣的命令。windows系統(tǒng)可以參照這里的命令。

注意:ganache-cli會創(chuàng)建10個自動參與交易的測試賬號,每個賬號里都預(yù)存了100個以太幣(當(dāng)然,只能用于測試),區(qū)塊鏈DAPP項(xiàng)目開發(fā),DAPP系統(tǒng)開發(fā)模式源碼,DAPP錢包系統(tǒng)搭建技術(shù)。

簡單的投票合約

接下來我們要用Solidity編程語言編寫合約。如果你熟悉面向?qū)ο缶幊?,就會覺得這個學(xué)起來很輕松。

我們要編寫一個名為Voting的合約(相當(dāng)于OOP語言中的類)。這個合約中會有個構(gòu)造器,負(fù)責(zé)初始化一個包含候選項(xiàng)的數(shù)組;還會有兩個方法,一個用于返回指定候選項(xiàng)的總票數(shù),另一個給候選項(xiàng)的得票數(shù)加一。

注意:在將合約部署到區(qū)塊鏈上時,構(gòu)造器會執(zhí)行,并且只會執(zhí)行這一次。在做web應(yīng)用時,每次重新部署都會覆蓋掉原來的代碼,但部署到區(qū)塊鏈上的代碼是不可變的。也就是說,即便你更新了合約,又重新部署了一次,之前的合約仍然會原封不動地留在區(qū)塊鏈上,并且其中存儲的數(shù)據(jù)也不會受到絲毫影響,新部署的代碼會創(chuàng)建一個全新的合約實(shí)例。

下面是帶有注釋的投票合約代碼:

pragma solidity^0.4.18;

//必須指明編譯這段代碼的編譯器版本

contract Voting{

/*下面這個mapping域相當(dāng)于一個關(guān)聯(lián)數(shù)組或哈希。

mapping的鍵是候選項(xiàng)的名字,類型為bytes32;

值的類型是無符號整型,用于存儲得票數(shù)。

*/

mapping(bytes32=>uint8)public votesReceived;

/*Solidity(還)不允許給構(gòu)造器傳入字符串?dāng)?shù)組。

所以我們用bytes32數(shù)組存儲候選項(xiàng)

*/

bytes32[]public candidateList;

/*這就是把合約部署到區(qū)塊鏈上時會執(zhí)行一次的構(gòu)造器。

在部署合約時,我們會傳入一個包含候選項(xiàng)的數(shù)組。

*/

function Voting(bytes32[]candidateNames)public{

candidateList=candidateNames;

}

//這個函數(shù)用于返回指定候選項(xiàng)的總票數(shù),其參數(shù)即為指定候選項(xiàng)

function totalVotesFor(bytes32 candidate)view public returns(uint8){

require(validCandidate(candidate));

return votesReceived[candidate];

}

//這個函數(shù)用于將指定候選項(xiàng)的票數(shù)加一

//這相當(dāng)于實(shí)現(xiàn)了投票功能

function voteForCandidate(bytes32 candidate)public{

require(validCandidate(candidate));

votesReceived[candidate]+=1;

}

function validCandidate(bytes32 candidate)view public returns(bool){

for(uint i=0;i

if(candidateList==candidate){

return true;

}

}

return false;

}

}

部署區(qū)塊鏈

將上面的代碼保存到Voting.sol文件中,放在hello_world_voting目錄下。接下來我們要編譯這段代碼,并將它部署到ganache區(qū)塊鏈上。

在編譯Solidity代碼之前,需要先安裝npm模塊solc。我們會在node控制臺中用這個庫編譯合約。

首先,在終端中運(yùn)行node命令進(jìn)入node控制臺,初始化solc和web3對象。下面是需要在node控制臺中輸入的代碼:

mahesh projectblockchain:~/hello_world_voting$node

>Web3=require('web3')

>web3=new Web3(new Web3.providers.HttpProvider

為了確保web3對象初始化成功,可以跟區(qū)塊鏈通訊,我們可以查詢一下區(qū)塊鏈上的所有賬號。

為了編譯合約,需要先加載文件Voting.sol中的代碼,并將其賦值給一個字符串變量,然后再編譯這個字符串。

>code=fs.readFileSync('Voting.sol').toString()

>solc=require('solc')

>compiledCode=solc.compile(code)

代碼編譯成功后,可以在node終端中輸入compiledCode命令查看contract對象,有兩個域非常重要,一定要搞明白:compiledCode.contracts[‘:Voting’].bytecode:這是Voting.sol中的代碼編譯而成的字節(jié)碼,也是要部署到區(qū)塊鏈上的代碼。compiledCode.contracts[‘:Voting’].interface:這是合約的接口或者說模板(稱為abi),告訴合約的用戶有哪些方法可用。將來不管什么時候要跟合約交互,都需要這個abi定義。這里有關(guān)于ABI的詳細(xì)介紹。

部署合約

先創(chuàng)建一個在區(qū)塊鏈中部署和初始化合約的合約對象(即下面的VotingContract)。

>abiDefinition=JSON.parse(compiledCode.contracts[':Voting'].interface)

>VotingContract=web3.eth.contract(abiDefinition)

>byteCode=compiledCode.contracts[':Voting'].bytecode

>deployedContract=VotingContract.new(['Rama','Nick','Jose'],{data:byteCode,from:web3.eth.accounts[0],gas:

4700000})

>deployedContract.address

>contractInstance=VotingContract.at(deployedContract.address)

上面代碼中的VotingContract.new將合約部署到區(qū)塊鏈上。它的第一個參數(shù)是包含候選項(xiàng)的數(shù)組,一看就能明白。第二個參數(shù)中各數(shù)據(jù)項(xiàng)的含義分別為:data:這是已編譯好要部署到區(qū)塊鏈上的字節(jié)碼。from:區(qū)塊鏈必須追蹤是誰部署的合約。在這個例子中,我們只是調(diào)用了web3.eth.accounts,然后將返回結(jié)果的第一個賬號作為這個合約的所有者(即將合約部署到區(qū)塊鏈上的賬號)。

記住,web3.eth.accounts返回的是ganche在啟動測試區(qū)塊鏈時創(chuàng)建的10個測試賬號組成的數(shù)組。然而在真實(shí)的區(qū)塊鏈中,不能隨便指定一個賬號。那必須是你擁有的賬號,并且在交易之前要解鎖那個賬號。在創(chuàng)建賬號時,系統(tǒng)會要求你提供一個口令,這個口令就是用來證明你對賬號的所有權(quán)的。為了用起來方便,Ganache默認(rèn)把10個賬號全解鎖了。

gas:跟區(qū)塊鏈交互是要花錢的。為了把你的代碼放到區(qū)塊鏈上,是需要讓礦機(jī)干活的,這筆錢就是給那些付出計算力的礦機(jī)的。

你必須明確愿意為此支付多少錢,即給‘gas’一個值。購買燃料的以太幣是從你的from賬號中出的。燃料的價格是由網(wǎng)絡(luò)設(shè)定的。合約部署好之后,我們就可以跟合約的實(shí)例(即上面的變量contractInstance)交互了。區(qū)塊鏈上有成百上千個合約,怎么確定哪個是你的呢?答案是用deployedContract.address。在你必須跟合約交互時,需要這個部署地址和之前說過的那個abi定義。

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    361

    瀏覽量

    40776
  • 區(qū)塊鏈智能合約

    關(guān)注

    4

    文章

    426

    瀏覽量

    11175
收藏 人收藏

    評論

    相關(guān)推薦

    wms智能倉儲管理系統(tǒng)標(biāo)準(zhǔn)化流程

    wms智能倉儲管理系統(tǒng)標(biāo)準(zhǔn)化流程的標(biāo)準(zhǔn)化流程通常包括以下幾個主要步驟: 需求分析:與客戶充分溝通,了解其倉儲管理需求和業(yè)務(wù)流程,確定系統(tǒng)功能
    的頭像 發(fā)表于 10-14 16:22 ?159次閱讀

    系統(tǒng)集成部署流程

    系統(tǒng)集成部署流程圖 為保證在無互聯(lián)網(wǎng)的情況下,可正常搭建、構(gòu)建項(xiàng)目,并自動化部署項(xiàng)目,所以選擇N
    的頭像 發(fā)表于 08-21 10:24 ?146次閱讀
    <b class='flag-5'>系統(tǒng)</b>集成<b class='flag-5'>部署</b><b class='flag-5'>流程</b>圖

    海辰儲能成功部署保加利亞最大電池儲能系統(tǒng)項(xiàng)目

    日前,海辰儲能成功部署了保加利亞迄今最大的電池儲能系統(tǒng)項(xiàng)目,其規(guī)模為55MWh。該項(xiàng)目現(xiàn)已投入運(yùn)營,通過光伏和儲能融合提供穩(wěn)定的清潔能源供應(yīng),助力當(dāng)?shù)啬茉淳G色轉(zhuǎn)型。
    的頭像 發(fā)表于 07-10 09:49 ?387次閱讀

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(視頻應(yīng)用)

    者提供了“一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用,降低
    的頭像 發(fā)表于 05-25 16:29 ?4396次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【一次<b class='flag-5'>開發(fā)</b>,多端<b class='flag-5'>部署</b>】(視頻應(yīng)用)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(一多天氣)項(xiàng)目

    本示例展示一個天氣應(yīng)用界面,包括首頁、城市管理、添加城市、更新時間彈窗,體現(xiàn)一次開發(fā),多端部署的能力。
    的頭像 發(fā)表于 05-20 14:59 ?766次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【一次<b class='flag-5'>開發(fā)</b>,多端<b class='flag-5'>部署</b>】(一多天氣)<b class='flag-5'>項(xiàng)目</b>

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署(視頻應(yīng)用)】

    者提供了“一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用,降低
    的頭像 發(fā)表于 05-11 15:41 ?1227次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【一次<b class='flag-5'>開發(fā)</b>,多端<b class='flag-5'>部署</b>(視頻應(yīng)用)】

    鴻蒙實(shí)戰(zhàn)開發(fā)-本地部署、SmartPerf 編譯部署指導(dǎo)文檔

    系統(tǒng)下 從 https://golang.google.cn/dl/ 下載安裝包, 一路next 完成 安裝即可 安裝完成后 命令行運(yùn)行驗(yàn)證是否安裝成功 go version 項(xiàng)目編譯 先下
    發(fā)表于 05-09 14:23

    紅帽發(fā)布RHEL AI開發(fā)者預(yù)覽版,集成IBM Granite模型,簡化AI開發(fā)流程

    RHEL AI依托InstructLab開源項(xiàng)目,結(jié)合IBM Research的開源授權(quán)Granite大型語言模型與InstructLab模型對齊工具,采用LAB(Large-scale Alignment for chatBots)方法創(chuàng)建可引導(dǎo)的RHEL鏡像,從而簡化服務(wù)器
    的頭像 發(fā)表于 05-08 15:01 ?431次閱讀

    【轉(zhuǎn)載】英特爾開發(fā)套件“哪吒”快速部署YoloV8 on Java | 開發(fā)者實(shí)戰(zhàn)

    部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO可賦能開發(fā)者在現(xiàn)實(shí)世界中部署高性能應(yīng)用
    的頭像 發(fā)表于 03-23 08:05 ?400次閱讀
    【轉(zhuǎn)載】英特爾<b class='flag-5'>開發(fā)</b>套件“哪吒”快速<b class='flag-5'>部署</b>YoloV8 on Java | <b class='flag-5'>開發(fā)</b>者實(shí)戰(zhàn)

    dSPACE開發(fā)流程

    電子發(fā)燒友網(wǎng)站提供《dSPACE開發(fā)流程.pdf》資料免費(fèi)下載
    發(fā)表于 02-29 09:08 ?0次下載

    芯科科技發(fā)布新版藍(lán)牙開發(fā)流程

    查看Silicon Labs(亦稱“芯科科技”)近日發(fā)布新版的藍(lán)牙開發(fā)流程(Bluetooth Developer Journey),了解更多關(guān)于低功耗藍(lán)牙、藍(lán)牙Mesh、藍(lán)牙定位服務(wù),以及電子貨架標(biāo)簽(ESL)等設(shè)計方法,我們將概述相關(guān)應(yīng)用
    的頭像 發(fā)表于 01-25 10:09 ?665次閱讀
    芯科科技發(fā)布新版藍(lán)牙<b class='flag-5'>開發(fā)</b><b class='flag-5'>流程</b>

    如何解決模型部署時出現(xiàn)算子不匹配問題

    結(jié)果部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO 可賦能開發(fā)者在現(xiàn)實(shí)世界中部署高性
    的頭像 發(fā)表于 12-08 15:30 ?932次閱讀
    如何解決模型<b class='flag-5'>部署</b>時出現(xiàn)算子不匹配問題

    springcloud項(xiàng)目搭建及部署

    如何搭建并部署Spring Cloud項(xiàng)目。 一、環(huán)境準(zhǔn)備 在開始之前,我們需要準(zhǔn)備以下環(huán)境: Java開發(fā)環(huán)境:確保已經(jīng)安裝了Java SE Development Kit(JDK)。 Maven
    的頭像 發(fā)表于 12-03 15:52 ?1109次閱讀

    springboot啟動流程

    Spring Boot 是一個快速開發(fā)框架,基于 Spring 框架,用于簡化項(xiàng)目的配置和部署。它提供了自動配置、嵌入式服務(wù)器和一套默認(rèn)的代碼結(jié)構(gòu),使得開發(fā)者可以快速地
    的頭像 發(fā)表于 11-22 16:04 ?612次閱讀

    嵌入式系統(tǒng)的組成及開發(fā)流程

    電子發(fā)燒友網(wǎng)站提供《嵌入式系統(tǒng)的組成及開發(fā)流程.ppt》資料免費(fèi)下載
    發(fā)表于 11-17 14:35 ?1次下載
    嵌入式<b class='flag-5'>系統(tǒng)</b>的組成及<b class='flag-5'>開發(fā)</b><b class='flag-5'>流程</b>