JavaScript 不可用。

我们检测到浏览器禁用了 JavaScript。请启用 JavaScript 或改用支持的浏览器来继续访问

OpenZeppelin Ownable 使用详解

作者:Anban Chu

发表日期:2023年09月01日

所属目录:OpenZeppelin

标签:

使用方法

  1. 引用 Ownable import "@openzeppelin/contracts/access/Ownable.sol";
  2. 设置某个函数仅 owner 可以调用,在函数上直接添加名字叫 onlyOwner 的 modifier 即可。

继承 Ownable 后拥有的方法

  • owner() : 合约合约的 owner
  • transferOwnership(newOwner): 转让新的 owner 地址。
  • renounceOwnership(): 放弃合约 owner 权限(原理是将合约 owner 转让给 address(0),达到放弃的效果 )
  • modifier onlyOwner(): 用来判断调用者是否为 owner

源码分析

源码地址: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.3/contracts/access/Ownable.sol

核心方法是 _transferOwnership()

问题:为什么需要引用 Context.sol

我们从源码中看到合约做了 import "../utils/Context.sol";,而 Context.sol 中仅仅只是做 msg.sender 的包装 _msgSender() 以及 msg.data 的包装 _msgData()

这是一种函数抽出的思路,以后如果 msg.sender 有修改,或者其他兼容性处理,直接在 Context.sol 内更新即可。如果在每个文件都直接使用 msg.sender 这些写法,一旦有更新,几乎所有文件都要做改变。所以 Context.sol 这种看似很傻的行为,其实是封装库的基本操作。

测试合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";

contract MyContract is Ownable {
    function normalThing() public {
        // anyone can call this normalThing()
    }

    function specialThing() public onlyOwner {
        // only the owner can call specialThing()!
    }
}




以上就是本篇文章的全部内容了,希望对你有帮助。

>> 本站不提供评论服务,技术交流请在 Twitter 上找我 @anbang_account