Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
286 0 0
  主要功能( E- E3 \0 N6 X1 H' z/ p

/ E$ j; Y- _& N* v1 J  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。# n# F3 G% c* l0 a  F- a' X/ r6 s6 U7 H
4 O' E. p2 g% }  W6 l. E
  1. pragma solidity >=0.7.0 <0.9.0;: ^. l+ G, M% M$ c. `3 P

  2. ) p3 k( D% T- U7 z4 c# ~
  3. //投票实验
    / K& S3 S/ n+ \( L6 H
  4. contract Ballot{
    ( x' i. A( R% P4 a1 J' @+ p2 b
  5. 5 ~" ~2 j7 q4 Y
  6.     struct Voter{
    ) L9 P# l% p% ?1 ]  q
  7.         uint weight;//投票(单票)权重( Z) l* u. I) |: Q5 k- z
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false* F3 Z8 I/ Q) z) |. O0 C
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0/ S% z9 I; d5 a) p  V' o: r
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)$ t' M( z( y+ p* ?
  11.     }) I; X. U' `1 u  X
  12.      
      d7 w" t( F) `
  13.     struct Proposal{//被投票节点的相关参数
    # G& [! T% t2 Z4 k# [
  14.         bytes32 name;//被投票节点的姓名标识
    : i$ ^' x( w8 P+ y' U2 I2 F- T
  15.         uint voteCount;//累积被投票数
    $ c) l+ {8 z, n5 h( j
  16.     }
    # G3 L+ w& C* e# Z& l* p
  17.   Q  K3 n% i! g8 i
  18.     address public chairperson;//投票管理员地址5 K+ ]% M: o; D( g" r
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    & B* h# h/ Y: l* @, ]5 `
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息2 A! o4 u7 o/ R" u& v3 k

  21. + A: p$ k9 y/ w- I
  22.     //构造方法、构造函数
    0 L8 p: G6 V% s
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    1 a  T; h: \4 A# K: [3 k3 Y2 O4 `1 N' x
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    ( x5 a# x9 c/ p1 f
  25.     constructor(bytes32[] proposalNames) public{
    # O* E( E$ B9 b) S0 V$ [3 K, D; S
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员. p7 c) x- j" B" i4 u' L4 x
  27.         voters[chairperson].weight = 1;//将管理员投票权置为14 |; e" m' y( n& q) \- z
  28. ; Y4 h7 j8 H% B( {
  29.         for(uint i=0; i<proposalNames.length; i++){6 s! }* f' [: |( R" D/ _9 }
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票5 q% b" m6 s! C: M1 L3 A
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));# w9 G# N# {5 r, r9 j
  32.             proposals.push(Proposal({# |% i5 c8 ?$ S$ x
  33.                 name:proposalNames[i],' d0 i4 {  t% p5 ~& P
  34.                 voteCount:0
    1 k  m. o& Z) \+ [, M2 ]
  35.             }));& k, H- s2 `$ k: |
  36.         }
    3 ]1 K+ X* ^( P9 J
  37.     }) e9 E, H, ]4 k7 k2 u8 G

  38. # }4 r% R' W0 A$ F& `0 h2 w* N
  39.     //由管理员授权可投票节点
    0 Q  g& ]; C4 l0 V9 n% \
  40.     function giveRightToVote(address voter) public{( S7 H8 D% x. ]" `2 z
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,
    + X  O& x/ P( |
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    - P5 |7 @8 @; ^% g5 B! r4 W+ {, o
  43.         require(# n9 F( q* K! h0 ^# z
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."; j4 i6 v* i) c; v/ p
  45.         );//执行此function的节点一定为管理员节点
    ; o) g6 B/ c, \# a
  46.         require(4 [: |. ^9 r$ k  a- M1 Y
  47.             !voters[voter].voted,"The voter already voted."& r! \0 q, T2 T9 F5 E6 C
  48.         );//若voter没投过票
    ! k$ y3 n3 D7 ?7 T- F. P! p2 ^
  49.         require(voters[voter].weight == 0);1 A# m- Q' [$ |
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权; `4 u3 b" C9 v" w# _
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数$ m  k# P5 j4 _, e. {5 F3 z/ [, h
  52.     }
    9 l* Z# h. {- ?2 ~4 _1 p
  53. 1 J. H* d- I1 i$ s. G* G- m
  54.     //投票授权
    + j+ _1 z% M0 C0 J5 V: ~
  55.     function delegate(address to) public{
    % J% [4 h9 ^2 m
  56.         Voter storage sender = voters[msg.sender];
    ) F' X- [9 T- O7 j+ C' O: F7 [% H! [
  57.         require(!sender.voted, "You already voted.");
    5 p6 W2 A2 ^8 a- G
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    / l# o* L$ h, k% ?. `; D6 X! {/ q
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己/ P  g6 w% H0 ^. ^( l  e5 ^

  60.   Q# n) V8 D) n2 r; M" l
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    / a2 b) |) C2 b; @; A8 K, P7 \
  62.         while(voters[to].delegate != address(0)){
    3 c$ }# o& Y1 c  W- J/ i9 l
  63.             to = voters[to].delegate;//找到最终的代理节点
    # O# T0 b7 Z% }
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态
    6 S! O: D: i3 p& k6 f  E: J, v  m
  65.         }5 D, O; A" G1 r. }( w- H1 R' o

  66. 1 L( G# f8 `0 n& u0 h
  67.         sender.voted = true;//票权代理出去,状态改为已投票
    ( @  E# E) M' C: g5 f( J/ K
  68.         sender.delegate = to;//票权代理地址
    4 S3 M( y% V7 P: D
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    ) X+ {/ R- M( }& x+ X
  70. * K# `- Q& D, b6 Z/ K
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和
    3 C$ n  p4 s1 F. r
  72.         if(delegate_.voted){
    ; T; X) s1 z& X
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    8 c# T% J$ x0 y2 s
  74.         }else{
    7 L% j) s* P' M& Z. M( T
  75.             delegate_.weight += sender.weight;- `$ y7 q% n& [$ j
  76.         }
    * j$ A4 y# O) Z$ B* [
  77.     }2 C& }3 b7 r% c/ m

  78. . u( u; n4 }1 [) o# }
  79.     function vote(uint proposal) public{* _: m; @3 c: F' d  U- ]# H% y
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息
    ; x' a% ~; c; x6 c
  81.         require(!sender.voted,"Already voted.");//若sender未投过票4 o7 F# H/ c* d9 N. }
  82.         sender.voted = true;//更改投票状态为已投过票
    ! \7 q. `1 l8 ~
  83.         sender.vote = proposal;//保存已投票节点
    ! x: [& a( m( z3 o/ Q' u4 Z/ a" L
  84.         proposals[proposal].voteCount += sender.weight;//票权加和- D, x  t% e) c% J
  85.     }* q+ f# s. v% e0 F1 E
  86. - n4 X$ S- ~/ N- F( r7 A
  87.     //返回票数最多的节点在一维数组proposals中的索引
    7 x7 ~5 n4 |5 L8 \
  88.     function winningProposal() public view returns(uint winningProposal_){
    & L+ @( A7 H3 J8 l/ y9 n% h: \, E3 G
  89.      uint winningVoteCount = 0;
    : Z+ ~% K" r; K4 T) s8 N3 r% _
复制代码
. G0 {" R. O- O7 B1 ^: B4 J
. \# N3 u5 j) ~5 o$ E
: j! s: J! d: T+ P* W' S

. T: d& n/ M& {solidity投票智能合约代码,亲测可用, l  ?& ]! w, T+ G; Z
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14