Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
73 0 0
合约结构5 v0 p& k8 H' d7 ?% E; Y4 \) }

. n5 K$ I# l, ]# }. W在 Solidity 中,合约类似于面向对象编程语言中的类。; P6 x$ K8 o$ t" H
每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、7 l! s; G1 K; Z. v/ q
:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、
8 X( _" Z2 ^6 Z9 r' s, I和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。
; X4 U# @; w4 p; l* G1 y) D7 ?$ q: H状态变量
$ v) B! u% z- N0 M$ C6 ?状态变量是永久地存储在合约存储中的值。0 y% `, @* h- d% O. p
pragma solidity ^0.4.0;/ k- s% d/ f5 |2 l; l6 F
contract SimpleStorage {0 j7 i4 Z6 w7 E4 B. P
    uint storedData; // 状态变量2 ~) C2 I# R3 k6 J' J5 {4 v
    // ...
" H3 B/ `2 G- o  y}: F2 R# F6 g9 S7 t3 i
有效的状态变量类型参阅 :ref:types 章节,
: e2 L, v1 v0 A  F% a7 i对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。7 _& D/ x6 b9 b$ y6 o
函数2 f/ {' `) |3 L
函数是合约中代码的可执行单元。& l: v3 g7 Z9 z* v( X' r
pragma solidity ^0.4.0;/ I1 a! e6 i. A7 l5 L( s( g4 |+ B0 M
contract SimpleAuction {6 ~2 I: r, B/ e5 n! I) [
    function bid() public payable { // 函数, i; G" l9 y; a: s$ A
        // ...0 H8 o  m' d/ }! j" p+ y: ~
    }/ Z# \" m$ [; p$ |) ~
}
7 g0 ~% @. ?0 F3 I! I:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。' a0 S$ ?* X2 [
函数修饰器, c* x+ S3 ~# K* y
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。( h4 s4 [' ~5 X9 F% b
pragma solidity ^0.4.22;9 O; k' T& j: [5 m* B
contract Purchase {
+ |% F! i0 Q# z# H    address public seller;
9 m* ~/ ?. b2 @! c    modifier onlySeller() { // 修饰器% b8 N" a9 Z+ V$ q
        require(; p2 ?7 T9 Q, d$ w# |% J; F" O
            msg.sender == seller,
) p4 Z  ^5 ^1 t+ h9 b, \            "Only seller can call this.": k' j' a9 O  q2 _/ z) r& h4 Q
        );% v: y# |+ H& ?& e/ W2 ~
        _;
( K& C2 K* p: M8 P" _) h    }
0 s' ^/ m; v9 G& X      |6 v7 v2 m9 m4 ~0 r' _0 `5 c
    function abort() public onlySeller { // Modifier usage
5 Z( [! z, v# S* g        // ...# V$ D1 I8 c  l" ^
    }
4 ^" R2 j& F9 s% \. u$ K}8 Y, P6 y: Z* u& S3 z. t& a2 |; O
事件
7 {8 P. z. g3 E/ \( u" s事件是能方便地调用以太坊虚拟机日志功能的接口。0 ~. V+ e" s; C" ^8 T( k& O
pragma solidity ^0.4.21;1 p. P: X4 C  H$ y" O2 _
contract SimpleAuction {" T3 u. ?5 ^. o* {
    event HighestBidIncreased(address bidder, uint amount); // 事件. x$ j4 ]: s; {8 P, L$ }- j, S
    function bid() public payable {
0 ]1 V0 t' v2 j. U        // ...
0 S* o# J% [( Y* {2 B8 f/ ~* _        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件- m% Z# j  y5 `& ^- L! |; |
    }0 a6 A+ o& ]6 j$ ~, `
}
. E0 H) N6 u! |有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。+ o8 l1 `% v$ D. ~! d; s7 ]% L
结构类型
, n7 U5 y5 \# ?结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
$ W) }4 Q) o* A1 r& \pragma solidity ^0.4.0;0 L4 I5 d" G* B* \& J
contract Ballot {
5 h4 `+ A$ s/ l  I* }    struct Voter { // 结构
+ r* W; S% K5 ?" c        uint weight;* R2 W- N" C8 }/ U* L. s
        bool voted;2 s& B& m/ }* \
        address delegate;
8 h0 u) I8 G; N        uint vote;) I3 _; F& Y' n5 ~( P2 z) j
    }
, M" |. w* Z% `2 V, Y, ?  ?}2 t; @9 ?9 o1 Y8 U- }: S
枚举类型7 U# r6 p& o% r% m" D! r
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
% D! v) |# E) {) C. X- Epragma solidity ^0.4.0;3 E" O+ v0 R3 Q* f0 \) _/ Q
contract Purchase {
% G% g6 B7 M0 c0 {    enum State { Created, Locked, Inactive } // 枚举
7 B) @0 U1 l7 C$ B: |}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2