Solidity常见修饰符
在 Solidity 中,有一些内置修饰符可以直接用于合约的 事件、函数和状态变量。这些内置修饰符用来调整访问控制、函数行为、存储管理等。以下是 Solidity 中常见的内置修饰符及其作用:
1. 针对函数的内置修饰符
1.1 payable
- 作用: 表示函数可以接收以太币(Ether)。
- 应用场景: 通常用于支持资金转账的函数。
- 示例:
function deposit() public payable { // 可以接收以太币的逻辑 }
1.2 view
- 作用: 表示函数不会修改合约的状态(例如写入存储)。
- 应用场景: 用于只读取链上数据的函数。
- 示例:
function getBalance() public view returns (uint) { return address(this).balance; }
1.3 pure
- 作用: 表示函数既不读取也不修改合约的状态。
- 应用场景: 用于执行纯逻辑运算、不涉及任何存储或链上状态的函数。
- 示例:
function add(uint a, uint b) public pure returns (uint) { return a + b; }
1.4 virtual
- 作用: 表示函数可以在子合约中被重写(override)。
- 应用场景: 定义可扩展的基础合约。
- 示例:
contract Base { function greet() public virtual returns (string memory) { return "Hello from Base!"; } }
1.5 override
- 作用: 表示重写父合约中的
virtual
函数。 - 应用场景: 用于在子合约中实现多态行为。
- 示例:
contract Derived is Base { function greet() public override returns (string memory) { return "Hello from Derived!"; } }
1.6 external
, public
, internal
, private
- 作用: 控制函数的可见性。
- 作用范围:
external
: 只能从合约外部调用(通过this
也可以)。public
: 内外部均可调用。internal
: 只能从合约内或继承的合约中调用。private
: 仅能从当前合约内部调用。
- 示例:
function externalFunction() external {} function publicFunction() public {} function internalFunction() internal {} function privateFunction() private {}
1.7 nonReentrant
- 作用: 防止重入攻击。
- 应用场景: 用于保护可能受到重入攻击的函数(通过 OpenZeppelin 的
ReentrancyGuard
实现)。 - 示例:
contract MyContract is ReentrancyGuard { function withdraw() public nonReentrant { // 提现逻辑 } }
1.8 returns
- 作用: 指定函数的返回值类型。
- 示例:
function getNumber() public pure returns (uint) { return 42; }
2. 针对状态变量的内置修饰符
2.1 constant
- 作用: 定义一个常量状态变量,其值在部署时确定,无法修改。
- 示例:
uint public constant MAX_SUPPLY = 1000000;
2.2 immutable
- 作用: 定义一个不可变的变量,其值只能在构造函数中赋值,一旦赋值后无法更改。
- 示例:
uint public immutable deploymentTime; constructor() { deploymentTime = block.timestamp; }
2.3 private
, internal
, public
- 作用: 控制状态变量的访问权限。
- 作用范围:
private
: 仅当前合约内可访问。internal
: 当前合约和继承的子合约中可访问。public
: 内外部均可访问(会自动生成 getter 函数)。
- 示例:
uint private privateVar; uint internal internalVar; uint public publicVar;
2.4 storage
, memory
, calldata
- 作用: 指定数据的存储位置。
storage
: 持久化存储在链上的状态变量。memory
: 临时存储在函数执行期间。calldata
: 特殊存储位置,仅用于外部函数参数,数据不可修改。
- 示例:
function updateName(string memory newName) public { name = newName; // 将 newName 存储在 storage 中 }
3. 针对事件的内置修饰符
3.1 indexed
- 作用: 在事件参数中添加
indexed
标记,用于方便在链上日志中过滤和查询相关事件。 - 示例:
event Transfer(address indexed from, address indexed to, uint256 value); function transfer(address to, uint256 value) public { emit Transfer(msg.sender, to, value); }
3.2 anonymous
- 作用: 表示事件在日志中不会包含事件名称(通常用于简化日志存储)。
- 示例:
event Log(uint value) anonymous; function logValue(uint value) public { emit Log(value); }
通过这些内置修饰符,Solidity 提供了强大的工具来控制合约的访问权限、逻辑行为和存储管理,使得合约更加安全、高效和易于维护。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 时光·李记
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果