Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
551 0 0
  主要功能
' u/ `9 D0 d. y* a
0 q8 a: Q* P1 a* }+ Y  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
9 P0 I; N4 s% G9 ]1 Q2 x! S4 E8 E! y2 I1 L0 d4 C
  1. pragma solidity >=0.7.0 <0.9.0;
    2 U) }" A8 |3 p* ^; _5 O
  2. ) Q. {$ x2 d* u( `. _4 B
  3. //投票实验
    ; \; B" ?, c- |( E; b) ^$ t& |+ d9 X( f
  4. contract Ballot{! B% j( i. k6 e
  5. ( I) Y0 I* A% O& g+ g
  6.     struct Voter{/ A' C/ M/ A# e8 L/ z" \3 s
  7.         uint weight;//投票(单票)权重. g7 _3 t+ j/ M4 O) S
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    5 P/ k5 d* ~5 o# g4 ?$ \- _, C
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x08 S0 [3 o# P# [& u- M
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)8 F: k* k+ O& k9 G* F! j1 x
  11.     }
    8 X+ K1 T) i# U7 V
  12.      
    3 X% S9 K/ t! f0 B7 G
  13.     struct Proposal{//被投票节点的相关参数8 T/ m' E  q# Z$ J7 M" J3 r  d% H) S
  14.         bytes32 name;//被投票节点的姓名标识
      q6 s( v# w) E! U; Q, N5 T' ?
  15.         uint voteCount;//累积被投票数4 i* C0 L# p* D. W4 s
  16.     }. S/ x9 r$ |: _. F" T+ f9 q
  17. ) C1 w6 |" {) N- \7 q+ `
  18.     address public chairperson;//投票管理员地址3 n. r. I  M7 C' i' Z' A
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    / ]. v! _( b" G* q" V
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    * J. |7 |1 L/ Q/ V# A+ h

  21. - H5 v4 x  _% p$ C
  22.     //构造方法、构造函数
    ( R: N$ e# s7 [" [4 ?$ x
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数" u3 ^! E" T* _* g* p
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    4 c! G: @9 T: n" w5 F* [
  25.     constructor(bytes32[] proposalNames) public{
    " L7 i0 W: l* r  Z6 v! V7 E
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    : c/ X4 X1 j& x0 V$ T! r
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1, s7 W7 ?5 U2 I0 N& e  M

  28. . X9 x$ _% j' W4 U( o; e7 I
  29.         for(uint i=0; i<proposalNames.length; i++){! x. K6 u8 @2 d- o  V" w' T+ r
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票, Y+ B4 [+ ]- S* h% g2 P
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));0 H+ e1 L+ H5 l1 w  Y2 L
  32.             proposals.push(Proposal({
    * {/ ~6 c. a7 ]& I/ l# s  T
  33.                 name:proposalNames[i],
    & ]& o, J% ~+ x
  34.                 voteCount:0  J4 n( I$ y, j( @* P0 R1 m
  35.             }));
    4 x  j8 w; S( g$ [8 K+ g9 i* x
  36.         }
    ; x3 H2 J0 q" o' Q% y
  37.     }2 G1 }) B. [3 j5 i1 E+ H

  38. - C. `. Q" X* R- \2 q5 Y3 `
  39.     //由管理员授权可投票节点
    4 _5 X$ \, G; H: V! n) `
  40.     function giveRightToVote(address voter) public{
    " k" w% T0 Y$ Q) T; Q3 x. H
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,1 T1 i5 D5 |% s' E! }
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态; m: j) O3 {7 i3 t
  43.         require($ ?4 ]. x( N9 v
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."! J* i% |( d  p7 c& a
  45.         );//执行此function的节点一定为管理员节点* T5 b! A" w* k; Q) a
  46.         require(
    ! o! C& |* F* l8 o# |
  47.             !voters[voter].voted,"The voter already voted."; e" f' W: [6 ]# _7 p+ e& L% L2 w
  48.         );//若voter没投过票1 {# |$ i' H! Y" ~
  49.         require(voters[voter].weight == 0);+ T3 V6 y) x) v
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    4 a7 ?% k) k; z& J" k$ z
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数( ~  R! c# }& V  l) |
  52.     }
    ( ~$ i3 f& @( H; C( u; K
  53. 5 r: o, I1 N6 s. S; s, V
  54.     //投票授权" `5 }6 P. `- @7 C, a! D' Y
  55.     function delegate(address to) public{
    , Y8 q' W7 P6 V+ l6 G0 f
  56.         Voter storage sender = voters[msg.sender];
    % y) p3 j) B% n. P' D5 I
  57.         require(!sender.voted, "You already voted.");
    / U6 c/ B* ?  F0 g4 }1 _
  58.         require(to != msg.sender,"Self-delegation is disallowed.");& [3 [- D1 S" A3 V
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己
    & G4 g$ H6 H9 k. h1 J( v2 g

  60. ) ~& K9 J- Z% p$ R8 u
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    " i- O: k) ^( k
  62.         while(voters[to].delegate != address(0)){
    % B9 K' J0 {. f" C$ W8 e* p* A
  63.             to = voters[to].delegate;//找到最终的代理节点
    0 M0 a3 a8 |5 J& T
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态
    + G; ~9 j7 n% l
  65.         }
    8 V1 W# P$ A% n8 M- i/ |8 ~
  66. . Z$ q4 S, n# {3 P4 c
  67.         sender.voted = true;//票权代理出去,状态改为已投票+ K& B" z6 P  P. s
  68.         sender.delegate = to;//票权代理地址5 G8 l7 P+ F0 m/ M9 K
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    ; U, t# \0 P& X. R8 |. X) ^+ u; ]- s7 X
  70. 2 p4 W! W! n8 O
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和
    - b% o' _% [/ p' L% R
  72.         if(delegate_.voted){
    & C. T5 S# ~, \( J5 x7 r# M
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    . g( i- o, Z- V5 V! ?+ u
  74.         }else{1 Q: L! L) x% w* s& _# {2 ]4 Y! r
  75.             delegate_.weight += sender.weight;
    8 x" r9 N8 P4 i" K' F+ J
  76.         }
    : a$ z6 B) t7 Z! X
  77.     }+ P) F0 X  M- d

  78. / }) Y/ |$ z/ T( Z) s- z5 D
  79.     function vote(uint proposal) public{" p( q: T! [5 x4 ^  v
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息3 B0 O6 t! X4 h
  81.         require(!sender.voted,"Already voted.");//若sender未投过票1 k$ e: `% Z" n+ X/ c  @! M2 k5 q' r+ ~
  82.         sender.voted = true;//更改投票状态为已投过票
    ; I/ R/ B0 ]% i
  83.         sender.vote = proposal;//保存已投票节点
    + }# b8 d6 \: y
  84.         proposals[proposal].voteCount += sender.weight;//票权加和3 ?3 O8 N3 X( c4 N2 I, _
  85.     }6 I9 Y7 d" _% \# u

  86. ( B* k$ @% V" ^; W, o: U
  87.     //返回票数最多的节点在一维数组proposals中的索引
    3 F  b0 |2 Z/ Q6 N+ O: P
  88.     function winningProposal() public view returns(uint winningProposal_){/ d1 i3 |6 f# }2 {  [" g
  89.      uint winningVoteCount = 0;& g/ T4 g/ V- v) I6 t( V1 |% O! s
复制代码

; C* a+ f. b& `' {7 H
  j( P8 O+ D4 W/ o+ d8 e2 _2 |& N* |6 _+ v8 G" ~$ z4 p
- X, @$ Z% P' j. @; G
solidity投票智能合约代码,亲测可用/ k5 k# _! j4 t2 A0 l4 W. Z) @
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14