Solidity 02

合约结构


在 Solidity 中,合约类似于面向对象编程语言中的类。 每个合约中可以包含 状态变量函数函数修饰器事件错误结构类型枚举类型 的声明,且合约可以从其他合约继承。

还有一些特殊种类的合约,叫做 库合约接口合约


状态变量

指其值被永久地存储在合约存储中的变量。

csharp 复制代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract SimpleStorage {
    uint storedData; // 状态变量
    // ...
}

函数

函数是代码的可执行单位。 通常在合约内定义函数,但它们也可以被定义在合约之外。

csharp 复制代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;

contract SimpleAuction {
    function bid() public payable { // 函数
        // ...
    }
}

// 定义在合约之外的辅助函数
function helper(uint x) pure returns (uint) {
    return x * 2;
}

函数修饰器

函数修饰器(Function Modifier)是 Solidity 中的一个关键语法功能,用于在函数执行前插入一段"通用逻辑"代码,常用于:

  • 权限控制(如 onlyOwner)
  • 重入锁
  • 状态校验(如合约未暂停)
ini 复制代码
modifier onlyOwner() {
    require(msg.sender == owner, "Not the owner");
    _; // 占位符:表示函数的主体将在这里执行
}

可以把 modifier 理解成一个函数前的"中间层拦截器"。

常见内置修饰器(OpenZeppelin 中)

修饰器 功能描述
onlyOwner 仅合约拥有者可调用
nonReentrant 防止重入攻击(reentrancy)
whenNotPaused 合约未暂停时可用

事件

智能合约中用于向链下应用(如前端 DApp)发送日志消息的机制,方便监听和响应链上的行为。

事件的意义和用途

  • ✅ 链下监听交易行为(如前端用 web3.js/ethers.js 监听事件)
  • ✅ 提高审计和可读性
  • ✅ 提高性能(事件不存储到链状态,不消耗 gas 存储费)
  • ✅ 做成"通知"机制,告诉外部世界状态变化了
javascript 复制代码
contract.on("Transferred", (from, to, amount) => {
  console.log(`🚀 ${from} transferred ${amount} to ${to}`);
});

indexed 的作用

  • indexed 参数可以用于前端筛选事件日志
  • 最多只能有 三个 indexed 参数

event MyEvent(address indexed user, uint256 value);

前端可以筛选出所有 user == xxx 的事件,而不必遍历所有日志。

错误

错误(类型)允许您为失败情况定义描述性的名称和数据。 错误(类型)可以在 回滚声明 中使用。 与字符串描述相比,错误(类型)要便宜得多,并允许您对额外的数据进行编码。

结构类型

结构类型是可以将几个变量分组的自定义类型

csharp 复制代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Ballot {
    struct Voter { // 结构
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

枚举类型

arduino 复制代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // 枚举
}
相关推荐
Tattoo_Welkin1 天前
【RWA 机制,ERC-4626,ERC-3643,ERC-7540,ERC-7575,LayerZero】
区块链
魑魅魍魎11 天前
基于全同态加密的逻辑回归心脏病预测示例详解
区块链·逻辑回归·同态加密
软希网分享源码1 天前
中英双语言量化交易投资源码/跟单搬砖区块链交易所源码/前端uniapp纯源码+后端
前端·uni-app·区块链·中英双语言量化交易投资源码
好多大米2 天前
W2D3-Foundry 测试
区块链·solidity
Bczheng12 天前
四.比特币默克尔树(上)
区块链
OxYGC2 天前
[Web3] 一文读懂区块链中的账本类型
web3·区块链
david_lv2 天前
大A,2026年Q1总结
区块链
筱璦2 天前
期货软件开发 - 策略编辑
前端·区块链·交易·期货
Risk Actuary3 天前
侧挂车(Sidecar)与巨灾债券(Cat Bond)
区块链
Css38RttP3 天前
springMVC-RequestMapping注解
区块链