以太坊智能合約實(shí)戰(zhàn) - 一個(gè)投票dapp

前期準(zhǔn)備

  • 編輯器
    理論上講任何編輯器都可以編寫Solidity合約代碼,比如:WebStorm,VSCode盐欺,Sublime等。我選擇atom
    autocomplete-solidity代碼自動(dòng)補(bǔ)齊
    linter-solium仅醇、linter-solidity代碼錯(cuò)誤檢查
    language-ethereum支持Solidity代碼高亮以及Solidity代碼片段
  • 環(huán)境
    node.js
    開發(fā)框架:truffle(用react box)
    安裝truffle
$ npm install -g ethereumjs-testrpc truffle

創(chuàng)建項(xiàng)目

luoxuedeMacBook-Pro:~ luoxue$ cd desktop
luoxuedeMacBook-Pro:desktop luoxue$ mkdir voting
luoxuedeMacBook-Pro:desktop luoxue$ cd voting
luoxuedeMacBook-Pro:voting luoxue$ truffle unbox react-box
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:              truffle compile
  Migrate:              truffle migrate
  Test contracts:       truffle test
  Test dapp:            npm test
  Run dev server:       npm run start
  Build for production: npm run build
  • 項(xiàng)目結(jié)構(gòu)


    image.png
  • contracts:編寫智能合約的文件夾冗美,所有的智能合約文件都放置在這里
  • migrations:部署合約配置的文件夾
  • src:基于React的Web端源碼
  • test:智能合約測試用例文件夾

編寫智能合約

  • 在contracts文件夾下創(chuàng)建Voting.sol文件
  • 編譯環(huán)境: remix-online (remix.ethereum.org)
  • 創(chuàng)建合約對象Voting,存candidtae着憨,bytes23[]是可變的
contract Voting{
    
    
   // luo
   // xue
   // ll
   // xx
   // mm
   
   
   bytes32[] candidates = new bytes32[](5);
}
  • 構(gòu)造函數(shù)
 function Voting(bytes32[] _candidates) public{
        
        for(uint i =0; i<_candidates.length;i++){
            candidates[i] = _candidates[i];
        }
        
    }
  • 創(chuàng)建一個(gè)字典:候選人-》票數(shù)
mapping(bytes32 => uint) candidatesVotingCount;
  • 創(chuàng)建投票方法
 function votingToPerson(bytes32 person) public {
        candidatesVotingCount[person]+=1;
       }
  • 檢查是否是合法的候選人
    function isValidPerson(bytes32 person) constant internal returns(bool){
        for(uint i = 0; i<candidates.length; i++){
            if(candidates[i] == person){
                return true;
            }
        }
        return false;
    }

  • 完整版
pragma solidity ^0.4.4;

contract Voting{
    
    
   // luo
   // xue
   // ll
   // xx
   // mm
   
   // ["luo","xue","ll","xx","mm"]
   bytes32[] candidates = new bytes32[](5);
   
   mapping(bytes32 => uint)candidatesVotingCount;
   
   function Voting(bytes32[] _candidates) public {
       for(uint i =0; i<_candidates.length;i++){
           candidates[i] = _candidates[i];
       }
   }
   
   function votingToPerson(bytes32 person) public {
        assert(isValidPerson(person));
        candidatesVotingCount[person]+=1;
       }
       
    function votingTotalToPerson(bytes32 person) constant public returns (uint) {
        return candidatesVotingCount[person];
    }
    
    function isValidPerson(bytes32 person) constant internal returns(bool){
        for(uint i = 0; i<candidates.length; i++){
            if(candidates[i] == person){
                return true;
            }
        }
        return false;
    }
   }
   
  • remix 檢查調(diào)用情況


    image.png

    image.png
  • 復(fù)制粘貼并更換掉simple sample.sol 替換成voting


    image.png
  • 在migration換掉部署文件中相應(yīng)部分


    image.png
  • 編譯Voting.sol
    打開truffle控制臺

$ truffle develop

編譯合約


image.png

發(fā)現(xiàn)build文件夾里多了一個(gè) voting.json文件


image.png
  • App.js里面 改json的import


    image.png
  • 改this.state里面的狀態(tài)墩衙,存儲候選人相關(guān)信息

constructor(props) {
    super(props)

    this.state = {
      canddidates:[
        {
          name:"luo",
          count:0,
          id:101
        },
        {
          name:"xue",
          count:0,
          id:102
        },
        {
          name:"ll",
          count:0,
          id:103
        },
        {
          name:"xx",
          count:0,
          id:104
        },
        {
          name:"mm",
          count:0,
          id:105
        }
      ],
  • 改路由


    image.png
  • 與鏈上交互
    通過get web3交互
    注:
    =>是個(gè)js 的箭頭函數(shù)
    this.instantiateContract() 初始化合約

    image.png

  • 修改合約初始化,獲取合約實(shí)例


    image.png
  • 取到候選人的票數(shù)


    image.png

看控制臺輸出:
兩個(gè)1票3個(gè)0票


image.png
  • 修改狀態(tài)機(jī), 讓網(wǎng)頁上顯示合約上的票數(shù)


    image.png
  • 寫修改函數(shù)甲抖,注意參數(shù)不用var 定義變量


    image.png
  • 在remix里投票漆改,看網(wǎng)頁上也有實(shí)時(shí)變化
  • 加投票按鈕


    image.png
  • 從input 里獲取資料,ref


    image.png

    從name里獲得了input的value
    把contract變成全局變量
    在點(diǎn)擊button里面調(diào)用


    image.png

    但要注意准谚,這里from 的要用web3來調(diào)用
  • 然后刷新票數(shù)挫剑,直接復(fù)制上面即可


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柱衔,隨后出現(xiàn)的幾起案子樊破,更是在濱河造成了極大的恐慌愉棱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哲戚,死亡現(xiàn)場離奇詭異奔滑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顺少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門朋其,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脆炎,你說我怎么就攤上這事梅猿。” “怎么了秒裕?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵袱蚓,是天一觀的道長。 經(jīng)常有香客問我几蜻,道長喇潘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任梭稚,我火速辦了婚禮响蓉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哨毁。我一直安慰自己枫甲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布扼褪。 她就那樣靜靜地躺著想幻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪话浇。 梳的紋絲不亂的頭發(fā)上脏毯,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音幔崖,去河邊找鬼食店。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赏寇,可吹牛的內(nèi)容都是我干的吉嫩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗅定,長吁一口氣:“原來是場噩夢啊……” “哼自娩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渠退,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忙迁,失蹤者是張志新(化名)和其女友劉穎脐彩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姊扔,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惠奸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恰梢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晨川。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖删豺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧怜,我是刑警寧澤呀页,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拥坛,受9級特大地震影響蓬蝶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猜惋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一丸氛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧著摔,春花似錦缓窜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摹察,卻和暖如春恩掷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背供嚎。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工黄娘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克滴。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓逼争,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劝赔。 傳聞我的和親對象是個(gè)殘疾皇子氮凝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容