Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
75 0 0
合约结构
! b6 W1 }- p& F
' v/ J: P5 w8 d在 Solidity 中,合约类似于面向对象编程语言中的类。% K+ D: ]( S9 i5 m1 `( S
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
9 c+ {  ^7 m9 |- j' B:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、. V6 g1 j. @' Z, y* ?
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。( C9 J$ X! ^9 j$ }. }9 p  E% s
状态变量6 f* [$ l/ ^4 T  y9 E0 T0 }# T
状态变量是永久地存储在合约存储中的值。* w" E4 W' F  z) u( J1 P) Y& M
pragma solidity ^0.4.0;! B3 }) k# V; c" w
contract SimpleStorage {
1 \- E7 ]+ f5 ?6 Y' {4 U! i5 M& ~% g    uint storedData; // 状态变量# u& a' u/ q( i5 {7 v& d
    // ...
/ V' [% \3 b$ ?) t}2 d" o/ |- n* D$ h* I4 k% I
有效的状态变量类型参阅 :ref:types 章节,: D% w. Y1 m$ H6 j' \; \5 @2 o
对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。* x: {0 F$ o  @* \3 I
函数
+ u+ p5 D. ?8 u, P( T* L函数是合约中代码的可执行单元。
6 l6 [1 m& Y+ R: t* v  h/ m' `pragma solidity ^0.4.0;6 E/ e, T& E& W5 f# o' l! a+ L( U
contract SimpleAuction {/ b" `' }; x% a' m# t1 o
    function bid() public payable { // 函数$ j* N2 ]/ E' s  {
        // ...& K/ s. k4 f3 T; `5 i; ^7 g3 a
    }
% x+ h0 v  N7 s" H* M. l}
6 ]% a- W' i5 }" `5 g:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。
! n2 Q+ v* O) W/ W函数修饰器4 B  d, f0 p9 p
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。  j2 }& ~1 J3 y- e
pragma solidity ^0.4.22;
' e# a" n' i7 L7 l0 \9 }% f( B3 ocontract Purchase {
" S# n4 X' X& _, _    address public seller;
1 Q5 c% `1 g, o& g" h8 `    modifier onlySeller() { // 修饰器
6 Q% J, R7 q- U3 T% V; {* H        require(! V& N  g6 K* U+ T# J
            msg.sender == seller,( U# E! T. n. n6 W3 C& ^7 |5 ^3 L
            "Only seller can call this."% n) x3 Z, W$ N5 x$ a( ^
        );7 ]6 E: \" Y7 x
        _;
3 k" M- ]' I! k% e! q" Z    }# a- T) |8 N+ W5 K1 Z
   
5 F7 Z. |) h8 y) `0 D    function abort() public onlySeller { // Modifier usage
0 I$ @% ]3 o. k" d+ [( P, d' k2 W* e        // ...7 l& Y9 C% G/ _8 M6 ^+ T. B  N
    }
" ?; M/ l+ H% K! y. W9 s5 K}
9 u6 d- [0 u; c3 [, O& u) c1 o事件
3 i  e# Q. \, s, P+ B事件是能方便地调用以太坊虚拟机日志功能的接口。% r( g+ O% J8 e. h
pragma solidity ^0.4.21;8 a+ D* s8 j9 E5 h: ~5 {
contract SimpleAuction {- `2 |5 `* f, U$ A+ Q, M3 z& l3 [
    event HighestBidIncreased(address bidder, uint amount); // 事件: d* B  F; \! v) g
    function bid() public payable {  b1 a% E( c. A9 r& U
        // ...
' i# u" E) m2 C: D( Z9 e% C) F! U        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
2 k7 d3 F/ M+ W* E, _; Z    }
6 W* L1 ^2 o3 ?, p* Y: G  O- B}0 A( r0 ~$ k' Y" A! Z. c  t
有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
& q6 |4 H% T: \4 H9 q7 E0 C& w结构类型7 G0 T3 K+ @9 y9 x
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
9 |6 f5 Y( C$ v( F& Rpragma solidity ^0.4.0;+ C9 g  b# O8 e1 o' @
contract Ballot {9 ]* D, J" M* t
    struct Voter { // 结构
* ^/ B" L7 `+ [5 c        uint weight;
, Z. X! g' s# ^2 q5 e6 r8 E        bool voted;
) Z# B+ R) D6 D/ y3 N& n; b1 L        address delegate;" u. R! c  _, ?4 V, m! _% y' w; S
        uint vote;
5 c- ^. U# e; g7 H    }5 E1 q/ b* u1 H9 E- L7 m/ A9 o
}5 ~( l9 k& |9 Z( T4 B. M
枚举类型" p6 A) C6 {, W/ p
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。( X; ^- _% `, V8 g! z; b
pragma solidity ^0.4.0;
8 A5 D, M' e# o; a( d" T  t4 }8 ocontract Purchase {! `) x; B: T% z% i: I# }
    enum State { Created, Locked, Inactive } // 枚举
. ]7 `6 ^0 V" m8 d}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2