文章介绍了Solidity中的onlyOwner
修饰符及其在智能合约中的应用,特别讨论了Ownable2Step相较于Ownable的安全性改进,包括所有权转移的两步验证机制。
onlyOwner
修饰符可能是 Solidity 中最常见的模式之一。
在以下示例中,setMessage()
函数只能由指定为所有者的地址调用。
function setMessage(string calldata _message) external onlyOwner {
message = _message;
}
然而,常用的 OpenZeppelin 可拥有实现有一个缺点,即允许所有者将所有权转移到一个不存在或输入错误的地址。
对于智能合约而言,Ownable2Step 比 Ownable 更安全,因为所有者不会意外地将智能合约所有权转移到一个输入错误的地址。与其直接转移到新所有者,转移只会在新所有者接受所有权后完成。
Ownable2Step 于 2023 年 1 月在 OpenZeppelin 4.8 版本更新期间发布。以下是 代码。
以下是一个最小示例:
import "@openzeppelin/contracts/access/Ownable2Step.sol";
contract ExampleOwnable2Step is Ownable2Step {
string public message;
constructor() Ownable(msg.sender) {}
function setMessage(string calldata _message) external onlyOwner {
message = _message;
}
}
Ownable2Step 继承自 Ownable,并重写了 transferOwnership()
,以使新所有者“待定”。接收者必须随后调用 acceptOwnership()
来完成转移。这确保只有拥有其私钥访问权限或控制智能合约地址的地址才能控制智能合约。
仍然没有两步验证来放弃所有权,即将所有权转移到零地址。如果不需要放弃所有权,那么更安全的是在调用时重写“renounceOwnership()”以使其回退。
本教程是我们高级 solidity 训练营 的一部分。
最初发布于 2023 年 4 月 8 日
- 原文链接: rareskills.io/post/openz...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!