Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
509 0 0
  主要功能
, R, j$ r" S  j; J7 [2 o/ D" B+ ]+ Z6 R  ]: D2 O
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
. x2 c& T% F9 ]% x, E
. ~9 A4 ?6 R. b% m. Q
  1. pragma solidity >=0.7.0 <0.9.0;
    + l8 w& l" O4 W8 i% u3 e% X

  2. $ Z) X0 L; R) \* u; I: B
  3. //投票实验
    0 l$ t% q/ \; k
  4. contract Ballot{/ F" g6 J, {# E. z7 H& d
  5. 6 n$ D: h( z% }
  6.     struct Voter{
    8 g) V. Z5 K% x& l( y( H
  7.         uint weight;//投票(单票)权重+ X" ~" F& Z" a# U( ^* t, a
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false: m+ M0 E3 O" R1 f9 v
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0, z8 C5 e! F3 g$ Q# C! k+ d9 \  F$ \
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    + o, v" {$ H4 `9 C
  11.     }, c$ b" f! a2 v* N! i" y" i, S: B2 i
  12.      * {/ ~# G4 O' q" U% s+ q* {
  13.     struct Proposal{//被投票节点的相关参数+ C6 Y9 s. q; C2 ~% P( s
  14.         bytes32 name;//被投票节点的姓名标识2 F) ~% K% F4 V9 I; u
  15.         uint voteCount;//累积被投票数8 ?, c; P8 b& X1 b: Z  Q
  16.     }5 ~3 G$ q8 v3 }! P5 W2 b

  17. . e6 i; J' u* s+ M) N% w
  18.     address public chairperson;//投票管理员地址
    : `9 [) Z+ H8 w/ c. X
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射
    5 w2 Z' E* p' F3 Y7 y$ f$ n* i
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    . X, Q: O4 a) I7 ^/ B% D7 ^
  21. 2 U* s5 r3 O8 T
  22.     //构造方法、构造函数/ I2 j- G. Q# I( @* P
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    ( l! n0 X! \+ U( K2 Z! n+ L3 }
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载0 b* X, |# l; P/ \' ?4 g8 A
  25.     constructor(bytes32[] proposalNames) public{
      U6 d+ Z7 V; d/ e' ?
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员4 T8 M  j* r$ i; M' K  x
  27.         voters[chairperson].weight = 1;//将管理员投票权置为18 ~' d0 E; W0 O4 s1 n" x" S
  28. - ~( c5 I. x* W0 b
  29.         for(uint i=0; i<proposalNames.length; i++){2 B- t% G9 v. ]0 I! l% Y' w+ Q
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票% }0 S$ Y3 h: K8 p9 A
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    & Q& ~! \0 I9 o
  32.             proposals.push(Proposal({
    * l4 d5 G: a1 I8 ^  n' ^. ~) w. Q
  33.                 name:proposalNames[i],: I/ z8 s5 K) n# v. n% H- G
  34.                 voteCount:03 a- G: d" A5 B) J
  35.             }));
    , c& ?- A! W0 L
  36.         }6 O7 V5 g0 d: X- {
  37.     }3 c5 r' k9 ]+ @. `* A) w
  38. 6 ~8 m0 E! T, I( ~. @4 p/ v! l9 ~
  39.     //由管理员授权可投票节点
    0 j# Q  |! D8 L* H% ?3 O
  40.     function giveRightToVote(address voter) public{0 C7 R* [3 v8 Q) y$ s3 M
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,! m7 \% k. Q7 S+ e( f
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态: V6 e4 F5 M( i% X* E: F7 \: K+ l' o3 G
  43.         require(' V3 c/ b2 {# B5 w/ w
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    , y& V4 l& A9 J, |
  45.         );//执行此function的节点一定为管理员节点+ C8 n! ~# ?2 k2 D' m
  46.         require(
    3 s: L9 \  W! H& s; X- {0 D
  47.             !voters[voter].voted,"The voter already voted."- F& e+ A0 F5 `$ u& C
  48.         );//若voter没投过票
    1 ?4 t4 ?+ ]0 g) k" ?! x4 O$ m
  49.         require(voters[voter].weight == 0);5 w7 n" A1 X$ n5 L
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权
    & P6 u/ @2 u% `. w2 I- h
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数; t$ p6 b1 M0 O" ]
  52.     }
    . X7 B" m% _( W2 D6 y

  53. ( Z* A& W6 y  a
  54.     //投票授权
    / m, |$ W' d+ z7 O
  55.     function delegate(address to) public{
    ; C/ Y# O# E& h8 R
  56.         Voter storage sender = voters[msg.sender];4 B* i1 A8 P% }6 o! @+ [% g) `
  57.         require(!sender.voted, "You already voted.");2 l2 w! h9 P9 B4 ]# F
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    1 u  `( X- S" U) }8 ]% g( i& z
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己) o' Y" `( @8 O6 |) D- \$ d

  60. ( [6 |+ W2 M1 h6 S, g
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)
    ( }: N  h& S: ~" q- @7 {
  62.         while(voters[to].delegate != address(0)){
    ) ~& |9 T, x  r" D
  63.             to = voters[to].delegate;//找到最终的代理节点
    3 c+ U: z- e2 C; \$ u
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态7 e; ^* T: D, d
  65.         }
    $ y# V2 X7 P2 U8 n) i% y) q
  66. " l5 `  n0 b9 n: I! b- A8 }
  67.         sender.voted = true;//票权代理出去,状态改为已投票
    ! s6 \9 J! I  q8 m
  68.         sender.delegate = to;//票权代理地址# p7 g/ }9 X, f& p
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态0 C0 i4 X- O5 l* G# M
  70. 8 W- l1 Z( S" p1 [* D! @" b
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和2 }2 f7 S" Z5 D& p* Q  x( }
  72.         if(delegate_.voted){3 G7 }) f- d# Z- j
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    + Q) ~# P: N& \
  74.         }else{
    7 D- h" J* M3 S- M
  75.             delegate_.weight += sender.weight;
    + S1 r6 T) b+ k9 Y( @' \' r
  76.         }! s. j% p6 o  n4 w, p/ L6 [' L
  77.     }2 s& r3 \0 n* F) c& u( N
  78. # D  b" b. H* u2 G+ I- B
  79.     function vote(uint proposal) public{$ B. w. S$ p/ i( {
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息( l6 Y% {& q) J; v0 g6 k
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    5 K! C) D0 s1 f" j* r8 a* d8 }2 k! |$ \
  82.         sender.voted = true;//更改投票状态为已投过票* o3 d/ g3 K& l' @
  83.         sender.vote = proposal;//保存已投票节点
    7 f. L& |- L2 O7 @' r
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    - f' @- Z0 ]! K# g: i/ P
  85.     }
    / @: _( r7 B. `

  86. $ v, ^" M" L$ h. L  z; s, D; i
  87.     //返回票数最多的节点在一维数组proposals中的索引
    & _8 O: J+ {+ L  u0 X
  88.     function winningProposal() public view returns(uint winningProposal_){
    0 \$ m8 u  W9 \2 F( W
  89.      uint winningVoteCount = 0;
    5 L' M8 S, p2 N8 H4 x( i
复制代码
% A) n# T; i- a; X5 V

: p5 w, C: Z8 H6 a9 T0 k: Y4 B, g9 N# Q" ]

  I: R" F0 J& d0 N1 ~) @  @" fsolidity投票智能合约代码,亲测可用6 k- |$ ?9 L2 @2 [6 D
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14