Solidity合约结构
123458262
发表于 2022-12-27 10:28:22
73
0
0
在 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、
和 :ref:structure-enum-types 的声明,且合约可以从其他合约继承。
状态变量
状态变量是永久地存储在合约存储中的值。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
// ...
}: F2 R# F6 g9 S7 t3 i
有效的状态变量类型参阅 :ref:types 章节,
对状态变量可见性有可能的选择参阅 :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$ |) ~
}
: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 {
address public seller;
modifier onlySeller() { // 修饰器% b8 N" a9 Z+ V$ q
require(; p2 ?7 T9 Q, d$ w# |% J; F" O
msg.sender == seller,
"Only seller can call this.": k' j' a9 O q2 _/ z) r& h4 Q
);% v: y# |+ H& ?& e/ W2 ~
_;
}
|6 v7 v2 m9 m4 ~0 r' _0 `5 c
function abort() public onlySeller { // Modifier usage
// ...# V$ D1 I8 c l" ^
}
}8 Y, P6 y: Z* u& S3 z. t& a2 |; O
事件
事件是能方便地调用以太坊虚拟机日志功能的接口。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 {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // 触发事件- m% Z# j y5 `& ^- L! |; |
}0 a6 A+ o& ]6 j$ ~, `
}
有关如何声明事件和如何在 dapp 中使用事件的信息,参阅合约章节中的 :ref:events。+ o8 l1 `% v$ D. ~! d; s7 ]% L
结构类型
结构是可以将几个变量分组的自定义类型(参阅类型章节中的 :ref:structs)。
pragma solidity ^0.4.0;0 L4 I5 d" G* B* \& J
contract Ballot {
struct Voter { // 结构
uint weight;* R2 W- N" C8 }/ U* L. s
bool voted;2 s& B& m/ }* \
address delegate;
uint vote;) I3 _; F& Y' n5 ~( P2 z) j
}
}2 t; @9 ?9 o1 Y8 U- }: S
枚举类型7 U# r6 p& o% r% m" D! r
枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 :ref:enums)。
pragma solidity ^0.4.0;3 E" O+ v0 R3 Q* f0 \) _/ Q
contract Purchase {
enum State { Created, Locked, Inactive } // 枚举
}
成为第一个吐槽的人