使用方法
- 引用 Ownable
import "@openzeppelin/contracts/access/Ownable.sol";
- 设置某个函数仅 owner 可以调用,在函数上直接添加名字叫
onlyOwner
的 modifier 即可。
继承 Ownable 后拥有的方法
owner()
: 合约合约的 ownertransferOwnership(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()!
}
}