Solidity合约else if修复:仅允许所有者调用_action方法
Logger合约逻辑问题修复
原代码存在的核心问题
- 语法结构错误:首个if分支未闭合大括号,
else if被错误写在if代码块内部,无法通过编译;equal工具函数缺失闭合大括号,末尾残留无意义文本 - 条件逻辑错误:
else if语句末尾多写分号,导致后续assert()语句脱离条件约束,无论判断是否成立都会执行 - 权限判断错误:
_caller是地址类型值,直接和字符串"owner"做比对属于类型不匹配的无效逻辑,无法正确识别合约所有者 - 权限规则未落地:原代码没有存储合约所有者地址的逻辑,无法实现「仅主合约所有者可调用对应action逻辑」的要求
修复后完整合约代码
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract logger { // 存储合约所有者地址 address public immutable owner; constructor() { // 部署合约时将部署者设为所有者 owner = msg.sender; } function log(address _caller, uint _amount, string memory _action) public { if (equal(_action, "withdraw")) { revert("It's a frank!"); } else if (_caller == owner) { // 仅所有者可执行的action逻辑,assert可根据实际业务补充校验条件 assert(true); // 此处可补充正常日志记录逻辑 } else { // 非所有者调用直接回滚 revert("caller is not owner"); } } function equal(string memory _a, string memory _b) public pure returns (bool) { return keccak256(abi.encode(_a)) == keccak256(abi.encode(_b)); } }
关键修复说明
- 新增
owner不可变状态变量,合约部署时初始化所有者地址,权限判断直接做地址值比对,解决原代码类型不匹配问题 - 重新梳理if/else分支的大括号配对,删除else if后多余的分号,保证条件分支逻辑按预期执行
- 补全非所有者调用的拦截逻辑,严格匹配「仅合约所有者有权调用对应action方法」的规则
- 补全
equal函数缺失的闭合结构,清理无效残留代码,保证合约可正常编译部署
内容的提问来源于stack exchange,提问作者ivan
相关产品推荐
相关产品推荐

