Solidity 智能合约文件结构
原创
©著作权归作者所有:来自51CTO博客作者sleep666的原创作品,请联系作者获取转载授权,否则将追究法律责任
变量
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Variables {
// State variables are stored on the blockchain.
string public text = "Hello";
uint public num = 123;
function doSomething() public {
// Local variables are not saved to the blockchain.
uint i = 456;
// Here are some global variables
uint timestamp = block.timestamp; // Current block timestamp
address sender = msg.sender; // address of the caller
}
}
函数
函数是代码的可执行单元。函数通常在合约内部定义,但也可以在合约外定义。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.0 <0.9.0;
contract Storage {
function set() public { // 定义函数
// ...
}
}
function OutsideFunc(uint x) pure returns (uint) {
return x * 2;
}
函数修改器(modifier)
函数 修改器modifier 可以用来以声明的方式修改函数语义。参阅 Solidity 函数章节中 函数修改器
pragma solidity >=0.8.0 <0.9.0;
contract MyContract {
address public owner;
modifier onlyOwner() { // 修改器
require(
msg.sender == owner,
"is not owner."
);
_;
}
function send() public onlyOwner { // 修改器用法
// ...
}
}
事件 Event
事件是能方便地调用Ethereum虚拟机日志功能的接口。
pragma solidity >=0.8.0 <0.9.0;
contract MyEvents {
event Cardbinded(address caller, string account); // 事件
function bindCard() public payable {
// ...
emit Cardbinded(msg.sender, msg.value); // 触发事件
}
}
具体参阅 Solidity 事件章节 了解如何声明和在 DApp 中使用。
错误 Errors
Solidity 为应对失败,允许用户定义 error
来描述错误的名称和数据。 跟用错误字符串相比, error
更便宜并且允许你编码额外的数据,还可以用 NatSpec 为用户去描述错误。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
error NotFoundUser(address account, uint256 uid);
contract Token {
mapping(address => uint256) users;
function getUser(address _account, uint256 _uid) public view {
uint256 uid = users[msg.sender];
if (uid < _uid) {
revert NotFoundUser(_account, _uid);
}
// ...
}
}
结构体
结构体是可以将几个变量分组的自定义类型
pragma solidity >=0.8.0 <0.9.0;
contract Users {
struct User { // 结构体
string nickname;
uint age;
bool state;
}
}
枚举
枚举可用来创建由一定数量的“常量值”构成的自定义类型
pragma solidity >=0.8.0 <0.9.0;
contract UserState {
enum State { Online, Offline, Unknown } // 枚举
}
接口
和其他编程语言一样,但是它们不能实现任何函数。
pragma solidity >=0.8.0 <0.9.0;
interface PaymentOrder {
function createOrder(string orderId) external returns (uint256);
function payOrder(string orderId) external returns (uint256);
function cancelOrder(string orderId) external returns (uint256);
}