主頁 > 區塊鏈 > 手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本

手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本

2021-02-01 13:26:38 區塊鏈

第一個Dapp開發(使用solidity語言實作投票合約)——Remix版本

寫在前面:

現在流行的技術區塊鏈算一個熱門,我也在學習的路上,寫下博客旨在為了記錄一些自己遇到的問題和解決方法,希望可以多多幫助學習路上的小白,

提到區塊鏈不得不提到位元幣,但是現在熱門的開發就是go語言開發和基于以太坊的開發,我目前在學的是以太坊的一些東西,之前沒有接觸很多,所以也是從無到有的程序,

經過這些天的學習我發現中國對于這塊技術的討論還是相對較少(在遇到問題的時候通過百度很難找出答案,不知道是因為大牛的封閉,還是我們確實缺乏這方面技術的研究),

什么是Dapp?

App我們都知道是客戶端應用,是application的簡稱,再說dapp就是D+app,d是英文單詞decentralization的首字母,單詞翻譯中文是去中心化,即dapp為去中心化應用,主要強調的是一個可以被我們直觀看見的一個頁面這樣子的應用,里面集成了我們的區塊鏈技術(去中心化技術),

自己很狗血的做了好久才稍微的明白了這個原理和作業的流程,但是學習的路上哪有一帆風順,在你寫出來東西的時候你就會有很大的成就感,

本篇通過標題也可以看出來主要是結合Remix這個強大的軟體工具來進行第一個Dapp的開發,在后續我會再寫一篇怎么通過Ubantu系統通過手動部署來實作第一個Dapp的實作,

目錄

第一個Dapp開發(使用solidity語言實作投票合約)——Remix版本

1.專案準備

1).安裝瀏覽器

2).安裝MetaMask

3).Remix

4).安裝Ganache軟體

2.Remix基本操作(結合我們投票Dapp的開發)

1)進入界面

2)基本介紹

3)智能投票合約

4)部署 & 執行交易

3.部署智能合約到Web

1)HTML:

2)JS:

專案總結:


1.專案準備

首先開始專案的開發前我們需要做的前期準備有:

1).安裝瀏覽器

推薦使用火狐,火狐上有第二步的錢包安裝插件,所以建議使用火狐來開發你的以太坊,

2).安裝MetaMask

在火狐瀏覽器上安裝錢包MetaMask插件(可能需要小小的翻墻一下,安裝結果如下所示,可以自己創建一個賬號也可以選擇看后面的教程),

3).Remix

進入Remix網頁編輯器:remix中文版 Remix英文版,這邊分別提供了兩種編譯器供你選擇,英文不好就選擇中文版本,

4).安裝Ganache軟體

也需要翻墻,這個軟體主要是用于產生是個賬戶來供我們使用,提供了區塊鏈技術的可視化,在軟體中可以本鏈上的區塊個數,賬號資訊,賬號私鑰資訊等等,

可以查看區塊交易資訊:

注意:紅框中的RPC SERVER在我們web部署的時候需要用到

前期的準備基本完成,有了簡單易用的軟體才是我們開啟實踐的第一步,

2.Remix基本操作(結合我們投票Dapp的開發)

1)進入界面

進入上面的網頁編輯器(如下圖所示):

2)基本介紹

介紹基本的功能和操作:

3)智能投票合約

新建一個sol檔案用來存放并寫入我們的智能合約:

智能合約代碼(代碼不是我寫的,還沒學的那么深,能看懂就行,后續再學)

pragma solidity ^0.4.22;

contract Voting {

    bytes32[] public candidateList;
    mapping (bytes32 => uint8) public votesReceived;
    
    constructor(bytes32[] candidateNames) public {
        candidateList = candidateNames;
    }

    function voteForCandidate(bytes32 candidate) public {
        require(validCandidate(candidate));
        votesReceived[candidate] += 1;
    }

    function totalVotesFor(bytes32 candidate) view public returns (uint8) {
        require(validCandidate(candidate));
        return votesReceived[candidate];
    }

    function validCandidate(bytes32 candidate) view public returns (bool) {
        for(uint8 i = 0; i < candidateList.length; i++) {
            if(candidateList[i] == candidate)
                return true;
        }
        return false;
    }
    
}

進行合約編譯:

注意:其中的abi,我們集成到前端界面的時候會用到

4)部署 & 執行交易

(一)部署

點擊1處然后選擇injected web3就會自動的跳出3界面,然后選擇下一步就好了,這樣就把你的合約部署的前面部分完成了,

連接成功就會如右下圖所示賬號會變化,核對即可(一般不會出錯)

輸入引數進行部署: 這個是建構式那邊的引數

["0xd4967590eb024589dfb6b9e48a576eb49ebc19d764b0d1d67dc21975e7258e97",
"0x416c696365000000000000000000000000000000000000000000000000000000",
"0x426f620000000000000000000000000000000000000000000000000000000000",
"0x4361727900000000000000000000000000000000000000000000000000000000",
"0x065e0be95fb43db528a20ba65c0e575e33cd4a9e1ca089dba4efff24596e8553"]

這其中的中間上個就是Alice,Bob,Cary的三個單詞的bytes32形式,具體怎么轉可以查看百度或者可以使用下面的軟體進行轉化: 字碼裝換

