Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Solidity合约结构

123458262
99 0 0
合约结构
; \+ b6 d3 }% |: T: C! w, [% V' }6 E: D0 j+ [) `. q- r8 H
在 Solidity 中,合约类似于面向对象编程语言中的类。
/ }2 {! V: P- }. t( l9 L每个合约中可以包含 :ref:structure-state-variables、 :ref:structure-functions、
" Y* ]* z. o8 `1 H4 q% N; Z:ref:structure-function-modifiers、:ref:structure-events、 :ref:structure-struct-types、6 T, C! |4 `+ H* Y4 y4 _( d
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。
5 B- E" g- ]% V. t1 K6 |; l状态变量4 w# U4 y, u2 v! f/ O$ ~( B+ p
状态变量是永久地存储在合约存储中的值。- R1 s: {  ^# U
pragma solidity ^0.4.0;: H/ K" ?) V) D1 |* H+ ~! ^
contract SimpleStorage {
4 Z' |* x7 m/ r7 G& @  V3 F    uint storedData; // 状态变量
( d  ?. P" W3 w3 O    // ...1 T; j. C/ ~4 B6 F: P  o
}
3 i' f$ u6 a1 ?9 [( v' T1 C1 R有效的状态变量类型参阅 :ref:types 章节,
6 e1 W' H2 C4 B2 [7 p0 w. x对状态变量可见性有可能的选择参阅 :ref:visibility-and-getters 。% H( o0 B, i* S6 V; i
函数
" G; O' }$ k. G6 _, z3 `! k函数是合约中代码的可执行单元。
+ {% X$ L) D- [! Hpragma solidity ^0.4.0;% `4 C5 ?8 {# W
contract SimpleAuction {( M/ g0 {) O6 y6 I1 y' Q  ~
    function bid() public payable { // 函数
' m6 B* S5 s2 A8 _. [        // ...+ ^. J3 V+ ~. x  x) ^
    }$ O# D$ r" G4 ]0 J' a
}2 U9 ], r9 ]# g- H6 Y# E9 {- w
:ref:function-calls 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( :ref:visibility-and-getters)。" W" N  ^  e  w1 ^% ~: q
函数修饰器
% D5 u1 r5 q1 V+ u5 `函数修饰器可以用来以声明的方式改良函数语义(参阅合约章节中 :ref:modifiers)。3 N. }# R0 [* x
pragma solidity ^0.4.22;
2 P* s9 |) M2 D/ @! a; Tcontract Purchase {3 m% e1 }- k/ n& b% z
    address public seller;
8 q% T+ u" I  R9 J" u/ S8 l: q* j    modifier onlySeller() { // 修饰器8 [5 P2 T/ I7 ^$ K
        require(/ U" K5 j3 B/ N1 L9 o" P
            msg.sender == seller,: v& u. q# P3 z" C+ j4 F4 V5 |' [
            "Only seller can call this."7 D: m- [2 M4 O  s0 D
        );
  `. A( E$ i2 N1 l4 x6 g8 f% a        _;7 E2 o; u/ ]9 h" y
    }
* H5 S) A$ _6 ?6 L: e; u    7 y6 B( K$ n, x$ d$ q  s! j1 ?$ W
    function abort() public onlySeller { // Modifier usage+ P4 r( w5 ^" x8 c9 b. `
        // ...$ f  N+ t. C) `! t4 {  {6 l
    }
" i# Z' B7 M5 R3 O$ C. P}
/ c$ i8 q+ k' P% s% d3 {事件
4 a, F+ R! A, m% t6 }7 o, L事件是能方便地调用以太坊虚拟机日志功能的接口。
2 g+ ^+ d* M1 Y4 L# ]9 ]# jpragma solidity ^0.4.21;1 c! U# A) j; }
contract SimpleAuction {2 ?* ?; H1 _1 e9 H% Z0 s
    event HighestBidIncreased(address bidder, uint amount); // 事件) k# U( t' Y2 w0 N4 J: Y& `
    function bid() public payable {6 e* {) [: W4 L0 P: w
        // ...
9 G+ Z! }* V( l        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
. G; G: s( d9 j- L/ u6 {5 m    }
5 ?4 i/ q2 y. F* g! j2 L}
7 ^9 v  j+ Z+ y0 a5 O4 f. M. |有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。
' s4 _' n3 ^9 }4 f6 c) A, J结构类型6 r5 g  T6 v2 v9 H
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。' q; [1 j9 ?# Q: [
pragma solidity ^0.4.0;. C9 V  D9 K1 F$ X% |, M/ z% Z
contract Ballot {6 n# e, e# ]; C2 ^8 l" ?
    struct Voter { // 结构
3 {+ i* V5 L/ |        uint weight;
8 }8 |6 n/ E& {        bool voted;9 I) C* q5 V$ L' K  y/ n; J7 f
        address delegate;
) c+ c; |! q' ?+ ~" h7 l        uint vote;
8 u; c4 R5 ]' _- `) e3 I" N0 g    }3 U% o' v0 R' r6 x1 Y+ E; f: ^2 x
}; t0 ]6 u* b2 T9 \, ]- F3 ~7 F3 K( `- {
枚举类型
, b$ T' ?# A+ k  o1 e- k" s枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。  z5 p# j2 i, o2 }0 V
pragma solidity ^0.4.0;, Q% H( t: S& }: N
contract Purchase {' }4 c1 ]* R  g1 \9 U3 z+ x1 z
    enum State { Created, Locked, Inactive } // 枚举6 x% ~& m6 Q$ K! M# }! x
}
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458262 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2