Solidity 智能合约文件结构

时间:2022-12-04 23:02:49

变量

  • 局部变量
  • 在函数内部声明
  • 不存储到链上
  • 状态变量
  • 在函数外部声明
  • 状态变量是永久地存储在链上的值。
  • 全局变量
  • 提供有关区块链的信息
// 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);
}