Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC-20代币solidity投票合约代码

掘金稀土
395 0 0
  主要功能
3 e! U* z" l: ~
+ k% Z* @3 o/ @8 `# H6 m- [  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。0 b' U! B$ a* G" }

$ H0 y. W& s8 D: `
  1. pragma solidity >=0.7.0 <0.9.0;
    . K, Z% ?; C6 h3 j0 h! _
  2. - B6 V$ Y5 A! |5 a; T
  3. //投票实验3 S# K5 r2 E2 l$ X/ E' d! I
  4. contract Ballot{
    ) {: W: Y" A  k. v

  5. 5 |, M: v8 M% T
  6.     struct Voter{  L+ x* C4 m- Z* l5 S3 R
  7.         uint weight;//投票(单票)权重. q) O4 h# {! P5 I* F% {/ H4 t# `
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    & `: ?, B% U2 J# f' G
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0
    % o2 [; Z$ y3 ], E9 l, I1 @
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)- M! c& k5 `0 y! X5 o) a% f8 J
  11.     }
    * P& L5 @! T6 G
  12.      
    ) ~' y% p7 B( a. p8 V( Z
  13.     struct Proposal{//被投票节点的相关参数
    8 e# c5 t5 ^' M- P( t
  14.         bytes32 name;//被投票节点的姓名标识( N% G' f# r  ]
  15.         uint voteCount;//累积被投票数
    . |- u2 u: t% V* Z, a
  16.     }
    ' s2 l0 u% @& i9 S- g. U

  17. ; A) O8 c2 M( D5 Q: Y; y
  18.     address public chairperson;//投票管理员地址5 k8 o7 @0 J& F
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    & u5 J6 F$ T  G3 U) A) u
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    ' d5 i0 `5 R3 w) j3 d6 h/ J- f

  21.   h& w" D2 J7 r; u' F+ M
  22.     //构造方法、构造函数
    ! i5 w' o9 n: e" `& M; d
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数6 s( w0 z. z$ [
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    + j8 D: |# @' i0 j% c' f% X' D
  25.     constructor(bytes32[] proposalNames) public{% L6 a2 \/ q7 ^
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员/ _" u; h5 R5 c/ i" s# G( n
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1# C" Q9 x; k0 O' T
  28. 6 k1 h4 C0 j( r- I
  29.         for(uint i=0; i<proposalNames.length; i++){
    # |: u: e# K% f& b
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票" l6 y4 T0 K) k: y: R0 C
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));# [/ z& o; m! F2 w% |. X2 Y
  32.             proposals.push(Proposal({: p; g( ]& F1 M9 F4 M
  33.                 name:proposalNames[i],
    ( C" f( Q" g4 z" D. `5 X9 p; J/ y: P
  34.                 voteCount:0
    - O' }; T5 p. F" `( M3 N4 M
  35.             }));7 @9 X! e, S, T; f7 P) l
  36.         }9 h' _3 @- u+ v4 t
  37.     }
    % P+ Y, u) V, L

  38. 6 v/ T# C: p* I! x+ u2 P* Y$ G
  39.     //由管理员授权可投票节点
    . j. e! p6 R) b- M) f3 p
  40.     function giveRightToVote(address voter) public{5 S3 E8 c7 l7 ?5 C3 A& Z
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,
    9 d6 T3 Y+ \" ], i& ?6 G3 E
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态4 \7 a! h' I1 S8 h" g) t
  43.         require(
    8 x; i# q7 o! R9 Q9 ^0 r
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    % z) ~; `5 g1 X) G0 ^5 G0 l
  45.         );//执行此function的节点一定为管理员节点( `3 m% o) Y% k. F/ ?( V) U
  46.         require(* B. w4 K; B; ~6 b2 C4 K% U' h
  47.             !voters[voter].voted,"The voter already voted."
    ( t  O6 B0 `, ^
  48.         );//若voter没投过票
    , m1 o) S1 Q( w& P' I4 r' R- e# ?
  49.         require(voters[voter].weight == 0);4 i/ h$ d/ L1 y" F3 v( ~% O
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    ; g: a4 H0 B& W7 U
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    ! H1 w" u: L& U# h0 a; ]) k0 V
  52.     }
    ) Q4 Q, P9 b) n& V

  53. & ?* I  v& Y  t4 T; P
  54.     //投票授权4 n% [) H4 |& Y6 `
  55.     function delegate(address to) public{
    ( H9 t" w  z! ~1 q
  56.         Voter storage sender = voters[msg.sender];
    8 E) W5 ^- y- F+ i/ Y/ F9 a/ N
  57.         require(!sender.voted, "You already voted.");: b: w' U: I6 x6 }- m
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    8 O, R/ ^0 L& g0 Y) f5 |
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己
    - Q/ W1 O, T# H: T0 p6 M! U
  60. 6 O+ H5 Z- F, I( h
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)  d4 e6 n0 Q2 n3 D
  62.         while(voters[to].delegate != address(0)){6 [' n* p8 n9 w9 h
  63.             to = voters[to].delegate;//找到最终的代理节点$ _' E3 B& k- U( o) D1 i$ @/ W/ P
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态7 j! F) V3 r9 h; U
  65.         }
    9 P& q- b4 r$ W1 o
  66. ) I# [5 A2 L6 J2 Z: P) Y. Q
  67.         sender.voted = true;//票权代理出去,状态改为已投票; M+ F" I2 J8 t: w
  68.         sender.delegate = to;//票权代理地址
    ( y0 F/ W- Z$ z4 E9 m0 V
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态. e1 _) y& c+ l

  70. , |; ~, C5 \$ `( Z/ J
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和
    ' H, n8 T1 p  L9 p$ U
  72.         if(delegate_.voted){
    # M- @% b# w/ j
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    : r- E$ Y- z2 H
  74.         }else{5 O6 A# J& c" t" M
  75.             delegate_.weight += sender.weight;
    % I+ i4 ?& Q- R6 W
  76.         }+ W3 r) u! \3 r% x0 t
  77.     }
    1 @% [# s3 {8 P5 n4 z

  78. 4 W& k; Y6 b( u0 Z3 w
  79.     function vote(uint proposal) public{
    9 g+ |4 }# i. m
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息
    1 J0 _+ X5 Y, `# s, Q# c
  81.         require(!sender.voted,"Already voted.");//若sender未投过票  A: x  v" H/ G' C4 a2 Y& @
  82.         sender.voted = true;//更改投票状态为已投过票7 n, d0 @/ P& B
  83.         sender.vote = proposal;//保存已投票节点: ?9 ~6 p0 j3 t3 }+ B  N3 n
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    - u/ k- _" Q; l0 P, q
  85.     }
    ! A& v1 E0 p9 H9 w  c
  86.   S! V9 X" a" t
  87.     //返回票数最多的节点在一维数组proposals中的索引
    9 G- Q  R9 b1 A5 H( P+ c2 ]
  88.     function winningProposal() public view returns(uint winningProposal_){
    ) g  u" N9 P/ w8 z$ ^' H8 D
  89.      uint winningVoteCount = 0;) y& j! ?! b; s* S0 T9 W' x  W
复制代码

5 n  d8 l( R: s% [5 h7 O4 B. e: S$ ]
: u( h+ Z! D' r: l/ ~; |% k# Y% E1 @

/ F4 k! ^3 l# M8 _solidity投票智能合约代码,亲测可用
. O% M' m! W3 O! L# e5 }
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14