Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

掘金稀土
285 0 0
  主要功能
- f* |- @/ L) T0 ~% T; {0 ^" x( b8 {3 v* s+ b# n, S8 l4 d
  ERC-20代币是一种代币标准,由V神于2015年6月提出此标准,由Fabian Vogelsteller(erc20及erc725作者,也是LUKSO Token 创始人)于2015年11月提交EIP-20。该标准允许开发者在以太坊区块链网络上开发属于自己的代币,该标准定义了开发者可以按照标准要求使用一些简单的功能如: - 设定代币名称 - 设定代币总量 - 规定小数点位数 - 规范如何批准代币交易 - 如何访问数据 - 允许查看各地址中erc20代币数目以及代币总量 - 一定条件下,允许第三方账户使用某账户中的代币资产 - 允许代币和兼容ETH的智能合约及钱包服务等第三方个体兼容 以及一些简单的函数功能等等。9 s2 j# t) F7 n/ ^$ ]+ ^- q

6 {! j, ?! d, i* g/ Y( u6 ]% Q
  1. pragma solidity >=0.7.0 <0.9.0;; F0 Q6 f9 h  ?
  2. / z; Q& m+ [; O3 I) W, V9 M0 K. ~% ?
  3. //投票实验
    / @3 ?- U/ X$ a- }+ p9 D2 k2 ^
  4. contract Ballot{3 f- ~) o: ]+ W$ Y# E4 h7 f

  5. % H8 J' K! c; ], n6 \
  6.     struct Voter{9 S0 n! q: C' S
  7.         uint weight;//投票(单票)权重
    0 V$ u/ `2 Y2 n0 [7 S  v1 T( ~
  8.         bool voted;//是否投过票,true为投过票,bool类型默认值为false
    - U5 |+ n( M  `+ s9 c
  9.         address delegate;//想要委托投票的节点地址,address默认值为0x0- j  G5 \5 }# l& E. h' G3 F; y
  10.         uint vote;//想要投票的节点的索引值(被投票节点信息用一维数组proposals存储)8 |/ V# e; `/ g4 u
  11.     }
    7 [+ V4 T( V. t
  12.      
    . c$ O6 \8 }+ ^* w8 K& u( j" H
  13.     struct Proposal{//被投票节点的相关参数
    , M9 P) r0 X, @" m1 ]3 X
  14.         bytes32 name;//被投票节点的姓名标识
    ) o! }$ Q$ }8 B7 h4 v1 k
  15.         uint voteCount;//累积被投票数
    / x  @6 D2 r* q! L( q: J2 J
  16.     }* M% B+ |9 ~" Z# [
  17. ! B% B% b, ?2 \# }4 z! y
  18.     address public chairperson;//投票管理员地址
    " V: H3 z% m% w5 D2 l6 Y% ^" s
  19.     mapping(address => Voter) public voters;//地址对投票节点的信息的映射% r  }+ [% v2 z' \" n; x$ H
  20.     Proposal[] public proposals;//一维数组存储被投票节点信息
    3 e# l: d4 W3 g1 Q  j

  21. 4 w9 a* T9 `- {+ Z9 e& \' M- q- A; k
  22.     //构造方法、构造函数
    2 A6 y4 U/ g+ s( Z# M8 T
  23.     //solidity和其他语言不一样,构造函数仅在部署合约时调用一次,后续调用合约不调用其构造函数& j0 a( U% M3 Q. m
  24.     //且一个合约只能有一个构造函数,不能进行构造函数重载+ W" ^9 k, @, z
  25.     constructor(bytes32[] proposalNames) public{
    ( f# v- A) C+ G* L1 P3 _
  26.         chairperson = msg.sender;//将第一次调用该合约的节点设置为管理员
    1 y- v! p5 f( k8 v& S+ m
  27.         voters[chairperson].weight = 1;//将管理员投票权置为1
    & v; p0 q, X7 T4 z+ X- ]1 v! S
  28. 5 X1 Z# P' W& V" Z4 M
  29.         for(uint i=0; i<proposalNames.length; i++){
    5 ^! V" L, {* r. V. J+ [- z+ ?, Y
  30.             //将所有被投票人姓名初始化进一维数组proposals,并将其对应票数初始化为0票
    2 N$ a5 M. G( g9 |5 r6 F" K# l/ F
  31.             //.push(),括号中内容需要强调数据类型,eg:arr.push(uint(6));
    : W. O% n8 n' l7 e* `
  32.             proposals.push(Proposal({
    1 D0 G& t+ h- H5 h$ i& D6 _
  33.                 name:proposalNames[i],
    / m. l7 O1 q* x9 v7 G5 [
  34.                 voteCount:0
    2 Z9 Z0 {- |" |* H2 X+ _9 f
  35.             }));7 g  v# |' v; j' P' n8 e: d- x
  36.         }; b" X( P2 _9 x( w
  37.     }& r/ Q4 ^& ~% N8 ^" x% u- r7 K" M
  38. - d: n; k1 R9 M& @/ m; \1 m
  39.     //由管理员授权可投票节点( ?: ^" M: i# V2 h5 O
  40.     function giveRightToVote(address voter) public{  @' k8 J0 e. F5 W# k
  41.         //require中判断条件为false时,输出字符串"xxx...",异常会被抛出,程序执行会被挂起,$ o+ H+ Y: j! ?! \! s. R+ \( ^
  42.         //未消耗的gas会被退回,合约状态会回退到初始状态
    ; U$ o$ H. G" q) T6 P$ X7 j
  43.         require(' T! e' P6 Q8 y$ K! A3 P8 _; g. `
  44.             msg.sender == chairperson,"Only chairperson can give right to vote."* {/ X0 q+ Y3 T. w" P  C8 @# U
  45.         );//执行此function的节点一定为管理员节点+ ~1 a) r7 T* I# \
  46.         require(( e# v" P% p+ l! `" R
  47.             !voters[voter].voted,"The voter already voted."
    # M+ U% y. Z& K
  48.         );//若voter没投过票
    ; C7 T3 }5 U; u! Z; Y* {0 P/ @9 G
  49.         require(voters[voter].weight == 0);( `( F3 i8 j2 ^( a
  50.         //调用合约的人是管理员、待授权节点还没投过票、带授权节点投票权重为0时,进行授权! W. k( o$ B$ S. s' S% \' [2 o
  51.         voters[voter].weight = 1;//上述三个require()均成立时,授权票数
    4 D: T' V- ^/ z* D9 J+ W
  52.     }
    - V6 z) P! q3 _8 N( u

  53. 7 v; t! [# [  @3 Z) W9 S& ^1 q
  54.     //投票授权
    ' ^: f* a. L! A4 Z# b) e
  55.     function delegate(address to) public{
    - [4 O" {, M$ r
  56.         Voter storage sender = voters[msg.sender];
    2 s: ]) r4 [! L# P& m4 A6 W/ U
  57.         require(!sender.voted, "You already voted.");+ a$ T5 [: m9 o
  58.         require(to != msg.sender,"Self-delegation is disallowed.");
    $ W+ ~0 \- I4 D1 J2 o* V) `
  59.         //sender满足的条件:要有投票权限、没有投过票、被授权节点不是自己
    + E' W" Y+ {3 ?' [* ^8 M2 V5 P
  60. + I( |* u* k4 Z; i4 Z: A
  61.         //判断代理节点地址是否为空:address(0)或者address(0x0)% ~. |2 a1 m; D+ Z5 V% b$ O0 F2 ]  x
  62.         while(voters[to].delegate != address(0)){6 z7 M8 i( T* G& _' O5 P: m6 C
  63.             to = voters[to].delegate;//找到最终的代理节点+ e: s* F! R9 [
  64.             require(to != msg.sender,"Found loop in delegation.");//若代理节点最终是自己则回退到初始状态
    - E; A' H1 P! c0 o1 r0 Z$ }2 j
  65.         }
    4 q; }) _' p% d. U. c1 L
  66. 4 _/ j2 q4 x2 a; E4 u1 p! g
  67.         sender.voted = true;//票权代理出去,状态改为已投票0 z7 H4 j0 R  ^1 A! ~5 t6 |
  68.         sender.delegate = to;//票权代理地址
    2 o2 U4 v; d, b
  69.         Voter storage delegate_ = voters[to];//取出代理节点状态
    ( |3 @4 ?# F* C) r  S0 B6 m% _
  70. 2 i: t% ]% r+ c! w
  71.         //若代理节点已投过票,将新代理的票权投出去,反之则将代理节点票权加和$ Z' z, l% }- t& U
  72.         if(delegate_.voted){
    ' P, g9 D6 C* n2 L+ q
  73.             proposals[delegate_.vote].voteCount += sender.weight;
    3 C# ]2 U1 Y: S5 X- p
  74.         }else{
    ; H/ h/ U" U5 Q! l& N' Y( V
  75.             delegate_.weight += sender.weight;  c% y" {5 f$ {9 Q; A; D! z
  76.         }" i, F, n- p* N* E0 {0 h5 e
  77.     }
    8 t! s7 ?1 S/ D6 l
  78. 1 f' t' c/ m' z' ?$ Q
  79.     function vote(uint proposal) public{! V; \4 v; Z) }& O, W
  80.         Voter storage sender = voters[msg.sender];//通过地址获取对应投票信息  h( d( _% T5 Z/ l5 `
  81.         require(!sender.voted,"Already voted.");//若sender未投过票
    . ?5 M+ p* }. l! e, C( M
  82.         sender.voted = true;//更改投票状态为已投过票
    $ B7 [8 i& I$ c& Y) N
  83.         sender.vote = proposal;//保存已投票节点
    2 O2 A; w6 C5 ~, `$ b1 Y
  84.         proposals[proposal].voteCount += sender.weight;//票权加和
    4 H, Z4 n% |) o, A" _* }
  85.     }
    ; z7 ?, z8 [  g' I/ C1 r& G

  86. 4 B& T8 n( _; V( g& r- `/ P1 z
  87.     //返回票数最多的节点在一维数组proposals中的索引
    ! j  K9 c  C$ R7 T# Z
  88.     function winningProposal() public view returns(uint winningProposal_){
    " K$ }' z6 \+ N& Z# c0 W3 [* \# b' j) a
  89.      uint winningVoteCount = 0;
    / |. y3 p) ^- U* }9 P6 n0 U! ?
复制代码
& L# ?% V4 D7 \/ @- X

+ {) b8 ^8 Y) u1 `2 I$ k( ~3 g0 h
* d  p4 s9 t$ D; D8 S( m% s
solidity投票智能合约代码,亲测可用! P* ]) N3 g+ Y( g: K# L
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

掘金稀土 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    14