Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
68 0 0
合约结构
) T6 [, Y( s/ b, N
, g& R  |: a$ g' _在 Solidity 中,合约类似于面向对象编程语言中的类。
5 c1 J, c; w  j  Y5 X每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、. P4 c4 d& T+ l& J  k
:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、
; E- O9 [* H% F  ]和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。/ e: s, `/ c2 K; e" @$ @6 M3 v( y$ o6 e) G
状态变量
3 ?( f1 [" I! J. x+ c- J- V状态变量是永久地存储在合约存储中的值。
: Z3 ~$ h; L! e! i2 R% \pragma solidity ^0.4.0;
/ Q* j3 Z; u. S) Zcontract SimpleStorage {
8 I  C' g- h, z: t* G; _: i    uint storedData; // 状态变量2 T2 n  H* n" F
    // ...
3 E$ k1 p$ h& }8 j' n( K# q}* d- s" {1 m/ i2 d% y' C$ I: X
有效的状态变量类型参阅 :ref:types 章节,
, }1 h& s% K: U9 y3 J. F3 K6 m对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。8 o1 p/ e( F  j( o
函数
8 j& b# \+ _% r! l+ b+ l函数是合约中代码的可执行单元。3 k. C0 k' f3 I3 V5 m
pragma solidity ^0.4.0;; A/ N& N, i! T7 p) r% B) o
contract SimpleAuction {
: q0 d( @/ C# ~0 `    function bid() public payable { // 函数
7 O* e! C4 x4 e8 Z# x4 @        // ...
0 A& m" R( U5 v5 G$ o4 z! S    }0 U% J7 i3 V8 o8 a2 ^! C% g" G
}1 z  S* [- V9 S8 g3 i7 h+ I. R+ d
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。: E. a0 H* G  g4 L% W& @" j
函数修饰器- @9 k' Y9 f% N5 N: S* f6 {
函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。: m. J* x! [7 x5 \% k: Z
pragma solidity ^0.4.22;* m6 q' M3 {* q3 T' f% X8 l
contract Purchase {
5 ^- q2 J9 F4 I$ N0 y# i    address public seller;
) S; z' _3 y- a0 E. M8 x3 q    modifier onlySeller() { // 修饰器6 Z; [7 M$ e, E5 p. U+ D* b, W* E
        require(% f6 e" t9 e( n" |$ |- _* f& k/ H
            msg.sender == seller,
5 o- i5 ?: _1 _! f4 k            "Only seller can call this."
' E  T3 k, C. ?; p        );
5 d: e4 F+ ?9 o7 b+ d2 G: V        _;
7 B, X4 [# [# \- N! A7 }- W' g    }3 ?8 l4 D" f3 m- R8 M
   
0 e* k5 I6 J8 D7 C" v    function abort() public onlySeller { // Modifier usage
/ q! W# p) D* E" M% k        // ...0 t! [& e9 _& T. p
    }
5 R6 a5 K) y: U! K1 I9 }, h8 o}4 p# l+ @9 {; n+ m! i
事件$ i4 f3 A' h( l  f# I2 {
事件是能方便地调用以太坊虚拟机日志功能的接口。& Y/ `" Z) N; S% ]$ e4 L6 L8 e
pragma solidity ^0.4.21;
+ j1 q" _9 f- h/ p) Ucontract SimpleAuction {
. ]" w! {8 @( [* S2 c( l    event HighestBidIncreased(address bidder, uint amount); // 事件; r$ o, Y! N& j% b+ s* \
    function bid() public payable {
9 R) p1 S% g/ Z9 n. I        // ...# V. U$ R# Q3 v
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
8 t; p: z/ V6 ^5 s1 [    }
  J* V2 p. v3 S4 R}
3 m% t0 a( |9 |7 \4 K% L有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。+ i6 ~! r& t( |9 v5 p' O8 J
结构类型
7 d* C- i$ j/ Z% @结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
3 s2 M, C: g$ \: Rpragma solidity ^0.4.0;
: c. f4 {/ |1 W# F& J8 M' O+ Zcontract Ballot {9 y" M+ V' Y1 ~6 w) |
    struct Voter { // 结构
1 [7 C; O' N- w) T        uint weight;  c; ?8 S+ ?8 w- Y
        bool voted;
7 X1 Y' w/ q& h7 f        address delegate;
5 h8 v% s% R6 f3 H- ~        uint vote;! w7 z  y1 C1 Q1 E
    }
% ]. V) t$ H- A3 C0 c}
& Q% Z% |/ h, Y9 ]5 Z) u* d枚举类型
, n( {3 \4 K( y枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。6 K3 |. b. d/ s
pragma solidity ^0.4.0;+ [  [6 C" |5 v5 K  D
contract Purchase {* p: ?4 }% J( t
    enum State { Created, Locked, Inactive } // 枚举/ _0 u, t' M1 i. j; v& j5 U
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2