Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
552 0 0
  主要功能
5 k9 i( C! R! j5 Q: s
5 l8 y$ h( ~* |! _  s  Z  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。! f- X  B  ]' q: P4 g
) u; T# m" c9 g* P9 T
  1. pragma solidity >=0.7.0 <0.9.0;2 P3 f1 R3 H" @
  2. $ g) r  h5 P0 K" [3 E+ z$ ~! c
  3. //投票实验- _7 M- J: K+ G0 u7 o0 }3 i
  4. contract Ballot{
      l5 [; P) a4 @6 F

  5. 7 r' ^: ]  O# e' ^6 I0 D
  6.     struct Voter{! s0 g) g5 L  c6 Z4 h
  7.         uint weight;//投票(单票)权重
    , O( T1 p' C' k$ q9 Z8 V
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    5 ^! \6 G1 n8 V9 E7 `, a. T6 w
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x08 _" t4 d1 c% O( d7 ^
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    ) p1 {+ x) q+ _, Q. D) M
  11.     }5 ^$ N+ W; X5 k; V3 E) K
  12.      + W7 f& I+ Z" \4 I  J
  13.     struct Proposal{//被投票节点的相关参数/ Y: p/ U- _, h2 x4 x# o: a5 Z
  14.         bytes32 name;//被投票节点的姓名标识
    % q8 C9 s2 D0 p# G+ l) H# W
  15.         uint voteCount;//累积被投票数4 E9 m9 _! W4 T+ e7 T! I
  16.     }+ a' P4 [$ j  Y' L2 _. g
  17. : T+ H& s$ J- @
  18.     address public chairperson;//投票管理员地址
    ' L/ N4 w& X( `- W
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    ; i2 q( E6 T4 H
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息* \3 V$ t) \0 z

  21. 6 U! ~( p  f: ^& r9 `, s$ C) a( P
  22.     //构造方法、构造函数
    ! a! f! N! \3 h9 n1 S" {2 D8 ~5 N
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数9 Y4 r' _3 O0 i0 k! q& J  |
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载$ Q: Q: j8 K, ~; e, m) b$ c. B
  25.     constructor(bytes32[] proposalNames) public{
    ) {5 Q) v' ~0 X; \0 k! V
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员0 R6 ?! i# ?) Z& W. [, X# I
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1% y! r; S7 f8 s# ~! O$ E& i
  28. ) Y* L0 H- Y. Y0 i
  29.         for(uint i=0; i<proposalNames.length; i++){
    0 c7 |# l2 {3 b, p# |% P
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票5 p+ G$ e. {% Z4 R# O  z( p- M+ d
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));* o& O, y) ~8 u6 z* c
  32.             proposals.push(Proposal({. x% P* M- B, D' p: y, s1 t
  33.                 name:proposalNames[i],
    % j, h& Q5 j, D! b
  34.                 voteCount:0
    , q% _( i) G: u$ w7 G* c* y
  35.             }));
    ) C3 L4 k5 f2 ^8 a+ M
  36.         }& Y3 h) u- r( _2 p! n; M" g
  37.     }0 V2 a5 L# k7 M# M2 ?) H

  38. 3 f" R3 V  T$ W, I' J
  39.     //由管理员授权可投票节点
    9 {$ S" U7 G8 I9 y% O# q3 f
  40.     function giveRightToVote(address voter) public{
    9 _! N( ?6 t. y, ?0 V! |+ H  M% n( |/ d
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,
    8 T, r0 [3 V+ }. R; D8 L
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态- a4 N- _! P3 c) W* |, S
  43.         require(
    3 X! ]5 i9 e# q) d7 J! q8 j1 r' ]
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    7 I9 K: U9 N0 F# e) X+ f1 @- b+ E
  45.         );//执行此function的节点一定为管理员节点' c3 h+ }& @6 F5 j6 G4 K+ X9 _+ o: v
  46.         require(1 O2 z3 y( j/ c
  47.             !voters[voter].voted,"The voter already voted."  w. R$ ?0 m( r8 z
  48.         );//若voter没投过票
    8 H/ r) N" y6 h5 ?/ W' J  ~
  49.         require(voters[voter].weight == 0);7 A' |& }9 k. ]3 J! C
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权% a) l# x, u; f, J: K3 ~$ P
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数/ _5 N  d/ L2 |8 L& d2 u/ V
  52.     }
    ( H& Q9 @" j5 t1 Y, M: A' c1 D

  53. 1 s- {  O  I, m! c9 _
  54.     //投票授权3 P3 B3 s, Z$ ~* H* W9 z' Q: u
  55.     function delegate(address to) public{4 d* S+ h4 ~0 ~% g/ C, G; H. c
  56.         Voter storage sender = voters[msg.sender];$ {3 `1 p4 L$ C
  57.         require(!sender.voted, "You already voted.");
    * Q: s" k, b; ?- [
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    & N$ O. d  ]! x) h# w
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己
    , [/ e0 S" \( D8 Q
  60. " q. g6 \7 B& S  E7 S: @
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    ( b7 k; t2 }$ A/ H9 E' l( c( _" ^
  62.         while(voters[to].delegate != address(0)){" r4 g. }3 X) b- u/ e- y* N  j
  63.             to = voters[to].delegate;//找到最终的代理节点
    ; N/ S* A* X4 s0 G
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态) u! R* s. r/ E* [6 |' Y4 h
  65.         }
    . |( G9 l/ R; G$ B, B

  66. ! Z* M# y& ]$ i7 F% _" N; k+ n0 I
  67.         sender.voted = true;//票权代理出去,状态改为已投票
      ~5 O1 p5 m) F' W) H; o" o# e/ Q
  68.         sender.delegate = to;//票权代理地址; t: h% X0 ]3 n4 y& N/ ?0 L* r
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    ! g$ K3 X3 w. F6 c( v" y( r

  70. 2 A. R& A. N; p1 N- B
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和2 n! \4 P2 s" a/ |3 _. y
  72.         if(delegate_.voted){
    / [: j. H# ^2 z: S# D' s
  73.             proposals[delegate_.vote].voteCount += sender.weight;) |3 C3 W  ?9 j6 }) T
  74.         }else{4 }7 s: c  p4 i; C; J  a
  75.             delegate_.weight += sender.weight;- ?5 O% O5 h5 V# ~
  76.         }
    - Q1 X, j- W1 W2 C/ L" M
  77.     }
    7 v: U( |, G6 q- f: R' v

  78. * x# A' L2 v) y) t1 Q
  79.     function vote(uint proposal) public{
    ) q: D& c  y, A+ N
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息+ `" w3 @* ]5 D8 b! B
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    . D: `+ c# }$ R5 Q3 j, C: M. e: r
  82.         sender.voted = true;//更改投票状态为已投过票7 t4 S- h- f) Z, u
  83.         sender.vote = proposal;//保存已投票节点. A( L8 \% A+ r7 R1 K
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    * y% d0 W0 G$ d- D
  85.     }- s2 }0 l7 c/ X! W

  86. 5 ], ^/ A) ]1 r9 Q3 y, e% m/ Q
  87.     //返回票数最多的节点在一维数组proposals中的索引
    : j( E: O  ~: H
  88.     function winningProposal() public view returns(uint winningProposal_){
    : r" y4 R( s9 v0 d" L
  89.      uint winningVoteCount = 0;9 R( i5 B- g/ A& z
复制代码

: C$ U+ {1 J& }+ A4 M
$ K4 ?7 g8 n2 ^+ V
1 z' _) g4 E3 m) M
& B' G* k) J% M# J7 i* f7 v7 k3 R. Gsolidity投票智能合约代码,亲测可用# u# b  `+ _1 \; A: d) ]# y
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14