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 } // 枚举
}
相关推荐
RunsenLIu12 小时前
【ptrade】行业轮动 · 回测实录
区块链
RunsenLIu14 小时前
【ptrade】放量突破 回测实录
区块链
梦帮科技14 小时前
【3.0修订版】# 创作者激励池与空投分发:AirdropDistributor 与 20% 生态分配
去中心化·区块链·智能合约·同态加密·共识算法·信任链·分布式账本
RunsenLIu15 小时前
【ptrade】网格交易 回测实录
区块链
梦帮科技15 小时前
【3.0修订版】跨链桥架构与资产守恒:BSCBridge、BSCMirrorBridge 与 Lock-and-Mint 模型
架构·去中心化·区块链·智能合约·共识算法·信任链
梦帮科技2 天前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
梦帮科技2 天前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
怒放de生命20103 天前
区块链为啥死磕去中心化”
去中心化·区块链
微三云马玮均—GEO源码系统 私有化部署3 天前
消费返物业费:消费+服务趋势的必然产物!
大数据·人工智能·物联网·区块链·生活