Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
87 0 0
合约结构' n( R6 `0 r$ ]- |& M
; f& ]6 P; L( b( I# ^
在 Solidity 中,合约类似于面向对象编程语言中的类。2 k2 @' f# r7 R8 {# f/ \6 f( }- n
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
: E0 f1 _1 _, o  z9 W:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、% O. H) M3 U' b/ P
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。2 `- P0 e0 x( O4 }+ c! e% l8 A
状态变量* f% P( z3 z; ^6 E3 N: z
状态变量是永久地存储在合约存储中的值。6 B  _" E% B* {6 U# A4 `
pragma solidity ^0.4.0;( F$ I4 w6 p3 J. k4 r8 P
contract SimpleStorage {
4 d$ U4 J: i! Z8 b, D    uint storedData; // 状态变量: f  _7 i% c# Q
    // ...( o& n' a; V( \: H0 e' D
}  v4 j  Y8 s' \4 P4 B
有效的状态变量类型参阅 :ref:types 章节,
9 ?# c6 |* H' D) m* O* k! P对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。2 A* a! z! j. a; ^  S5 m
函数
7 B8 |! W6 s- H/ O/ w2 x% V函数是合约中代码的可执行单元。# H+ S5 [/ ~6 E! X+ F0 t9 s
pragma solidity ^0.4.0;
( ]4 U- D) c' ~4 k0 r" C7 ]) A8 dcontract SimpleAuction {& N" l% [5 I1 j* b% W' X2 ?* X
    function bid() public payable { // 函数; o8 |+ j6 u: F+ _7 O( e3 `8 G( i
        // ...) ]1 P/ l: E  N) ^% V% Y, N
    }
3 f  B8 B3 |; l. q+ `}, @2 n3 \  d/ q- d, z+ S
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。0 y5 ]/ Z9 ]  h: a" @# O
函数修饰器
1 b; B) x3 Y9 C) D函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。; N# Z$ P. f/ h; b
pragma solidity ^0.4.22;
1 ^* n$ M( G7 P, n8 b! A# @4 w& ocontract Purchase {% y, R/ a1 b* [
    address public seller;& G  Z4 Y+ w0 g* k8 H8 o- Q8 n# I
    modifier onlySeller() { // 修饰器
$ p5 o# D) x; ~0 I6 }: X3 h# q        require(
" Y5 Y& d* Q6 q' f5 _. J            msg.sender == seller,! [7 x. D% T' K0 D5 a  A1 \+ ~; q
            "Only seller can call this."+ e4 G3 G; R8 R2 K. |
        );
2 q& x' V5 t( B        _;0 }- U, A% ]& O
    }7 a* J0 v# u  B, t' Z0 G$ D: S
   
( j. h: Q6 `  f3 v; M$ `, m    function abort() public onlySeller { // Modifier usage0 \" t$ o2 H! ~0 `
        // ...+ a6 Z0 i6 q# H' [) d6 m* ~
    }
* t8 x7 H! ^8 C6 B# m}
; T# r$ h% A: F( `7 t. Z事件1 t, m! p* h" i' x( c" Z
事件是能方便地调用以太坊虚拟机日志功能的接口。+ c4 M! n, E4 J0 ?* ]$ Y1 U5 K  ^
pragma solidity ^0.4.21;
7 m! {6 ^: l+ H) a. c9 Jcontract SimpleAuction {
; p3 d+ @: b. ^( g    event HighestBidIncreased(address bidder, uint amount); // 事件/ R  O, n( E) Z# W! M; t
    function bid() public payable {0 B+ \  v9 B7 E6 f( h" ~' d
        // ...
: K6 @$ [$ l$ _& a4 i  f6 i        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件2 R  E( D( M3 ~- t& `
    }
' D& \5 x9 y( d( B7 V; ~}
% Z8 C. M8 H: B2 h- c" X( U& s有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
/ J, Z  ]# ~% @结构类型
0 m7 N* G: ?( r8 [5 |3 [8 e结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
3 Y. i8 n: Y( y& Z8 F7 [) qpragma solidity ^0.4.0;6 x6 S& B1 J7 Z9 I; a/ ~
contract Ballot {
1 |! E8 Q( N- o: p) F# s    struct Voter { // 结构
9 ^0 A: ?6 ^: H2 P        uint weight;6 l: ~- {1 N% U5 {+ ?* v
        bool voted;
/ F4 R$ x) M+ P/ j0 A        address delegate;
" k5 k% O" t- X9 Y- ^% ]        uint vote;& _/ T" ~" O) r  U. n$ I
    }, _" v5 v: @6 f$ G! U# }; ?' U
}* ^4 R7 U1 H' s) o; @' Q3 o
枚举类型
# s6 k) e. `4 q6 ~! A3 z! W7 H枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。% t8 n% ^2 w$ U- H% ]) [
pragma solidity ^0.4.0;
! m% [2 o, T  K4 \8 W. H/ ^+ ]  E+ \$ K2 v# `contract Purchase {: Y5 F& @7 ?) {+ o
    enum State { Created, Locked, Inactive } // 枚举
& Y- f% {- ~+ }2 M}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2