Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
303 0 0
  主要功能
' u8 q3 }5 H$ U1 ]
. N& C0 T, o2 ], Z) a$ a4 w  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。3 d. j  z  n" N1 D' }! D
6 w% |7 F$ p: M6 ~
  1. pragma solidity >=0.7.0 <0.9.0;
    * |" ~  H, O4 T8 D4 r
  2. 6 g" o7 F$ A" y7 |& }; l
  3. //投票实验
    5 r$ e; |( r. z" f, H$ w+ E
  4. contract Ballot{
    7 \' w- l, q; P- s3 W& c; [* l
  5. , E0 F* I( d: h! y# g  e1 n
  6.     struct Voter{/ {  g% z4 [8 a9 Y$ v3 z
  7.         uint weight;//投票(单票)权重
    . V# D3 U0 w, r* I+ N! b, e
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    8 f2 S) O4 i: S3 R. [3 ~: A; u
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0! j4 u' H" a: u% B5 S# M0 o% i
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    6 }) r- ]; N2 _, ?4 h7 ~/ U- B- ^( I' S
  11.     }( {4 d" S, J% J1 n; g; t9 }
  12.      
    " u4 T, I0 O1 i. ?5 j: ^+ t3 Y
  13.     struct Proposal{//被投票节点的相关参数4 S$ N3 _0 C7 {+ y5 v" @! U4 F
  14.         bytes32 name;//被投票节点的姓名标识
    8 j. n1 Y4 G4 O! M2 X9 q0 ^; j
  15.         uint voteCount;//累积被投票数' h# T' M8 f2 W' |1 t4 @0 w% e
  16.     }2 P( i; B# S+ M2 e
  17. 1 v6 A( a; ~9 m/ j
  18.     address public chairperson;//投票管理员地址$ J: A1 x7 E0 p& ?7 K3 i
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    + g( b4 a( k' V
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息) v$ p0 l/ J  R) Q

  21. ! c# Y! J1 f# D  f
  22.     //构造方法、构造函数
    - t4 L6 [( ^0 t' Y
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    - E; c0 m" G: z6 |! T4 M2 x
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    ) d4 W% e2 o1 X6 e: {
  25.     constructor(bytes32[] proposalNames) public{& ~3 l( O. t2 Y: d8 z7 C
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    5 Z/ A. [# o1 @4 I3 t, D7 I
  27.         voters[chairperson].weight = 1;//将管理员投票权置为10 q" K: H5 l9 M+ }1 [  o2 y7 h. ]. ]

  28. 1 _+ A% r( o, e" \1 i
  29.         for(uint i=0; i<proposalNames.length; i++){
    5 j, q' b# g' g3 d5 O
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票
    : g3 g* F: T! z& s3 f
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));2 N# a8 n1 U* m3 g/ D; t# G# b8 l
  32.             proposals.push(Proposal({( ]4 T8 |. U5 x- U9 W" f
  33.                 name:proposalNames[i],
    3 S0 [+ P& O% m5 `$ z
  34.                 voteCount:0
    ) t0 C6 v7 y  E1 L6 V+ b
  35.             }));
    6 R- \6 A/ z) Y: K
  36.         }: O- o/ V* r+ t1 s/ P5 ~
  37.     }
    0 b2 s+ j! i! @1 a0 K9 \- J
  38. 1 w7 v5 W. T- v9 i# E7 \7 d. U
  39.     //由管理员授权可投票节点; X$ m, y5 Y, s! S, r3 f7 E
  40.     function giveRightToVote(address voter) public{
    " f6 n! V9 N1 O" _# s. p
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,/ B; }8 u! z0 B+ S* |
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态' b2 G9 N0 K2 @: k/ Z- p: t0 F
  43.         require(
    $ Y  X3 @3 f- A* q) t
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."0 B& d+ Y( a7 \
  45.         );//执行此function的节点一定为管理员节点
    : s; J4 Y3 @/ u2 o* V
  46.         require(
    ) Q9 ?/ U, \  A: H( R5 {
  47.             !voters[voter].voted,"The voter already voted.": l) J; ?' Q. M
  48.         );//若voter没投过票! V6 m/ E* q" }# _# t; N
  49.         require(voters[voter].weight == 0);
    5 }% ~$ W5 _6 `
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    + ]: P7 ?/ `9 p8 Z( i
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数0 R' }3 S: F3 J
  52.     }  t, v, t! e+ |

  53. $ e" B' G5 z0 l, N8 W
  54.     //投票授权
    + N& \4 \3 l8 z6 Y$ G
  55.     function delegate(address to) public{% c: c/ z1 B  p  E0 ~
  56.         Voter storage sender = voters[msg.sender];
    " R" F3 l/ k% r
  57.         require(!sender.voted, "You already voted.");
    6 c% |* t' y8 p, R4 R# V  \6 d
  58.         require(to != msg.sender,"Self-delegation is disallowed.");: Z) Q& ~4 C+ z5 ?
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己
    ; w/ K2 R3 v, o; d
  60. , \2 d+ S: c  C  o& K/ R4 c& S: Z
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    ; U9 L) @/ S9 a; R4 Y) C
  62.         while(voters[to].delegate != address(0)){' P3 [* @  v0 S# O; u1 z( {3 `; X
  63.             to = voters[to].delegate;//找到最终的代理节点
    + \$ y. L5 V9 I8 [& ]5 b; ?' |
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态! J: K9 \8 W, l: Y3 P7 y' Y, i/ X2 h
  65.         }- j% x* m& b' `6 j0 u

  66. * Q: Z/ L- m# R: h3 e5 _
  67.         sender.voted = true;//票权代理出去,状态改为已投票/ d+ o& G9 D- q0 H) V' P. ]! f
  68.         sender.delegate = to;//票权代理地址
      v% s6 u4 e8 q
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    $ O( h  {8 ^% z) q
  70. . i! z% E0 A6 T1 e/ o, T( C& i
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和5 S# d0 p# N- ~
  72.         if(delegate_.voted){5 p; t3 R7 t# f) c4 C
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    9 `" E1 k3 Y1 Z/ q0 N3 G5 r
  74.         }else{
    . I8 s' L$ R5 w1 n; o; i8 z; o
  75.             delegate_.weight += sender.weight;
    4 z! P/ V, H4 z+ p
  76.         }
    " H* R" O) `( r% G9 U, N( _
  77.     }& v- P% C. _5 i$ R
  78. " Q8 A9 A, k# C$ F0 V% P! Q
  79.     function vote(uint proposal) public{' P6 g2 k& @3 N5 P
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息
    / A9 L, I* p* ~. K  D
  81.         require(!sender.voted,"Already voted.");//若sender未投过票2 {# h/ y& U, w2 K1 L
  82.         sender.voted = true;//更改投票状态为已投过票
    + l# }9 `# O% p2 g6 l/ c2 R
  83.         sender.vote = proposal;//保存已投票节点/ `9 ?% ~* s# K2 Q1 {; G. i& \
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    / [6 W' }  @: C/ E+ W; l
  85.     }
    ( `8 b' I5 P/ p7 k& O1 q
  86. 3 P3 a. K  @; Q- {3 W
  87.     //返回票数最多的节点在一维数组proposals中的索引) u4 q* E0 i8 q5 ?, E$ P# }
  88.     function winningProposal() public view returns(uint winningProposal_){7 u1 X+ O& V/ t
  89.      uint winningVoteCount = 0;: ~7 b) \2 d! M3 `4 r( ]% p/ l
复制代码

5 \' K4 ~) ]$ A. O6 N! Q% R/ H1 Q  x8 a0 d
2 }4 L4 ]& [7 S4 V! y

+ z, A1 ]2 v* osolidity投票智能合约代码,亲测可用! ~# Z) F& I: T7 B; L# q3 P0 Z
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14