Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
154 0 0
合约结构
) F( W: r0 x& A, d0 m. z' Z/ b6 v' t8 E4 _; T
在 Solidity 中,合约类似于面向对象编程语言中的类。2 E4 T* u8 U9 R! p
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
# f6 e9 q# [. \: F:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、* a$ x: U8 Y$ I2 E
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。' M; @- _6 d3 G/ g
状态变量
7 I# U3 A+ L9 {状态变量是永久地存储在合约存储中的值。; U% v  _* ~% q% {6 B: D& [
pragma solidity ^0.4.0;2 C& S: |: ]0 M7 L2 L
contract SimpleStorage {& \: k) l$ R; M' u! \0 s3 g
    uint storedData; // 状态变量
; a& f$ s* f6 z. B5 N0 c2 S    // ...
$ T5 R* w! O' c( ~7 r}
4 n7 V7 D0 L) X; a+ ?& A有效的状态变量类型参阅 :ref:types 章节,+ l8 G* O3 x( I; h% \. C. J
对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。: e0 @; \4 w$ H& E8 v
函数
, @$ g" q. V& L3 I函数是合约中代码的可执行单元。
* l4 [$ J# E2 c8 j' M$ E! e7 v- Ipragma solidity ^0.4.0;
& P; E2 S/ v7 z% z4 u0 tcontract SimpleAuction {
" S6 l0 S3 |4 W/ v. X$ {3 e    function bid() public payable { // 函数( M% K" ^; u' ]# }
        // ...
! ^8 W& }( o( l' E2 _+ O    }* t: v4 `! ]! |7 E; s5 |
}. R4 \+ u% L" y5 W% G. x
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。
; y$ p6 y8 B% r( [( S! z6 K' N函数修饰器/ J( p% i+ Q( u
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。
3 l2 C# y3 z0 A( D7 ?) X, Cpragma solidity ^0.4.22;
6 H9 `: L* x7 H. V1 mcontract Purchase {
" l. _  K8 V5 X  `" v. F2 R    address public seller;6 V& z  `2 b7 M( F+ R! q
    modifier onlySeller() { // 修饰器- U4 i5 g; v( ?) t( L
        require(+ }/ S* e8 d% }6 \  g9 ~( m
            msg.sender == seller,
  Q9 q" @) o; C/ G* \5 V            "Only seller can call this."
& Q& d+ o7 Q" N- |* o, N        );# w: C% A1 V7 k! f5 g" ?
        _;
, G0 i0 L' t1 u% t+ f7 R, [( v    }
' D" }8 M6 L0 E- B9 L    1 J/ G, g* o$ t6 N
    function abort() public onlySeller { // Modifier usage
0 K/ @! d5 ?; F( t6 s3 s: P& [        // ...
8 E" V* T. \7 V; z$ g- g# c    }. j2 c2 {0 @6 }2 _; R
}
& p+ j* m' X" s2 T" ]8 f; K事件
# X; T  o' J1 S事件是能方便地调用以太坊虚拟机日志功能的接口。; Z0 R/ A8 ?' s0 ]0 Q$ S
pragma solidity ^0.4.21;
) y3 I0 Z9 J6 o' d4 Ucontract SimpleAuction {7 G9 v1 z9 w9 r) P/ q
    event HighestBidIncreased(address bidder, uint amount); // 事件1 i$ o; Q% {" w1 k
    function bid() public payable {* L  e- h/ X4 s; _/ D
        // ...
4 H  ~! @; Z' @- c2 o        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件( A1 N) [1 E, f4 t- V: q. x- g
    }5 C: Q& W, J% X0 D( T6 O) ]
}
, e3 z  ]* A( l# E3 [' P4 d3 g. C有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。3 P) T1 X  a( _( q
结构类型
* [' d* _5 V" y) u: I结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。4 O# }8 w9 J- M5 h/ ?# W
pragma solidity ^0.4.0;
2 |2 h/ p9 X& b7 Pcontract Ballot {
+ |( t  `% }+ N8 H- c+ I  ~    struct Voter { // 结构
( Y+ B( L7 }3 j: N- q, K: P        uint weight;
9 j* j& _  W: Q# w/ O( W        bool voted;* P) Q8 X2 c* N
        address delegate;
7 |3 F2 q( O9 W/ J' g        uint vote;
$ c* U( P- ~9 U/ i) |9 }# L7 _. o    }0 J# d. I5 ^! E) E& F* m8 x
}
( d7 k* ~/ j% U8 I  {枚举类型) e1 Y, S! i. {! N; a, c
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
7 o# k; v3 L* t8 }. _2 v  g0 Zpragma solidity ^0.4.0;
8 J& q0 y2 ], n; E  jcontract Purchase {' M2 A  D% b' B' X
    enum State { Created, Locked, Inactive } // 枚举& g, o  E/ b$ z, `4 }
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2