Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
281 0 0
  主要功能2 b. B2 P- V* i8 c

7 B' `/ [  b. S. e  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。
$ ^! w5 |8 b/ K% o8 @
& d  q0 o- w7 q9 m7 O. s
  1. pragma solidity >=0.7.0 <0.9.0;" K2 K& x& I$ }* i: j

  2. 8 g+ _0 C# X+ J% ^( Y; L- X" P
  3. //投票实验8 O: s" P4 h4 i8 d1 Y
  4. contract Ballot{
    9 k' ^5 n6 @5 [5 u  i
  5. : Y! V; ~# T2 W" m5 ?/ I
  6.     struct Voter{; [) g$ Z# s5 ^8 B7 J/ z
  7.         uint weight;//投票(单票)权重
    ! ~" X' Q4 G0 b- J2 i
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    , {+ u( |* v3 @) `0 @% Y* D
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0
    & V  u6 r6 r- [! i
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)* x; T5 _# Q7 X3 ]
  11.     }
    * h! m9 |2 b" W
  12.      
    / [8 r* S7 h' z7 y( a8 d
  13.     struct Proposal{//被投票节点的相关参数8 X3 V9 n/ L$ _* m
  14.         bytes32 name;//被投票节点的姓名标识8 I% X: _4 o5 n( r5 H
  15.         uint voteCount;//累积被投票数) ^* l! o0 F8 N2 f9 \/ ?0 y
  16.     }! D, P- E! U( M% p# S, ~4 Z
  17. ' [' s+ Z7 u' R. g# J* c
  18.     address public chairperson;//投票管理员地址
    # J* F  B$ K, L+ f1 N
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射1 `0 z* S+ Q9 B7 b' P8 E0 a
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息% I$ B! {1 K- j! x4 x( c* u/ @# P

  21. ' f% W' \3 U* E; F$ \
  22.     //构造方法、构造函数) m2 H. p8 `$ o! x+ y* }4 ~$ B
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数
    3 J- D7 z$ V# b
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载
    - |( n- E" v4 X
  25.     constructor(bytes32[] proposalNames) public{
    3 S8 s# H+ a7 S& u5 g
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员) z8 W4 }: x) x, b# q
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1
    6 z1 z9 k5 G9 b3 P: d9 o
  28. & R: k0 s9 Y1 D
  29.         for(uint i=0; i<proposalNames.length; i++){. m2 \% l% e3 T# t% {
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票( M* }; m2 e$ E. L( M
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    7 [" d- ?0 F, c8 _9 x
  32.             proposals.push(Proposal({
    2 f  x% d  W% b1 O- s/ `8 M
  33.                 name:proposalNames[i],
    ! C. u6 c5 F3 R2 O) q
  34.                 voteCount:0
    ( l$ k4 [6 L% H6 s& J
  35.             }));
    . O& d/ k( m4 |; m" T1 H1 n* i
  36.         }
    $ `% B+ y6 ]6 b$ d; L- H
  37.     }" [- a" y2 e6 g

  38. " I1 l. P2 F% q1 [# t% C
  39.     //由管理员授权可投票节点% @# t! Q) c0 {* D
  40.     function giveRightToVote(address voter) public{
    # T* f; Q0 ]1 w) O$ t0 b+ R9 q" v
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,
    0 z, t' ~& C* f) i) H0 x9 c% e3 z( \- E
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    ' n! J: |( P6 e5 U/ ~0 i) m
  43.         require(/ ~( m8 x# n6 d7 E5 c& v9 m7 j
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."2 d- Y' t; u, S6 e! p
  45.         );//执行此function的节点一定为管理员节点
    / B, b3 X; C4 o1 J5 |* V
  46.         require(& K1 p1 {1 @  H, [
  47.             !voters[voter].voted,"The voter already voted."" U: t; }& U: D- ]8 N
  48.         );//若voter没投过票
    9 g0 J7 Y& Y+ R3 h( R; o
  49.         require(voters[voter].weight == 0);
    , O# b; r- f/ {* H- K- T; z+ ~
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权' Y1 \* |# ?& D* E' r1 G* A: N
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    7 n  p  Y+ a4 Z8 n3 l2 x( J, U1 s0 K: ]
  52.     }
    / r' z$ }  o% N. K- R4 B4 J- ~

  53. . M) l( z9 k2 i+ \7 i
  54.     //投票授权$ S$ v# v, r3 a5 i( p
  55.     function delegate(address to) public{. a. M) I7 `( y) R! E% M' c) [6 U
  56.         Voter storage sender = voters[msg.sender];  t- J* }7 \. H1 h" Z
  57.         require(!sender.voted, "You already voted.");; h; @% u, ~$ u; J% I! _8 o
  58.         require(to != msg.sender,"Self-delegation is disallowed.");2 `$ Y/ G0 B' e
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己' y" z3 B" [* d9 w* R

  60. 2 D& \5 I% S/ S5 C
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)% y4 ]) L) w9 I! g9 t
  62.         while(voters[to].delegate != address(0)){8 R+ V2 [4 @5 ]3 D% R; H
  63.             to = voters[to].delegate;//找到最终的代理节点
    " v3 A9 [; d6 ~
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态) k$ U: ~1 d4 g! h7 w2 d
  65.         }
    3 ~6 G. I0 Y' `7 R$ p- A. b1 e

  66. 5 v, q2 u. g. Y* R: q
  67.         sender.voted = true;//票权代理出去,状态改为已投票+ r* P1 z/ ~6 q2 c7 y* g! v
  68.         sender.delegate = to;//票权代理地址
    ! U1 m& p* E  D7 r: C+ M& D
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    4 b% B" H5 O6 p1 P/ b& @% p7 N) R
  70. 1 V, x& r& V9 s$ `$ h1 z6 }" s
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和: t  |) i/ N5 _: I  n
  72.         if(delegate_.voted){  ~) M5 l8 j4 G5 L+ ~1 z
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    ' N( u; o& j9 [
  74.         }else{1 k  f) M- w0 p) A; k7 n1 A
  75.             delegate_.weight += sender.weight;
    9 E/ I1 x. ]6 Y9 n# |: x, ?! o7 ^
  76.         }+ e! w- L3 ~% Z0 Q6 W
  77.     }0 y3 A$ F6 W' s
  78. / w5 J% C8 i4 G+ d- z+ K9 h9 ~2 J1 J
  79.     function vote(uint proposal) public{- Z9 f% [: B) N3 Q4 T
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息5 o3 P; Q% w% R* r0 \3 L+ C& {8 |$ ]
  81.         require(!sender.voted,"Already voted.");//若sender未投过票- s( q( }* S7 n6 f, `. t
  82.         sender.voted = true;//更改投票状态为已投过票7 [2 x* k. z, S. f
  83.         sender.vote = proposal;//保存已投票节点
    2 r( D+ J4 E; a5 s
  84.         proposals[proposal].voteCount += sender.weight;//票权加和% M, X# `, E8 [/ I5 D  `) l
  85.     }
    9 S. H8 A7 s! ?+ V$ T( n  C

  86. - I) Q+ U( N' z2 C/ c5 y
  87.     //返回票数最多的节点在一维数组proposals中的索引
    7 x5 ]. R+ H+ U: p0 H# p3 \3 _  {
  88.     function winningProposal() public view returns(uint winningProposal_){
    - b+ G* P  R- \6 B8 y, g, K, |
  89.      uint winningVoteCount = 0;# m+ _/ \: O/ Q$ b' R6 ?
复制代码
) t# p# x6 x2 R
$ F0 T6 j% `$ f1 r& c; M! |

3 s0 m  }- g: m4 u0 N- J5 p& i' z# n! r* n2 w
solidity投票智能合约代码,亲测可用4 w6 h6 X$ e6 N/ }
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14