Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
275 0 0
  主要功能; z$ d. N* n+ r+ K$ B) D
+ F: d( k4 f+ H. p) H! q% X
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
: V  a6 F- J6 `2 S; q5 Z% P
7 ^& _& D% v# M: S2 h  D  N
  1. pragma solidity >=0.7.0 <0.9.0;* ?' b8 X5 G7 D2 I% g

  2. ( A5 J8 e# D. S
  3. //投票实验
    ) D  }8 j* B9 I
  4. contract Ballot{
    5 @6 L. o3 r" j  B4 |

  5. 0 [, M) _: q+ E( y
  6.     struct Voter{6 J5 y& C5 i) s$ x! x* N7 M0 M7 ?
  7.         uint weight;//投票(单票)权重
    & ?4 r+ f! p2 w8 {" {
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    : W: x, Y( R; c; h8 t
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0
    4 {2 c& \% D& h
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    , u. J7 a# h& r+ ]9 o1 i6 j
  11.     }" B5 [! r/ M7 D' w
  12.      + j! `* P# b# q
  13.     struct Proposal{//被投票节点的相关参数
    % l! y7 C5 o1 h' K3 t* m
  14.         bytes32 name;//被投票节点的姓名标识4 V5 Z: |& l2 O% F8 l9 c
  15.         uint voteCount;//累积被投票数
    % z  Y/ {" o+ [) a6 s
  16.     }; L7 a/ V, f% Z" f

  17. + ?7 _( m1 k3 B# U+ {% F8 f- G
  18.     address public chairperson;//投票管理员地址
    ; }" V. `' }0 e- |
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射2 Q0 G8 y! L- d% o; Z
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    ( z0 G, K! H$ t; y( h3 O9 u$ S

  21. $ w5 a6 V$ q! @0 y- S: x$ L7 p: }
  22.     //构造方法、构造函数
    " a: n# G) u. }$ ~6 N4 z
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    3 x- s$ `' H$ b5 Y
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    ( f$ U- F9 q- ?7 f! H
  25.     constructor(bytes32[] proposalNames) public{
    9 b" C7 ^. W5 A6 A% b" f! A
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    2 h6 C/ e0 D" w1 S0 {- ~4 r! o
  27.         voters[chairperson].weight = 1;//将管理员投票权置为13 [& I* ^4 z: V& H# ^, V  W; Z
  28. 3 x$ W1 b( _, `0 z6 C. l5 v
  29.         for(uint i=0; i<proposalNames.length; i++){
    , ~( }% `) O0 Z  G7 m8 j
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票: S% W- a, [- m+ {
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    # p  }: ~# h& |0 T, b) j. \4 K, c
  32.             proposals.push(Proposal({
    0 R' M- y; C% s$ p9 S/ r0 C2 A$ w
  33.                 name:proposalNames[i],
    # g9 S7 J& y; |* d
  34.                 voteCount:0- R& k' Y, e0 J- `
  35.             }));8 z+ H, A! i" K' q/ {: e  v
  36.         }
    0 R9 z2 e. x% ~5 g
  37.     }0 K3 ~) N1 }& O( P5 |6 h
  38. 1 b7 q0 P  ~" {0 a! u2 U4 Z
  39.     //由管理员授权可投票节点' s* F5 p+ m- m: i0 Z8 R7 w3 I% W. [
  40.     function giveRightToVote(address voter) public{1 \, k/ ?; K' ~2 [0 X; C
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,1 @4 s4 E1 U& N0 V% V+ x3 \
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    3 q: K) X, n/ m5 S, T, a. c
  43.         require() t" s9 u2 C" u. w
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."+ M2 @. y2 C) M. M0 U
  45.         );//执行此function的节点一定为管理员节点
    " D& z' N0 O$ t+ f' x. g
  46.         require(+ r) I  b- Y' U% e) f9 ]
  47.             !voters[voter].voted,"The voter already voted."
    ( X( h  E6 |  i
  48.         );//若voter没投过票  ?& x- |; G6 m& M
  49.         require(voters[voter].weight == 0);
    3 u0 w1 R$ ]3 y
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    8 ~0 Q* Q" w3 v' t
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    / ^! k! v2 m* p! \$ G# |
  52.     }
    6 I9 a4 _# C2 l) a' q$ A& X
  53. ) r( |. W7 [; \: u4 }
  54.     //投票授权6 |8 {; W9 T- y' m1 I
  55.     function delegate(address to) public{
    / X  `4 ]7 w) p* d$ v) z6 \
  56.         Voter storage sender = voters[msg.sender];, ]6 E5 N9 y. y4 S
  57.         require(!sender.voted, "You already voted.");
    8 V0 [: L) W# O/ Y6 k5 r
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    5 G* d2 s' }, [4 p: S9 z
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己9 a' m6 N% d. p. u* T4 |
  60. ( b  @( H5 j( g+ }
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)& W, K+ @1 ?, J5 r9 ]& L" A/ ^
  62.         while(voters[to].delegate != address(0)){2 @" q3 z7 z0 f9 _! a: n
  63.             to = voters[to].delegate;//找到最终的代理节点& X* O" ^& Y- {, M
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态+ O: Z1 T. G! [! _# m
  65.         }: J- U) H! t# c9 K

  66. # s$ W; t( w2 a" y# q
  67.         sender.voted = true;//票权代理出去,状态改为已投票
    0 W5 z) E' t4 V! I3 t# v
  68.         sender.delegate = to;//票权代理地址
    ! r& F( L: j8 x! X/ ]
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态, c# z  `- f' E( c5 h
  70. / N' |  ~# v  T! }
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和0 l& j1 j$ z% P! a& F, n! w9 ^' j
  72.         if(delegate_.voted){' W5 f/ z1 \  U. j1 e
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    : v, b8 R+ J% d; ^9 X6 O( z3 U
  74.         }else{
    4 j+ t" t+ |; Y( W5 M
  75.             delegate_.weight += sender.weight;
    ; W1 X) k/ D! k% S/ b; R& g
  76.         }
    : X. G$ v( v4 y' R) r, {
  77.     }
    : V, `+ d) m/ T- L' g. M) o2 k) p/ Q

  78. " U4 }3 D. {; B6 p
  79.     function vote(uint proposal) public{
    , N0 i) O! p) u0 R
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息! w1 R; ~& q! A. I& w  B6 o
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    . }# e4 A; a  m$ ]; S# {# @
  82.         sender.voted = true;//更改投票状态为已投过票7 E3 _" l% r+ q. w4 j& X) H, o
  83.         sender.vote = proposal;//保存已投票节点' V; _; M* N2 }
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    8 L$ O% `& J5 m0 ]( w% Q
  85.     }1 J7 S+ Y; @: i6 l
  86. 2 W  x$ |, Z, V9 }& I" @
  87.     //返回票数最多的节点在一维数组proposals中的索引8 ]# ^7 U6 r2 Z* Y( i
  88.     function winningProposal() public view returns(uint winningProposal_){
    5 @/ @& g& y, V: I
  89.      uint winningVoteCount = 0;
    # _4 v% O1 R4 c- h0 ]. C) k
复制代码
$ Z! R- c6 h4 f- ^+ |, b  k+ I' f( H
- {# b5 i% x0 W4 R

9 J, E8 t0 e, r- A0 ?7 ^& L0 V. W4 |$ w4 S2 n
solidity投票智能合约代码,亲测可用9 P  D0 E0 A' U
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14