智能合约的访问控制

熟悉OpenZeppelin的智能合约库的开发者都知道这个库已经提供了根据访问等级进行访问限制的选项,其中最常见的就是Ownable合约管理的onlyOwner模式,另一个是OpenZeppelin的Roles库,它允许合约在部署前定义多种角色并为每个函数设置规则,以确保msg.sender具有正确的角色。在OpenZeppelin 3.0中又引入了更强大的AccessControl合约,其定位是一站式访问控制解决方案。

Ownable合约

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

onlyOwner模式是最常见也最容易实现的访问控制方法,它虽然基础但非常有效。该模式假设智能合约存在单一管理员,支持管理员将全新转移给另一个账号。

通过扩展Ownable合约,子合约就可以在定义方法时使用onlyOwner修饰符,这些被修饰的方法就要求交易发起账号必须是合约的管理员。

继承 Ownable 后拥有的方法

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

使用方法

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

使用举例:
继承Ownable ,在构造器中通过 Ownable(msg.sender) 来调用了 Ownable 合约的构造函数。

在调用 Ownable(msg.sender) 时,已经完成了对合约所有者的转移!

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;


import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract LighthouseNft is ERC721, Ownable {
    using Strings for uint256;


    // 元数据URI的基本URL
    string private _baseTokenURI;

    // 用于跟踪tokenId是否已经被使用
    mapping(uint256 => bool) private _tokenIdExists;

    // 构造函数,接收NFT的名称、符号和元数据URI作为参数
    constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) Ownable(msg.sender) {
        // _baseTokenURI = ""; // 初始化_baseTokenURI为空字符串或其他默认值
    }
06-11 07:36