文章介绍了Solidity中的onlyOwner修饰符及其使用方法,展示了如何在智能合约中通过继承和修饰符来管理所有权,并提供了代码示例。
onlyOwner 构造如此常见,以至于我们将专门为其开辟一个章节。
考虑以下代码
contract Ownable {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "onlyOwner");
_;
}
function changeOwner(
address newOwner
)
public
onlyOwner {
owner = newOwner;
}
}
contract HoldFunds is Ownable {
function withdrawFunds()
public
onlyOwner {
(bool ok, ) = owner.call{
value: address(this).balance
}("");
require(ok, "transfer failed");
}
receive()
external
payable {
}
}
让我们看看这里的明星:
modifier onlyOwner() {
require(msg.sender == owner, "onlyOwner");
_;
}
它简单地意味着“执行下划线之前的代码,然后再执行函数。”
这是一种方便的方式来“修改”函数的行为,因此称之为“修改器”。
请注意,即使 HoldFunds 继承了 Ownable,它也没有覆盖任何函数。Solidity 中的继承更多是一种包含行为的机制,而不是定义某种多态性(如果你不知道这是什么,不用担心)。
所以在这种情况下,如果你希望你的智能合约中包含一些方便的函数,你可以导入另一个提供所需功能的合约。
这并不是严格必要的。你可以将所有代码放入一个大合约中。但那样的代码可读性会更差。
修改器不仅可用于检查所有权,但所有权检查是最常见的用例。
不要在修改器内部修改状态。 尽管 Solidity 允许你这样做,但这会使代码更难理解。这被认为是不良实践。
查看 区块链训练营 ,以了解更多关于智能合约开发和代币标准的知识。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!