Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
147 0 0
合约结构
2 C/ d$ y- Z5 Z7 Y& `+ d/ x, P2 F8 X! w
在 Solidity 中,合约类似于面向对象编程语言中的类。/ u$ B# F" U1 _* ~
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、. l: D6 l. z( c& P' E2 u! _. y% [
:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、; Z$ I; H, ?+ m. b. n  w: L
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。
! T+ c/ s9 `9 q) x; \, z6 M4 U3 e, @状态变量; r" ?7 z. p5 ?
状态变量是永久地存储在合约存储中的值。
. \3 k0 Z" m% Kpragma solidity ^0.4.0;) k' P- g+ y% T8 @2 u
contract SimpleStorage {
" c% ^/ {/ ]6 a, M, S    uint storedData; // 状态变量
8 ~% H) z* \. ~6 J* x    // ...9 E2 c1 M* y6 M5 K( P6 W
}
5 s0 Y/ u0 c1 O# V# J& O有效的状态变量类型参阅 :ref:types 章节,' q% D% H; G  V, i( ]- R
对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。9 {$ k" q& j+ s  Z& P1 k* l# e, Y; Z
函数
4 l' J$ c, S* Z/ M# C函数是合约中代码的可执行单元。' X& i% o+ k% N2 T- P  C
pragma solidity ^0.4.0;
0 X3 t" z% r, ycontract SimpleAuction {
/ v! s$ a% `0 G, n5 G, z; v8 {) H" B' `    function bid() public payable { // 函数# |! t9 |4 B; X
        // ...
* d3 b/ e0 t: N: Z0 e! `- [    }+ }/ I  p& c) ~3 G! `7 P
}- }9 \' d0 s5 e3 m: j1 J
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。7 J2 j0 @* o1 t8 h2 Q( H7 I& t  x
函数修饰器4 I5 J& H& M& k4 Y: v. h
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。
( h$ x& ?  q5 v' m% b& Cpragma solidity ^0.4.22;( `" u/ b5 E, W9 j+ Y" \2 |- M
contract Purchase {/ T2 u- q" r0 c3 a% q
    address public seller;
: T' |0 W  J/ a; x' F    modifier onlySeller() { // 修饰器4 H& J$ A1 A+ }) p8 k) n
        require(
0 J- Q% l8 y4 x1 z            msg.sender == seller,2 U0 @6 _; Q7 S" W/ m  H
            "Only seller can call this."
  h' C! w6 j( w: |; O        );
$ l- Z* @8 M; i% `% K0 ]        _;
; ?7 M( @3 d, T    }
5 E) I* N# d/ Q, ?( j+ j    $ V, k0 l+ e2 T, N( s- t/ t
    function abort() public onlySeller { // Modifier usage: A. R8 G4 T* D; f
        // ...
  l1 D8 ^3 [' j% @2 i9 c* m    }
& A; F* j1 B- R4 b( }9 H5 B}
* v- @. i3 e1 x3 T( D2 M. c: d( p事件7 f7 s, F* J0 x* T) z+ }) l3 G& i
事件是能方便地调用以太坊虚拟机日志功能的接口。
  x% l1 V* t1 fpragma solidity ^0.4.21;
) A" `1 X. p3 t. t' pcontract SimpleAuction {9 c2 l6 c6 d2 }9 }
    event HighestBidIncreased(address bidder, uint amount); // 事件3 X2 k9 |% M0 r; `, c
    function bid() public payable {
' m* X: e* E' Y  j        // ...+ }' N3 d8 g. U. d% `8 @
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
( R; l( U: \8 }# U( H. h8 T    }4 b0 ~+ k6 X! W
}
) Z  ]% f1 K$ `. e' t9 F1 W' y有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
2 k7 g1 G$ }* X7 B& T4 l结构类型
) C1 @4 b0 e1 m5 d1 u% a结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。" k% k5 ~' l, J/ K7 z" {. V
pragma solidity ^0.4.0;& M8 z& o- r2 a+ A
contract Ballot {" D7 W5 Z+ U& z( }7 M/ S/ }% a; _2 n
    struct Voter { // 结构; d& D2 s9 f, I4 p' E8 ~, h4 Z
        uint weight;
$ ?6 x0 S9 I" `+ A/ X& ~4 ^        bool voted;0 A/ D+ k+ I- z: \' ~! h: N/ B$ ~
        address delegate;
% m- F# r: z- Y7 O        uint vote;
4 d0 L( b( k+ O, w8 B+ I' E    }
8 j: I8 J3 C" ~6 m5 L  V/ y}4 L7 B+ J; y$ m  t% r0 v
枚举类型
; I; o% `: @7 Z) g& s枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。. ]  H/ }0 w! I
pragma solidity ^0.4.0;
+ T& M) |& g  Z! icontract Purchase {
$ k  [9 M' h( ?    enum State { Created, Locked, Inactive } // 枚举5 U; ^  U* C+ B0 d. T" g
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2