主頁 > 區塊鏈 > solidity投票智能合約代碼

solidity投票智能合約代碼

2022-03-29 07:02:20 區塊鏈

pragma solidity >=0.7.0 <0.9.0;

//投票實驗
contract Ballot{

    struct Voter{
        uint weight;//投票(單票)權重
        bool voted;//是否投過票,true為投過票,bool型別默認值為false
        address delegate;//想要委托投票的節點地址,address默認值為0x0
        uint vote;//想要投票的節點的索引值(被投票節點資訊用一維陣列proposals存盤)
    }
    
    struct Proposal{//被投票節點的相關引數
        bytes32 name;//被投票節點的姓名標識
        uint voteCount;//累積被投票數
    }

    address public chairperson;//投票管理員地址
    mapping(address => Voter) public voters;//地址對投票節點的資訊的映射
    Proposal[] public proposals;//一維陣列存盤被投票節點資訊

    //構造方法、建構式
    //solidity和其他語言不一樣,建構式僅在部署合約時呼叫一次,后續呼叫合約不呼叫其建構式
    //且一個合約只能有一個建構式,不能進行建構式多載
    constructor(bytes32[] proposalNames) public{
        chairperson = msg.sender;//將第一次呼叫該合約的節點設定為管理員
        voters[chairperson].weight = 1;//將管理員投票權置為1

        for(uint i=0; i<proposalNames.length; i++){
            //將所有被投票人姓名初始化進一維陣列proposals,并將其對應票數初始化為0票
            //.push(),括號中內容需要強調資料型別,eg:arr.push(uint(6));
            proposals.push(Proposal({
                name:proposalNames[i],
                voteCount:0
            }));
        }
    }

    //由管理員授權可投票節點
    function giveRightToVote(address voter) public{
        //require中判斷條件為false時,輸出字串"xxx...",例外會被拋出,程式執行會被掛起,
        //未消耗的gas會被退回,合約狀態會回退到初始狀態
        require(
            msg.sender == chairperson,"Only chairperson can give right to vote."
        );//執行此function的節點一定為管理員節點
        require(
            !voters[voter].voted,"The voter already voted."
        );//若voter沒投過票
        require(voters[voter].weight == 0);
        //呼叫合約的人是管理員、待授權節點還沒投過票、帶授權節點投票權重為0時,進行授權
        voters[voter].weight = 1;//上述三個require()均成立時,授權票數
    }

    //投票授權
    function delegate(address to) public{
        Voter storage sender = voters[msg.sender];
        require(!sender.voted, "You already voted.");
        require(to != msg.sender,"Self-delegation is disallowed.");
        //sender滿足的條件:要有投票權限、沒有投過票、被授權節點不是自己

        //判斷代理節點地址是否為空:address(0)或者address(0x0)
        while(voters[to].delegate != address(0)){
            to = voters[to].delegate;//找到最終的代理節點
            require(to != msg.sender,"Found loop in delegation.");//若代理節點最終是自己則回退到初始狀態
        }

        sender.voted = true;//票權代理出去,狀態改為已投票
        sender.delegate = to;//票權代理地址
        Voter storage delegate_ = voters[to];//取出代理節點狀態

        //若代理節點已投過票,將新代理的票權投出去,反之則將代理節點票權加和
        if(delegate_.voted){
            proposals[delegate_.vote].voteCount += sender.weight;
        }else{
            delegate_.weight += sender.weight;
        }
    }

    function vote(uint proposal) public{
        Voter storage sender = voters[msg.sender];//通過地址獲取對應投票資訊
        require(!sender.voted,"Already voted.");//若sender未投過票
        sender.voted = true;//更改投票狀態為已投過票
        sender.vote = proposal;//保存已投票節點
        proposals[proposal].voteCount += sender.weight;//票權加和
    }

    //回傳票數最多的節點在一維陣列proposals中的索引
    function winningProposal() public view returns(uint winningProposal_){
        uint winningVoteCount = 0;
        for(uint p=0;p<proposals.length;p++){
            if(proposals[p].voteCount > winningVoteCount){
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }
    //輸出票數最多的節點name
    function winnerName() public view returns(bytes32 winnerName_){
        winnerName_ = proposals[winningProposal()].name;
    }
}
來源于solidity檔案官網:https://docs.soliditylang.org/en/v0.8.13/solidity-by-example.html

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

標籤:區塊鏈

上一篇:如何控制空輸入?

下一篇:返回列表

標籤雲
其他(138406) Python(28727) JavaScript(17738) Java(15205) C(12530) 區塊鏈(8218) AI(7469) 基礎類(6313) MySQL(5708) C#(5146) 腳本語言(PerlPython)(5129) 非技術區(4971) 爪哇(4840) PHP(4466) html(4440) Linux(4432) Android(4272) sql(4140) 熊猫(4047) 数组(3668) R(3659) C語言(3288) 反应(3268) C++語言(3117) css(2836) 数据框(2820) Java相關(2746) 疑難問題(2699) 节点.js(2645) 單片機工控(2479) json(2231) VBA(2203) 列表(2159) 扑(2110) 安卓(2073) Web開發(1951) 打字稿(1918) ASP.NET(1883) iOS(1797) 網絡通信(1793) 蟒蛇-3.x(1774) 數據庫相關(1767) VB基礎類(1755) .NETCore(1707) 细绳(1673) 開發(1646) 系統維護與使用區(1617) C++(1610) 基礎和管理(1579) JavaEE(1566) MongoDB(1564) HtmlCss(1545) Unity3D(1537) 專題技術討論區(1515) .NET技术(1512) 循环(1504) 麻木的(1484) Windows客戶端使用(1484) 镖(1470) 字典(1467)

熱門瀏覽
  • 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
最新发布
  • solidity投票智能合約代碼

    pragma solidity >=0.7.0 <0.9.0; //投票實驗 contract Ballot{ struct Voter{ uint weight;//投票(單票)權重 bool voted;//是否投過票,true為投過票,bool型別默認值為false address deleg ......

    uj5u.com 2022-03-29 07:02:20 more
  • 如何控制空輸入?

    如何控制空輸入?我正在 React 中創建我的第一個組件,但我在如何控制或檢測輸入何時為空的邏輯方面存在問題。這個想法是根據其內容改變輸入的類,即如果輸入不...

    uj5u.com 2022-03-29 06:55:25 more
  • 如何將影像上傳到服務器目錄?

    我不確定這是否是一個壞主意,如果是,請告訴我,但我想要一個選擇檔案輸入以上傳到服務器的目錄。如果這沒有意義,假設我有一個網站檔案夾,并且我有一個公用檔案夾...

    uj5u.com 2022-03-29 06:54:31 more
  • 在物件陣列中單獨訪問屬性

    我確實發現了許多聽起來相似的問題,但對我來說沒有一個有效。OOP 相當新,所以請多多包涵。console.log(result)成功回傳以下物件:[ { name: 'horse', lid: 1...

    uj5u.com 2022-03-29 06:53:55 more
  • MongoDB查找號碼

    我正在將 MongoDB 添加到我的不和諧機器人中,我已經設定了它,所以當發生某些事情時它會 await ticketSchema.findOneAndUpdate(...

    uj5u.com 2022-03-29 06:53:06 more
  • JavaScript中具有默認值的引數在非默認引數之前

    在 JavaScript 中,可以定義這樣的函式:function func(a = 10, b){ return a b;}如何僅通過設定值來呼叫此函式b?
    uj5u.com熱心網友回復:只有通過顯式傳...

    uj5u.com 2022-03-29 06:52:19 more
  • Uncaught(inpromise)TypeError:Cannotreadpropertiesofundefined

    我正在以下方法中決議來自 CSV 的一些電子郵件,并且我收到無法讀取未定義的屬性(正在讀取“電子郵件地址”)。我什至嘗試過濾掉未定義的結果,但沒有運氣。如何...

    uj5u.com 2022-03-29 06:51:38 more
  • 打字稿創建類屬性,其值將用作另一個型別的屬性名稱

    我正在嘗試創建一個可用于定義另一種型別的類屬性:class TypeOne { public static readonly key: string = 'key';}class TypeTwo { public [TypeOne.key...

    uj5u.com 2022-03-29 06:50:26 more
  • Javascript中的簡單for回圈可以避免復制時陣列的突變嗎

    我有一個代碼片段如下 let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}] let arr...

    uj5u.com 2022-03-29 06:49:41 more
  • 如何對以破折號分隔的數字范圍進行排序?

    我有一系列數字如下:const a = ["11-50", "2-10", "1", "51-200"]我想正確地對它們進行排序["1", "2-10", "11-50", "51-200"]我嘗試了這兩種排序方法都無濟...

    uj5u.com 2022-03-29 06:48:19 more