开放原子开发者工作坊 Solidity智能合约结构介绍

Solidity智能合约结构介绍

变量局部变量在函数内部声明不存储到链上状态变量在函数外部声明状态变量是永久地存储在链上的值。全局变量 提供有关区块链的信息// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract Variables {// State variables are...

sleep-go  ·  2022-11-30 10:21:55 发布

变量

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

事件是能方便地调用EVM虚拟机日志功能的接口。

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);
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐

  • 浏览量 66
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献3条内容