Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
282 0 0
  主要功能
5 K% Y# k, S% ?  s( M9 Q" Y+ k* ^' Q) t: Y5 b1 P% d1 L
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。. Z7 `' L" C5 @6 _/ \" {6 \* J
* Y2 P0 }: T8 \
  1. pragma solidity >=0.7.0 <0.9.0;5 D6 x' @8 ^' |, b/ i/ ~3 R
  2. . |( o3 b. s) w
  3. //投票实验
    - w# k+ j/ R* @9 X, M
  4. contract Ballot{
    " n  F: M; W5 n" B) \3 s" `
  5. " e9 N5 _( u8 V8 G# f
  6.     struct Voter{
    : k* o9 |7 k8 Q8 M2 t+ j
  7.         uint weight;//投票(单票)权重
    , e9 `; w0 u% {
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false& v# F. [, x' m- }0 @0 Y3 J2 n
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0
    $ R2 {  u/ \- B$ Q4 w! ]0 u
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)
    ! X, ?& r# A) a. U5 u3 s6 W0 x) ?- a
  11.     }
    1 v1 Q& ~1 p, r
  12.      1 b% A0 r# a, p9 p2 q/ _0 ?
  13.     struct Proposal{//被投票节点的相关参数' k. V) ]4 I" v3 j
  14.         bytes32 name;//被投票节点的姓名标识
    - ?9 B" n3 A8 p. F. E5 P4 e
  15.         uint voteCount;//累积被投票数# j* ^5 i, g' S5 V6 N. |. S
  16.     }
    % f4 q( t% u; n* [2 c: y' ]2 \
  17. $ r7 r" M% t* y* P/ F! V. Z
  18.     address public chairperson;//投票管理员地址4 f4 Y4 |; g8 D; b# O& c
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射  J+ Z+ i4 H& E6 D; m
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息3 O* J. t( X1 w! ]

  21. 4 l: ]  P1 _* Q! E1 M% Y% F
  22.     //构造方法、构造函数7 \4 H4 u+ l* M8 L* K1 e. F
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数1 a: O* U6 F/ f/ c* H" H6 p
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载' t' h4 v; C# T( h) t3 ^' f. E
  25.     constructor(bytes32[] proposalNames) public{" p# v' S* [) B" L' b% p/ Y2 E, s
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员0 Q% K$ k+ }, G2 V% T. I" W
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1
    " _5 }+ V" t8 f; b; b" d  s/ r8 J/ c3 ]

  28. " m/ U! }8 s. m: N
  29.         for(uint i=0; i<proposalNames.length; i++){
    . {  B& t# i' b  }) i, B9 _- G4 C
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票
    ( X' V4 E. V' g; z4 o
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    $ c, E) H% C8 {
  32.             proposals.push(Proposal({
    2 V' }2 q( N8 ]2 c0 S
  33.                 name:proposalNames[i],
    6 x/ z- G( Y* _8 M+ j! k
  34.                 voteCount:0: K" G, u- c: b+ U2 V
  35.             }));+ B; B3 Q' n- a/ s# }
  36.         }
    ) q6 X- F* R0 }9 {. e. K) U) i2 c
  37.     }
    % f# M, I5 U! @* M# R
  38. 8 D  D' x8 p; d: X& o" I2 G, E
  39.     //由管理员授权可投票节点
    3 k# Y( o; ~1 r7 G4 W$ f3 C
  40.     function giveRightToVote(address voter) public{
    & n6 L$ D/ ]/ K, ]
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,  V+ N7 E3 \4 E
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    * i, f6 M1 W, E+ U& Q5 i' V
  43.         require(  T1 N( G! U! }2 {/ f' v+ [/ J
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."
    , t* q  }1 j* y, W8 s5 |8 [
  45.         );//执行此function的节点一定为管理员节点
    ' _3 Z  O9 @& N: Z- l' m, A" C3 @0 v. [
  46.         require(' |! ]5 X, v* s; i3 Q& ]: q
  47.             !voters[voter].voted,"The voter already voted."3 E) d  K8 N% [: }# s
  48.         );//若voter没投过票
    / q$ o' T; v4 W/ B0 j  w
  49.         require(voters[voter].weight == 0);* U5 s) a* A1 A0 h
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权8 b4 Y' z: y1 K$ a4 q+ j
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    0 J0 ^$ j5 Q6 I7 V6 G) H, s
  52.     }
    / a6 V2 T! a" e
  53. : ]9 d7 h( h+ E( U
  54.     //投票授权  ?( }* J% D; Y' l  `0 w$ ]
  55.     function delegate(address to) public{! [/ u, X: b1 k9 I
  56.         Voter storage sender = voters[msg.sender];% Z) s& E1 L, |- m: w
  57.         require(!sender.voted, "You already voted.");
    ( U& a" l( ]6 e, g; G! J9 l
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    & @9 y+ c/ `: s; }8 ?2 d
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己8 s+ @0 R0 J3 \5 u

  60.   P) D& W2 H. F! b6 s. \
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)% I! Q+ B- A, O0 H; S2 D3 p
  62.         while(voters[to].delegate != address(0)){6 |9 {8 m: `& I- h
  63.             to = voters[to].delegate;//找到最终的代理节点7 l. h' I" C9 H! y' f
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态
    - {7 B( i' r$ ?9 ~+ C
  65.         }& c$ ]4 L9 K7 r3 a  Q

  66. 6 k4 ^. g* F8 m4 U2 g; c
  67.         sender.voted = true;//票权代理出去,状态改为已投票
    7 ?7 T2 X: Q+ S6 o. o) o2 a
  68.         sender.delegate = to;//票权代理地址
    - M; K" D* u, m0 s; b
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态: b% [3 O8 ~- Z  w* ]6 f
  70. 2 B! k) Q- `# L( s) a! s+ J
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和3 q: @, T0 s) J3 `( x( s; ?' `
  72.         if(delegate_.voted){1 N+ u* D* K; H3 @2 U" O# i' E* C* H
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    ' w4 x  _% Q5 Z; a
  74.         }else{" a4 w8 S6 o7 I6 ^# W4 S0 \
  75.             delegate_.weight += sender.weight;
    + T6 e% Y* C. ^* K7 c. g% J
  76.         }3 d; x$ \  D( r" [9 l1 h
  77.     }
    ! d8 ?: Z' G! ?4 [
  78. , Z( \& a/ b! y/ Q
  79.     function vote(uint proposal) public{
    ; A7 D: n: N& s6 ?0 _% b
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息
    6 O/ j" |2 ]( P; S( u
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    ! a% G( O9 c( Q4 [
  82.         sender.voted = true;//更改投票状态为已投过票
    : j, F8 l# P$ r8 ^( M( l2 [
  83.         sender.vote = proposal;//保存已投票节点" r, ?( t$ ^: ]- P  @$ S
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    2 M4 O6 e: o' Q- r  w* p6 |# J  Z% b
  85.     }2 a% [: `; Z* C0 c6 q
  86. $ w! J* C/ E# R& j( m1 }
  87.     //返回票数最多的节点在一维数组proposals中的索引9 a4 o+ n7 o8 \; D' Y9 |
  88.     function winningProposal() public view returns(uint winningProposal_){
    / \/ @$ j( t- o6 i; C
  89.      uint winningVoteCount = 0;
    ; }! ?/ F1 ?- h' s/ |8 d0 q
复制代码
8 ~/ e9 J0 P0 K" k4 Z' U7 y/ L
- l" y: Y$ x$ u" R; \" B/ H" i- q$ D
9 ~5 m, F6 r5 f3 \/ |7 h4 I
& P9 |. }" v, [2 o2 H! `" H
solidity投票智能合约代码,亲测可用) M. }% O" {* |' g' z7 E( W
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14