合约结构
Solidity 中的合约类似于面向对象语言中的类。每个合约都可以包含对状态变量、函数、函数修饰符、事件、错误、结构体类型 和枚举类型 的声明。此外,合约可以继承自其他合约。
有关合约 的部分包含比本部分更多的详细信息,本部分旨在提供一个快速概述。
状态变量
状态变量是其值永久存储在合约存储中的变量。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract SimpleStorage {
uint storedData; // State variable
// ...
}
请参阅类型 部分以了解有效的状态变量类型,以及可见性和 Getter 以了解可能的可见性选择。
函数
函数是可执行的代码单元。函数通常定义在合约内部,但也可以定义在合约外部。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;
contract SimpleAuction {
function bid() public payable { // Function
// ...
}
}
// Helper function defined outside of a contract
function helper(uint x) pure returns (uint) {
return x * 2;
}
函数修饰符
函数修饰符可用于以声明方式修改函数的语义(请参阅合约部分中的函数修饰符)。
重载,即使用不同参数拥有相同修饰符名称,是不可能的。
与函数类似,修饰符可以被覆盖.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;
contract Purchase {
address public seller;
modifier onlySeller() { // Modifier
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public view onlySeller { // Modifier usage
// ...
}
}
事件
事件是与 EVM 日志记录功能的便捷接口。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.22;
event HighestBidIncreased(address bidder, uint amount); // Event
contract SimpleAuction {
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
}
}
请参阅合约部分中的事件,了解如何在 dapp 中声明和使用事件。
错误
错误允许您为错误情况定义描述性名称和数据。错误可在revert 语句 中使用。与字符串描述相比,错误便宜得多,并允许您对附加数据进行编码。您可以使用 NatSpec 向用户描述错误。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
/// Not enough funds for transfer. Requested `requested`,
/// but only `available` available.
error NotEnoughFunds(uint requested, uint available);
contract Token {
mapping(address => uint) balances;
function transfer(address to, uint amount) public {
uint balance = balances[msg.sender];
if (balance < amount)
revert NotEnoughFunds(amount, balance);
balances[msg.sender] -= amount;
balances[to] += amount;
// ...
}
}
请参阅合约部分中的错误和 revert 语句,以了解更多信息。
结构体类型
结构体是自定义定义的类型,可以对多个变量进行分组(请参阅类型部分中的结构体)。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Ballot {
struct Voter { // Struct
uint weight;
bool voted;
address delegate;
uint vote;
}
}
枚举类型
枚举可用于创建具有有限“常数值”集的自定义类型(请参阅类型部分中的枚举)。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Purchase {
enum State { Created, Locked, Inactive } // Enum
}