Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
550 0 0
  主要功能1 X2 M( o4 V) l9 w% ]9 Z$ @" P
9 q# H& G6 B! h* \4 V5 N
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
7 j4 U) \! A, ^1 l( D( E
! B6 ]2 K1 X4 C. X( K
  1. pragma solidity >=0.7.0 <0.9.0;
    " [( \1 l: T/ R: Z5 ]* }7 l7 z

  2. , i8 X/ ^5 t" ?0 M- [
  3. //投票实验+ V: Y+ c. K, c
  4. contract Ballot{
    & S7 @+ n" U/ F9 R, Q

  5. . x) y6 e1 x# W! a$ w; m. O
  6.     struct Voter{" C$ N* q% Q5 K- B5 v. u9 F8 x
  7.         uint weight;//投票(单票)权重5 A7 p' ~1 b5 Z6 r' O( {1 P3 b% w7 I
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    ! w! P+ I+ x  K) K8 C3 O' f+ }
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0
    ( }& c) n+ A) {. C/ b
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    # q$ d( c/ y  ^- E
  11.     }9 K) h4 h+ F" q  R2 e0 l* |  P
  12.      0 `8 w' n1 s, {. f
  13.     struct Proposal{//被投票节点的相关参数" N& ?  b. ?- H, f# M$ |
  14.         bytes32 name;//被投票节点的姓名标识  I1 h4 @5 f9 r
  15.         uint voteCount;//累积被投票数" b3 ^- u+ }) ^  Z' @4 v6 D
  16.     }, |' H8 w9 z" D$ \$ O4 ^

  17. $ T+ ~5 y  N3 ~8 W. _5 B9 y7 g
  18.     address public chairperson;//投票管理员地址
    : y5 f4 [; q0 x6 b* m* W
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射% e' ]) C2 m8 Y# n/ x: X; K4 f
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    5 u* `+ J4 k( |" B3 k

  21. , m) m$ _. @! R- L6 [, k
  22.     //构造方法、构造函数, ?- ~, w% u* L) O
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数4 X6 E* H7 ^' v8 Y
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载- b# d0 N5 O; @9 }! Q3 H
  25.     constructor(bytes32[] proposalNames) public{
    $ C0 a! P* i; T5 L8 ]8 S0 ~
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    9 r- V8 \/ v, `4 z; ]0 n: c( J- l: @
  27.         voters[chairperson].weight = 1;//将管理员投票权置为13 S3 j3 c+ i/ y" ]- @

  28. % [( [2 Y4 U( F4 Y9 g) d, ?& C
  29.         for(uint i=0; i<proposalNames.length; i++){4 g% I% X% }# G* C/ J
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票  |. i3 h) A7 K$ w
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));, o" d- e: i2 v/ m3 f% i
  32.             proposals.push(Proposal({# K) r. |9 I$ g  [* y2 z
  33.                 name:proposalNames[i],: J9 y9 Q; g5 n. W
  34.                 voteCount:0
    2 s) y) z  S+ Y, u8 t' m$ I
  35.             }));
    ' |# b4 |- L4 g& W. F  v1 y* M, ]
  36.         }: f; W5 `2 B, v
  37.     }
    " u0 k7 t  H* d: ^3 B
  38. 1 ^8 v# N. H: x+ ^9 F6 h3 ?
  39.     //由管理员授权可投票节点3 j# J8 I* F. L" h
  40.     function giveRightToVote(address voter) public{7 f3 Q% _7 ?/ y4 j- N6 ?, V4 J
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,4 P! p4 X9 x( m2 y+ v4 N# @9 ^
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态- d% J0 Q) l/ L; U5 z
  43.         require(/ ?* F; k7 I5 A2 b) r) T# h% X
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    ; U' j  c# K4 z2 p6 B
  45.         );//执行此function的节点一定为管理员节点, e4 `: r" C+ d8 u* _0 f7 ?
  46.         require(
    * Q7 q3 y" D6 M  {
  47.             !voters[voter].voted,"The voter already voted."5 {; a3 |& X. ^' T
  48.         );//若voter没投过票
    ' f6 c/ Q2 m& `* \( e. E
  49.         require(voters[voter].weight == 0);! B* ~4 _4 ?- j7 l  p
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    7 _, W' K6 q% R2 r
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数0 J' R) y) Z+ S
  52.     }
    . k# g" P  @1 k' F
  53. * T5 V5 }& b; A, u* t
  54.     //投票授权/ `& Z1 R1 U0 ^6 o5 e$ ^& M
  55.     function delegate(address to) public{; H9 J+ ?, c1 C. N$ y
  56.         Voter storage sender = voters[msg.sender];
      l8 L  ]" U; X5 x& w6 d  d
  57.         require(!sender.voted, "You already voted.");) o' u/ v2 e6 d
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    , E% I2 W9 }0 n. h! T
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己( o5 m4 r: P" L+ r

  60. - N0 c9 @/ d4 e+ l& |  c  O" H
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)0 l# U( r6 M9 h  r7 q- v7 o* r
  62.         while(voters[to].delegate != address(0)){/ F( f7 b) t. Q  m2 ^9 ?
  63.             to = voters[to].delegate;//找到最终的代理节点& h, h; a  ~/ b* i
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态1 @' `* _& b. Q& _8 V7 ~
  65.         }  U) T: o; k) a1 a4 V7 X. Q0 m

  66. . E* U9 i& p' [( L6 k3 n: _/ s
  67.         sender.voted = true;//票权代理出去,状态改为已投票
    " F7 V8 ?6 g2 ^0 v4 x$ z: x# u3 p
  68.         sender.delegate = to;//票权代理地址* g& r. B: R. d+ {' M
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    6 i1 z9 m6 N% N9 I: S: m  Z

  70. + A% K1 w& ^+ C, C( ?  t
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和' e7 }+ f8 l" {0 X& w- {
  72.         if(delegate_.voted){
    , A( X+ g( t: q2 ]# R! C& F0 X
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    " F2 L. ?: s2 x
  74.         }else{
    . @$ H) ?- C6 @9 q' w
  75.             delegate_.weight += sender.weight;
    3 ^3 W3 P3 ~2 U4 X# f' @
  76.         }
    $ ?# K- O) x& z5 u
  77.     }  V# o, X( N( X
  78. 6 K) [! H9 k) O( i# F
  79.     function vote(uint proposal) public{
    % r. F% @# K' ^* J+ R
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息8 a, X& G6 B1 _
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
      T' [8 l; v8 M- ]5 r- Y: {
  82.         sender.voted = true;//更改投票状态为已投过票, {# F  W4 z) @7 C/ k, C5 M0 E- ~
  83.         sender.vote = proposal;//保存已投票节点
    ) ]! d+ F; a2 Z( c2 e0 J
  84.         proposals[proposal].voteCount += sender.weight;//票权加和! n# E3 `3 K- F- g; C
  85.     }
    ; C3 ^" a# c. T3 f

  86. % K$ N( r4 I8 d' c/ Q! w( U
  87.     //返回票数最多的节点在一维数组proposals中的索引
    8 ^0 f" z* X+ M. E3 e- B
  88.     function winningProposal() public view returns(uint winningProposal_){* U4 y% r* c) `; }( y, c
  89.      uint winningVoteCount = 0;
    1 B1 |+ G& l9 f5 c: J0 G/ x. I% g
复制代码

9 s2 {* b7 q" g7 V  }5 L/ N) s5 A# e$ {3 y2 f  t9 l: u+ y

4 M: A: `- J# D' n; H9 o9 Y, f0 y: t5 ]. I! i, V5 M, C
solidity投票智能合约代码,亲测可用
* `+ y3 c$ e* X
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14