合同的结构
合同的坚固性类似于面向对象语言中的类。每个合同可以包含以下内容的声明 状态变量 , 功能 , 函数修饰符 , 事件 , 错误 , 结构类型 和 枚举类型 。此外,合同可以继承自其他合同。
还有一些特殊的合同被称为 libraries 和 interfaces .
关于 contracts 包含比此部分更多的详细信息,用于提供快速概述。
状态变量
状态变量是其值永久存储在合同存储中的变量。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract SimpleStorage {
uint storedData; // State variable
// ...
}
功能
函数是代码的可执行单元。函数通常在合同内定义,但也可以在合同外定义。
// 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;
}
函数调用 可以发生在内部或外部,并且具有不同级别的 visibility 其他合同。 Functions 接受 parameters and return variables 传递参数和值。
函数修饰符
函数修饰符可用于以声明方式修改函数的语义(请参见 函数修饰符 在合同部分)。
重载,也就是说,具有相同的修饰符名称和不同的参数,是不可能的。
像函数一样,修饰符可以是 overridden .
// 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.4.21 <0.9.0;
contract SimpleAuction {
event HighestBidIncreased(address bidder, uint amount); // Event
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
}
}
见 事件 在“合同”部分,获取有关如何声明事件以及如何从DAPP中使用事件的信息。
错误
错误允许您为故障情况定义描述性名称和数据。错误可用于 revert statements 。与字符串描述相比,错误要便宜得多,并且允许您对附加数据进行编码。您可以使用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
}