Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
549 0 0
  主要功能
- S( o4 A& C2 a. h
( T# H4 x" h* X) j5 m  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
/ ]5 }$ H0 i5 r# _6 F' W( u
) z7 e- G( F  o. ~: I6 s; B
  1. pragma solidity >=0.7.0 <0.9.0;
    # }( Q  _. r6 x& u: B
  2. ( ^& B. D& S+ _( n
  3. //投票实验3 u: W7 _$ R  B7 [8 P# \) L
  4. contract Ballot{. h2 c0 c$ D# H$ R3 s1 T

  5. # q* d+ M  v( D5 ~8 c: Y
  6.     struct Voter{8 c3 d  Z* A- z
  7.         uint weight;//投票(单票)权重
    + j& r7 d2 ~5 f. k
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    ; H- _- {; W0 i2 S3 A5 ~0 K; w% U
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0# y0 E- J; J, L7 V" k
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    ) q# x! Q) p5 r! _) ]) p
  11.     }: H$ g" k7 Y1 G5 z& o6 X5 o6 J
  12.      9 \$ t/ d$ G! v3 ?2 L$ D
  13.     struct Proposal{//被投票节点的相关参数
    9 R7 L' F; J( F( a" {
  14.         bytes32 name;//被投票节点的姓名标识; q& l( X" }  a) p! B
  15.         uint voteCount;//累积被投票数
    , j& o5 X. w$ G3 E% Z
  16.     }+ z  g( j* ?4 F
  17. , c" T/ i# G2 m, i' A
  18.     address public chairperson;//投票管理员地址
    : m4 \: w$ w, Q' H1 t; L' y
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    7 c% v: g) h# j: D5 c
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    % v; y0 O) P+ u* E# s

  21. + W9 G& I& _5 i7 {4 Q$ I6 H
  22.     //构造方法、构造函数, F  m2 Q8 {" H. t. ~( |& B0 W
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    / x7 b# R1 c' F
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载6 X0 ]' U) |6 n* t$ \9 M
  25.     constructor(bytes32[] proposalNames) public{$ D1 N; }$ f$ r* d) \
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员/ z1 @7 |; H# x4 N% G+ t* Z
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1
    4 v3 e: @/ m2 ?- [

  28. 0 A# }- J, S! m
  29.         for(uint i=0; i<proposalNames.length; i++){. Q# ~$ S- u' l; r$ M
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票
    6 h9 K+ U) E1 F3 Q) H8 `
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    / u5 x4 f- H; N% M; g4 |- {
  32.             proposals.push(Proposal({
    3 i, L% E& T3 Y
  33.                 name:proposalNames[i],* f# w# \( _, ~4 G# u2 k
  34.                 voteCount:0: i8 o& A$ l3 ^% U- H6 P. m
  35.             }));+ |! k0 o, L+ Q: F& R- x4 w; R
  36.         }; a4 T7 i+ A# J# r7 }
  37.     }" D5 {. f- P9 z$ W7 x* v+ Y
  38. . m# L! g+ d9 q+ R4 b& W3 _9 n
  39.     //由管理员授权可投票节点
    ) r1 g7 g7 M- K0 D
  40.     function giveRightToVote(address voter) public{1 a  I; [6 ^' e( z1 k! B
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,
    1 k7 N" h' d. P) V
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    0 h9 S" A$ D6 Y$ I6 |7 s7 z
  43.         require(8 }6 o! e% }) a$ ^7 _% b
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."5 b7 i% K% g; S% D) h) j3 Y; a: J; }
  45.         );//执行此function的节点一定为管理员节点2 j) p- q4 i6 ~: v1 V! K
  46.         require(
    9 A/ g( E" k0 |: e5 \& D# c
  47.             !voters[voter].voted,"The voter already voted."& L' O+ }" [3 m. e+ `
  48.         );//若voter没投过票) V# Q5 r3 f4 v7 {- n+ Y, r5 z, m
  49.         require(voters[voter].weight == 0);
    # O6 ~  s0 v5 b# `
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    ( u1 Q* {/ e2 \+ T. @& W
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    # ?8 x  S0 I; t. g- A* J
  52.     }
    4 {& U. o: Y7 U
  53. $ H! G* d9 i: x! X0 Z) M$ w0 j
  54.     //投票授权
    / ~+ |# c- f2 n# \! a( h$ b7 ]
  55.     function delegate(address to) public{
    : ^4 ^4 J# |2 B
  56.         Voter storage sender = voters[msg.sender];
    $ V' G8 X! @$ P: s  Z
  57.         require(!sender.voted, "You already voted.");
    % W  b# Z, s& h" ]
  58.         require(to != msg.sender,"Self-delegation is disallowed.");1 h: w/ U% n8 o8 ]7 g3 \3 c
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己8 j( e, \7 |# B1 x: e9 e
  60. ' {7 R+ M0 o7 O' J9 @! s
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    " m8 I+ J* G) J, k
  62.         while(voters[to].delegate != address(0)){0 Y% R. N. f) n8 A' {
  63.             to = voters[to].delegate;//找到最终的代理节点
    * }8 [) R4 j4 [5 W, |1 h0 q
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态
    0 {: m+ k* N3 ]4 v! H+ \& |
  65.         }7 ^; l1 v# z3 M1 I
  66. ) k0 f! U' w' Z. X- l2 o
  67.         sender.voted = true;//票权代理出去,状态改为已投票+ B% @3 a9 p& W7 V8 k
  68.         sender.delegate = to;//票权代理地址3 ]0 f! Q) _. v6 U, @# u
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    5 J# a; |; Q' x6 _8 S

  70. ' [( Z% Q8 h1 b: c1 U" b. E
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和# g+ o3 E" f& b' ]7 ~, m* w
  72.         if(delegate_.voted){+ h5 N; V' k9 s& w/ }; L  j  @
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    3 r5 Q# z0 t+ P( o
  74.         }else{
    2 T# x" i9 h# r
  75.             delegate_.weight += sender.weight;/ G6 t* h7 ^* X  B, i% H# s
  76.         }
    , n* U8 u/ \' L" l, w8 v* A
  77.     }
    5 w( B0 I! Z4 z$ Y

  78. + J5 [2 u2 V. U! B8 ?$ l
  79.     function vote(uint proposal) public{8 o( `" A: @8 p! e' M0 G' P
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息
    " Z. L. T# f4 o) ^0 `! ?
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    0 q/ H+ s; g( K/ f4 e, B/ n
  82.         sender.voted = true;//更改投票状态为已投过票
    6 z1 _+ S# D4 w
  83.         sender.vote = proposal;//保存已投票节点
    " f' ^- h( u7 V2 {3 z
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    % i1 S! S. c; t/ ~* j5 J' N- P9 f
  85.     }; f% P( G% w3 b2 M. O4 {8 _

  86. ( x( q4 U0 G9 V/ v9 D0 K! v$ [+ R
  87.     //返回票数最多的节点在一维数组proposals中的索引5 O- _- @3 X. q( b4 a$ x% C1 f+ b
  88.     function winningProposal() public view returns(uint winningProposal_){* @3 l; ?" _3 Q: ^
  89.      uint winningVoteCount = 0;
    : k3 R' s0 e! W0 E2 s
复制代码
! d" L6 B! K- e; K8 y

/ Q8 D# H3 f$ ]8 F3 F5 f* a+ s
2 A) T: D' m/ C& b9 H# A/ T
# ]9 X4 w4 y+ A, V7 l; X4 k) Bsolidity投票智能合约代码,亲测可用
0 l8 p, D8 ~, O$ i0 C* N5 ?( n
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14