Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
149 0 0
合约结构7 P' I6 N9 ^+ x# \; g
1 {$ P  g" s6 h  v# n
在 Solidity 中,合约类似于面向对象编程语言中的类。8 w# N# `. m. y; ]
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
6 k$ E8 k( Q  H% G  ^# x:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、* ?) p2 }! F1 N" l
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。' l0 B8 ]. p$ p$ n7 E5 l, W8 }! z
状态变量
. w1 J- ^  U. t( Q2 P状态变量是永久地存储在合约存储中的值。
) I- @" P" e% R" A4 Npragma solidity ^0.4.0;9 z+ M3 j0 m) H# L2 q
contract SimpleStorage {
4 k- O' s8 A% R% X: J2 i    uint storedData; // 状态变量0 |: X: p: H# t4 Q+ A6 F) b. f
    // ...# D5 _$ T9 H9 w
}
+ |' ?, D! X6 K, y3 F# V+ k* e有效的状态变量类型参阅 :ref:types 章节,
( _' ~0 H' h9 N! }" c( O对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。
# t' a" J& F* c7 q! {& r函数; \% B7 y. A. n; m% p
函数是合约中代码的可执行单元。
4 {& p( ~/ P' o! Y' c3 vpragma solidity ^0.4.0;9 J7 v: Q& j8 e4 b
contract SimpleAuction {" D. H- s. G5 A; x5 v; ?3 k( y" [
    function bid() public payable { // 函数
! R0 w9 ^0 n4 V; v! E, X) [+ m        // ...
* a$ }- C. E- ?" p    }
( p* o& A" Z8 w' h% P}6 c! j! e4 u: c3 V
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。$ |8 ]! A& l' D; e# ^; ~% k. z* k
函数修饰器
( w* I" w/ @+ d" P# U! p" J) c8 C函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。
: S+ Y& @2 q8 R% r+ T+ r! @  p1 rpragma solidity ^0.4.22;( o8 P' Q0 J! P; P. k
contract Purchase {8 t' x- i9 t$ ]. T* }2 |
    address public seller;+ I0 @. I& P, J. P; o
    modifier onlySeller() { // 修饰器
4 ~1 e& o% q; b) }) N( F9 |6 Q( b; B        require(
9 S) u0 `2 Q  p) u- H% `            msg.sender == seller,: ~+ S3 |$ l; j$ Z, H3 Q0 C- m; v( T
            "Only seller can call this."
. G- Y$ W; H) f3 _" L; e5 z1 D! }4 F        );, M' Y* q! M- u
        _;
6 @7 n- }9 N6 w4 P3 D    }+ D' v  [& M; P2 H( }- l
    8 K, V1 f% p; K1 B, B
    function abort() public onlySeller { // Modifier usage
+ b* P! m; j) G        // ...
: _$ \. Q$ n6 S! L4 Q% N    }
% e" Y9 @: I3 J1 R/ {}+ h3 z0 o* h* i
事件) v9 k" l- j2 H3 ?
事件是能方便地调用以太坊虚拟机日志功能的接口。
' W3 K8 x# N  I; |+ Bpragma solidity ^0.4.21;
( @) x* o. O4 Q. kcontract SimpleAuction {
# Y2 K/ \5 c' c9 B+ o; \0 E7 L9 U& g    event HighestBidIncreased(address bidder, uint amount); // 事件
& |* o2 E' F4 \( `    function bid() public payable {2 N4 k: L. E7 V9 Z
        // ..." a9 a' k1 k9 T5 Y! E
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
# k7 o/ ]( H* s8 l) _  l    }- R: b8 l$ B1 y! f6 a" L2 j
}7 W' P2 |! B) W+ U2 ]1 O# \
有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
* B+ D, H, G! K- L7 x) O结构类型# d$ o" N3 d: Y; L
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
6 Z! X+ C0 |# Qpragma solidity ^0.4.0;
4 m( _9 o4 @* t( Rcontract Ballot {  w3 a( t1 G" B5 P7 W7 r% b7 d- f
    struct Voter { // 结构& }7 J. L) O1 q3 {$ B
        uint weight;
( L/ H' E6 q+ f: T3 y) T        bool voted;9 `4 Q/ f/ t3 k
        address delegate;
2 U2 Y1 Q0 e& P        uint vote;
) N) d* v3 z5 q! L9 D    }$ }5 \9 N9 Q3 w3 k3 L
}
& K+ J% \# h" ]) h8 O' n* W* z9 Z$ l) Z, ^枚举类型8 I: p' q, J6 z  `5 y2 Q# c
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
( R  Y" z! f* j! V" ?0 u( Npragma solidity ^0.4.0;
! j/ _" I: G, d* ]4 N4 n: Dcontract Purchase {
2 r" J7 {0 N9 t- ~- P% S# E    enum State { Created, Locked, Inactive } // 枚举/ {+ h; r) Z" V5 Q4 E) G3 O
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2