Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
135 0 0
合约结构
2 ]2 ~1 U! u3 f. n
1 a9 Z. F+ ^6 \% a2 k* M在 Solidity 中,合约类似于面向对象编程语言中的类。
4 r% O& b* l5 Z& @3 x  Q9 I每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
+ v0 X" s6 ^3 i7 Y1 o3 H:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、9 E+ D" l# X0 Q5 l7 T
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。) m% [6 R9 D: B/ C. G3 Y& J  w
状态变量
6 R: ~/ `# p4 q- }! z. c2 Q: K" G% v状态变量是永久地存储在合约存储中的值。
/ |5 p$ J: @, @, B% u" ^' y; G" Wpragma solidity ^0.4.0;1 v' [& }: z8 F! k/ p! O
contract SimpleStorage {: f& t$ }& {" g; j
    uint storedData; // 状态变量/ Z2 s$ T$ V  y
    // ...
) v$ q: ]2 `2 e% q# E; n- Z+ x}( r4 y  O3 j2 d) |/ M
有效的状态变量类型参阅 :ref:types 章节,
8 b6 V" C9 \- k对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。
% v) g  Y! K/ g9 s函数+ R& \- F* m8 z+ Q8 y+ L7 t
函数是合约中代码的可执行单元。
3 m7 y: U# a2 G$ p2 npragma solidity ^0.4.0;
) G7 F  Q0 p6 E2 S3 e9 X# hcontract SimpleAuction {
: }$ S% I2 p/ q9 |/ g! p( T/ D( }  W    function bid() public payable { // 函数* S2 A3 s! k7 w% A- a
        // ...9 ?5 x& G6 {+ l! _; T3 n7 [( b
    }. R- h% ?$ R/ C& f# x) E6 \
}" Z; a. F% N# N
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。( l. W& l' s* \# \6 s8 U
函数修饰器
7 C, h* p' |2 l9 r9 v% W函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。0 _' f2 R7 ?' w! u3 u
pragma solidity ^0.4.22;
% \  F* q- ^5 N- {; y# }3 hcontract Purchase {
" ?* }0 u9 j- x( m/ o' E0 t    address public seller;! Z  O: B5 q! r" k! w- d
    modifier onlySeller() { // 修饰器
  g9 U! C& l3 s        require(
& @; w4 n9 w* n            msg.sender == seller,
! T0 E: C+ c0 p1 A" Y# [            "Only seller can call this.", j7 c# r2 t5 n2 M) Y4 M
        );: |2 D& @$ G  j4 x! O
        _;# B2 V4 p- U. x5 p
    }
, c0 U/ q' ]+ O# n    6 u0 K! b5 w8 b  r
    function abort() public onlySeller { // Modifier usage; y8 ]  d; J) _, N% S" C
        // ...
( J# \' A' K2 N    }
% o1 ~5 g  H8 G% i# z}- \; l' X1 L+ g$ T
事件
: e* I5 v$ o, {* Q' d5 \+ Q. o7 }事件是能方便地调用以太坊虚拟机日志功能的接口。8 P9 T+ }2 p; b; H3 _3 J; }' d
pragma solidity ^0.4.21;/ A6 }6 p% j$ s1 I5 {( v9 N
contract SimpleAuction {7 u% Z4 p' y# a' `9 B3 ~7 ^
    event HighestBidIncreased(address bidder, uint amount); // 事件
  L2 G2 t) v* t* t8 f    function bid() public payable {
# f* c0 N% b5 ^5 R/ ?2 y  t# k        // ...
; Y$ D8 I/ H! y7 Z- Q% ?        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
& _3 d- [  h. y    }9 a2 A, ~7 ^( h) u9 |# v
}
- m5 q$ G: v; R9 i7 Y( |5 y' x有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。4 H. o& U0 J% d; t/ O$ S' t& f: L
结构类型  w2 x2 t- x9 H) J( w3 s+ J
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。: ]8 s: v1 m6 W: X0 X1 Q
pragma solidity ^0.4.0;
6 l8 Q' E% V/ ?. scontract Ballot {8 q0 ?5 S  }) B) V& q# {5 Z" n
    struct Voter { // 结构
; T% d# X: g2 w$ v! g8 r        uint weight;! h5 l/ l& C, Q' y4 E) v
        bool voted;
& @* R" }0 G, V5 y/ E        address delegate;
* `& }$ K  y7 v! c* P        uint vote;
- K& F6 x& t# Z# a0 s' S9 {5 a: j! Q    }
8 _' x9 z7 ~% H3 T* q* _3 C}; M4 `9 d0 a. M+ A, \: T$ X/ w" \
枚举类型$ Y6 v* B$ ~5 l
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
+ Y9 t# [4 G4 ~pragma solidity ^0.4.0;# }1 G1 h, J8 B- ~
contract Purchase {
3 ~! d4 A: c& Y! b+ e" u2 @) _    enum State { Created, Locked, Inactive } // 枚举
* t& b- m9 I5 j, G8 E. W}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2