將該資料放入Deploy后面的輸入框,就是建構式的引數傳遞框,

點擊Deploy 出現

確認即可,出現下面的資料就表示你把你的智能合約部署到我們的Ganache鏈上了,

至此我們把合約部署的流程講了一遍

(二)交易

我們做的是一個投票的合約,那么我們可以使用已經部署的合約進行呼叫函式,對其部署完成的合約進行展開,通過下圖可以看見很多的細節,比如我們合約中的幾個函式,一個是投票的函式(voteForCandidate),一個是統計票數的函式(totalVotesFor),我們可以對其驗證是否像我們所期待的那樣出現結果,

首先查看票數,在totalVotesFor函式后面輸入0x416c696365000000000000000000000000000000000000000000000000000000查看結果:可以看見出現了0

然后我們呼叫voteForCandidate對其投票后查看票數:左圖顯示當你呼叫投票函式的時候會叫你確認一筆交易,右圖顯示投完票后查看票數出現的結果(可以看見多出來了一票,證明了我們合約部署沒有問題)

其他的函式可以自己去實踐,至此我們的合約部署和除錯就完成了

下面就是我們怎么把這個合約用到我們自己的網站上面去,

3.部署智能合約到Web

首先先寫一個簡單的html界面,用于投票的可視化

1)HTML:

<!DOCTYPE html>
<html>
<head>
  <title>Hello World DApp</title>
  <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
  <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' type='text/css'>
</head>
<body class="container">
  <h1>A Simple Voting Application</h1>
  <div class="table-responsive">
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>Candidate</th>
          <th>Votes</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Alice</td>
          <td id="candidate-1"></td>
        </tr>
        <tr>
          <td>Bob</td>
          <td id="candidate-2"></td>
        </tr>
        <tr>
          <td>Cary</td>
          <td id="candidate-3"></td>
        </tr>
      </tbody>
    </table>
  </div>
  <input type="text" id="candidate" />
  <a href="#" onclick="voteForCandidate()" class="btn btn-primary">Vote</a>
</body>
<script src="https://cdn.jsdelivr.net/npm/web3@0.20.1/dist/web3.js"></script>
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script>
<script src="./index.js"></script>
</html>

2)JS:

web3 = new Web3(new Web3.providers.HttpProvider("HTTP://192.168.75.1:7545"));
abi = JSON.parse('[{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"totalVotesFor","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"validCandidate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"votesReceived","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"candidateList","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"voteForCandidate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"candidateNames","type":"bytes32[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]')
VotingContract = web3.eth.contract(abi);

//部署的合約地址 
contractInstance = VotingContract.at('0x5B15C032F8C8787815a73A2800560772196437Aa');

candidates = {"Alice": "candidate-1","Bob": "candidate-2","Cary":"candidate-3"}

function voteForCandidate() {
  //console.log(candidate);
  candidateName = $("#candidate").val();
  //console.log(candidateName);
  contractInstance.voteForCandidate(candidateName, {from: web3.eth.accounts[0]}, function() {
    let div_id = candidates[candidateName];
    console.log(contractInstance.totalVotesFor.call(candidateName).toString());
    $("#" + div_id).html(contractInstance.totalVotesFor.call(candidateName).toString());
  });
  console.log(contractInstance.totalVotesFor.call(candidateName).toString());
}

$(document).ready(function() {
  candidateNames = Object.keys(candidates);
  for (var i = 0; i < candidateNames.length; i++) {
    let name = candidateNames[i];
    let val = contractInstance.totalVotesFor.call(name).toString()
    $("#" + candidates[name]).html(val);
  }
});

值得我們去研究的是js部分:

(一)js第一行參考了我們Ganache中的地址,詳細可以看上面圖片中的RPC SERVER,

(二)第二行是我們的abi,也看之前Remix中,復制就好了,

(三)合約地址需要我們去部署完以后的那個合約中復制,

經過修改就可以實作一個最簡單的Dapp了

效果如下所示:

可以進行投票的測驗,后期可以對頁面進行美化,

專案總結:

這個Dapp的專案看起來很簡單,但是其中會遇見很多的問題,不如你前端的webjs應用的版本不對,沒有包含我們需要的方法,還有就是軟體安裝的問題會出現很多,你可能熟悉一個錢包的插件就要一天,然后熟悉Remix又需要一天的時間,所以當你遇到困難的時候慢慢學,當然學習的路上少不了學長的幫助,努力奮斗總是有結果的,

Remix函式部署輸入的建構式的引數必須是我上面的十六進制數,不然那就會出錯,但是你web應用的時候又是可以將Alice直接輸入進去,這個問題是Remix把它集成化了,我在Ubantu系統上手動部署的時候是沒有問題的,直接輸入Alice也可以直接部署,但是Remix就是不可以這樣子部署,手動部署我下面會寫一篇單獨的文章來介紹,

整理不易多點關注+點贊+收藏,感謝各位大哥,持續關注后續更加精彩,

打個廣告:代做Web畢設,專業團隊值得信任,可以私聊,

No pains No Results

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/255279.html

標籤:區塊鏈

上一篇:量化交易日記-2021年01月總結

下一篇:44、backtrader的一些基本概念---Cheat-On-Open的使用方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more