Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
340 0 0
  主要功能4 H& p! r2 i! c9 v2 ]7 f
* E1 A8 Y6 c, r2 K6 m: R
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。. {& o  L! @" F+ u
. }' t8 Y; B8 U: R" i. |% N5 e
  1. pragma solidity >=0.7.0 <0.9.0;' Y0 ?4 X! i/ X) B
  2. ( K1 \; u9 M& v/ h6 R
  3. //投票实验
    , t, u7 C/ n) _
  4. contract Ballot{
    8 c9 ^/ D5 n1 N# P6 L) ^
  5. 1 i, \9 l: D& h; g# k
  6.     struct Voter{
    ; c* t, P, e. k7 w6 k: b  `" c
  7.         uint weight;//投票(单票)权重+ V3 b" w+ v" Z. ?
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    1 y1 j! I) q* E* X
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x05 `* V# u" v$ r0 p
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    / v/ @( r1 ]1 q4 N: i$ d0 V
  11.     }
    4 D/ r& F2 v/ Z- V
  12.      / r% I& G4 U& C- J' @; p6 V
  13.     struct Proposal{//被投票节点的相关参数
    / O# z: I$ q* b$ K1 i, E% \
  14.         bytes32 name;//被投票节点的姓名标识
    , \- ~# K5 [7 b4 M
  15.         uint voteCount;//累积被投票数
    9 l0 `6 l$ K6 x  l) v3 `" l
  16.     }# G8 [7 Z0 {" K& I, Y: D
  17. & k% ~0 G3 f) N9 Q0 W9 ^3 @4 C/ A* Y8 _0 R
  18.     address public chairperson;//投票管理员地址. u4 {! V* G) H, P$ g5 w/ b
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射5 `/ A7 d' e6 `  M# U
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    : u6 f( X- r. ^; y8 L: @6 Q

  21. 2 A. O) L' Y" y& H) r6 ^7 f
  22.     //构造方法、构造函数3 S1 `7 ]$ Q7 h1 K- z) m
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    ( `0 g' h/ Z% g
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    , e' z7 [3 @: F6 L% W
  25.     constructor(bytes32[] proposalNames) public{
    : b% x: I" H( I; \
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    3 h# W" ~8 V7 K$ r4 t1 d
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1
    " o8 T# w# x2 y  r  y4 m
  28.   K4 i* b2 u( i& T1 ]% J
  29.         for(uint i=0; i<proposalNames.length; i++){
      R( v8 ~5 `/ z' f8 O
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票- i" q4 k; Q  x/ x. c3 E
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    8 n* |8 ~/ D2 w  H+ O
  32.             proposals.push(Proposal({) h& H4 T0 V8 Z/ d, u
  33.                 name:proposalNames[i],
    ! }6 U9 W* b" t
  34.                 voteCount:0/ X" Y. z* B  L4 e
  35.             }));
    . E+ |5 E% n& W3 X( s+ V
  36.         }
    # F' v* A$ m0 t$ v  ?2 Z$ _
  37.     }
    $ J& F$ m% w, i9 n
  38. / Z# b/ _/ B3 j* g" G6 h5 @
  39.     //由管理员授权可投票节点# [% c* b* L* @( ~( q1 h
  40.     function giveRightToVote(address voter) public{
    , g, j* k2 z& @, @. h$ W4 _
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,+ |- P" N' d' n8 N$ a
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态9 Z% @1 H& s2 v+ j
  43.         require(+ y3 x& V: Z# L, r& {6 I
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    2 P/ o8 f; ~9 }# S/ Q
  45.         );//执行此function的节点一定为管理员节点
    ' x/ P. [! K3 _- ~1 k. h
  46.         require() O  _: u  t& O5 E% E5 K6 m0 d# [+ g
  47.             !voters[voter].voted,"The voter already voted."8 p7 @  O2 J' z* E% y
  48.         );//若voter没投过票( y4 e3 ]) v' I1 f" n4 ^
  49.         require(voters[voter].weight == 0);
    ( P; }( y2 ]- M: r- Q9 a; H6 A; t
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    4 k8 w0 F7 g8 j) A, {" k
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数7 y* m/ }, ^- a2 Q* l, l
  52.     }' o/ D8 u/ k5 V8 S5 z; o. C

  53.   K# c+ V# s0 q" q
  54.     //投票授权
    - f* K1 |3 \; z8 L
  55.     function delegate(address to) public{, R7 L2 X: y& a" i9 p5 X+ x
  56.         Voter storage sender = voters[msg.sender];7 _& O: _& P) C8 u
  57.         require(!sender.voted, "You already voted.");) t$ E) u; I4 B
  58.         require(to != msg.sender,"Self-delegation is disallowed.");- @' z$ F2 Y: J7 o3 v0 ]: Y! b( z% o
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己" b# K% r( U$ I6 J
  60. % A" \  E5 Z, X6 U6 L' r: }7 l
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)" a) o, {6 o" d, b$ O3 J
  62.         while(voters[to].delegate != address(0)){5 i2 k* L" s" Z9 T5 h
  63.             to = voters[to].delegate;//找到最终的代理节点8 t( |$ M/ r: K, F/ f
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态# c7 _+ a+ D& [& A# H9 d, P
  65.         }
    $ s% O+ }1 ^3 U& c" T5 \- ^
  66. 0 `0 O- x& V4 L) N" y0 y
  67.         sender.voted = true;//票权代理出去,状态改为已投票5 k9 C6 o9 N' x9 t/ S  R
  68.         sender.delegate = to;//票权代理地址
    9 q5 a2 Z4 c/ u+ ?# Q% B
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    % J3 q/ H; r& h/ d. r, L, ?; ?# N

  70. 1 w; Q: U* `, ^5 j, M: n7 p& S
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和% q4 ^& X7 l% v
  72.         if(delegate_.voted){
    ! l1 S) ]3 m1 ?1 h( u# a/ V: Q
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    * O# V  I( I3 K5 S- ]# r- h6 ]' y5 I
  74.         }else{" o  b3 r' U! e0 R
  75.             delegate_.weight += sender.weight;
    # e8 d. c+ d- i2 @' w5 H
  76.         }
    2 W9 l3 W6 c7 j& b! _& h; f$ S% v9 N9 B
  77.     }
    / }* X/ c  x3 q* P7 J9 y

  78. 9 m# h5 c: s: \8 e
  79.     function vote(uint proposal) public{" h) i: f, F# e
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息7 W& |  a* F* j. ?; x: V5 t
  81.         require(!sender.voted,"Already voted.");//若sender未投过票: U# j8 T; T, J2 O% x! ~
  82.         sender.voted = true;//更改投票状态为已投过票; w8 K& C1 r& h4 O9 T' J( k/ A
  83.         sender.vote = proposal;//保存已投票节点7 G" C) o% x2 v; n  n
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    + H" x: a) D, c% I
  85.     }+ q0 h9 ?6 m$ \. |: G

  86. / M6 s  A6 e/ E1 d
  87.     //返回票数最多的节点在一维数组proposals中的索引
    & F$ h' J. t2 W7 ^9 g
  88.     function winningProposal() public view returns(uint winningProposal_){' N0 V8 P% t! O. Q! x
  89.      uint winningVoteCount = 0;
    1 {* t; V5 V. L! V
复制代码
. {) u$ m9 W* r1 k; E+ D

3 x7 T  ?. p% a0 [
* J% w" |& n' q& i* H' M" P6 B) v0 z1 K0 t4 Y
solidity投票智能合约代码,亲测可用
, B6 q4 h' d8 L% J9 T' [0 p
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14