Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
77 0 0
合约结构" a; ]* a9 l, W: ]( ~

, u, [# ^7 \/ s) ~! J在 Solidity 中,合约类似于面向对象编程语言中的类。8 w/ X5 o: C5 U% }4 T* O
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
4 G9 z: P: c8 k! |:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、+ H1 z4 n( e4 i& C5 `
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。7 S3 r3 Q0 k9 R% E4 l% ^0 ^
状态变量' u7 T2 t9 w+ T9 }0 P
状态变量是永久地存储在合约存储中的值。
' Q, J) I  `8 j) G  fpragma solidity ^0.4.0;; g- o* K- V+ z. k
contract SimpleStorage {
* z4 J* k. F- S& W+ Q) \    uint storedData; // 状态变量
) E: P  c+ _9 _. V- q# {    // ...) t+ ]6 [# M) r. K8 Y
}
* l& A( B5 Z+ N9 K有效的状态变量类型参阅 :ref:types 章节,
9 `! \) P8 Y, K, H+ r' q对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。4 G" n* I( I' q0 S; X2 }
函数
6 r& K1 z: M) Y/ |1 Z2 s! k函数是合约中代码的可执行单元。$ y: B1 ?3 X. Y) @# p" |
pragma solidity ^0.4.0;6 u. M6 v# w( V/ z& `. T7 e$ r
contract SimpleAuction {
* z- [: j: l# u0 W5 |    function bid() public payable { // 函数) J3 ]5 Q2 l0 {9 J) w7 m% S2 s
        // ...2 f' A( N+ d; A: A) X* c! g2 x& E9 ^
    }6 L( C' M. u3 o' C  w
}6 s' j; c! L2 j+ T( L( s2 n& v& H
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。, l* M# V/ W+ l1 _) @  `; j. k
函数修饰器6 e) L" a) X$ p
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。
/ C& v. {  T+ q+ B, v+ O$ V/ a6 W7 }4 wpragma solidity ^0.4.22;
! g( ^0 o9 O# I8 Zcontract Purchase {
! G* J; {9 ]" [4 I+ R" ]2 K- T3 ?3 F    address public seller;+ S, d3 y. t" B  [0 p
    modifier onlySeller() { // 修饰器
+ B; A& ^& R  P* J        require(. C' ?; n* S2 E& |4 Z
            msg.sender == seller,
; ?. |! u0 l, x8 a. [$ \4 p+ s1 _            "Only seller can call this."$ Z8 J' L2 P4 r/ e: ^+ y) L
        );
7 |( Y. H* |- o1 ?7 k        _;
) W/ P+ R& \- s3 Z% f    }
' y+ v+ s6 o8 L* T    ! v( W3 e/ ^8 P
    function abort() public onlySeller { // Modifier usage( T! i. G/ \0 w3 ^! t
        // ...  A: N* K7 `5 z7 u2 e
    }( r) x7 K9 V' q9 v; p# s) N1 p% s9 Q
}
- u1 t$ ]: Z# m事件! X* ^0 x- O! T, W4 L
事件是能方便地调用以太坊虚拟机日志功能的接口。$ g2 M& N8 d( e& e* ^( x
pragma solidity ^0.4.21;
" C6 C3 v$ a9 F3 B% T' X9 jcontract SimpleAuction {9 _) G  H+ ?0 K( s( F
    event HighestBidIncreased(address bidder, uint amount); // 事件9 N( W; z8 I0 f" q) C+ T
    function bid() public payable {3 ?* z8 s- T0 z, A# {
        // ...
: W7 G  y3 V8 J& B        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
& R7 [/ y) \5 i5 L+ W+ M  R    }+ o0 o5 A3 z- M: f
}& H; n" x2 v" w8 N6 _
有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
% _% B9 ]: M4 U结构类型; @4 B. ?4 p, Y) a8 b8 y
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。4 V. @4 |! |) a" `' t: U
pragma solidity ^0.4.0;. X7 I4 ~3 o$ b# v
contract Ballot {3 ~, |& C& o$ V8 ^) K( P( x
    struct Voter { // 结构
5 B1 G: N, j2 O, ~8 K        uint weight;
: V9 ^* h% Q  f1 F: ?4 y        bool voted;
2 z8 A( K/ {! ^' M& v- @  p        address delegate;* B' f. [' M5 ^; X. R$ I
        uint vote;
- R2 l" Y  `! g- P) h0 r. l( K    }
( w# ]# D; C+ X) i}# I5 c( N. E5 l% @! @
枚举类型
% U- X, {  t4 m1 {3 A& V枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
' W: K% P- S8 q# c( W0 m/ x4 bpragma solidity ^0.4.0;
$ c: T+ _, s3 U6 }, Ucontract Purchase {
* w' G/ \$ m. `: P. p  V+ p  D    enum State { Created, Locked, Inactive } // 枚举# x4 i: H* F# l3 p. M
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2