合约的访问控制
访问控制的意思就是谁被允许做这件事。这在智能合约中非常重要。合约的访问控制可以治理谁可以铸造代币,谁可以提案,或冻结或转移或者其他权限。
所有权和Ownable
最常见和最基本的访问控制是所有权的概念:合约有一个owener的账号可以做一些管理的任务。这个方法可以完美合理的适用于只有一个管理员用户的情况。
OpenZeppelin合约提供了一个Ownable用于实现合约里面的所有权。
// contracts/MyContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
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()!
}
}
默认情况下,一个Ownable 合约的所有人是部署者的账号。
Ownable 也可以做到:
transferOwnership转移所有者账户到另一个人;
renounceOwnership所有者放弃管理权限
注意:完全移除所有者权限意味着管理员功能受保护且onlyOwner 不能再被调用。
一个合约也可以是另一个合约的所有者!通过这种方法使用组合可以对合约添加一些复杂一点的访问控制功能。
RBAC基于角色的访问控制
简单的系统或需要快速作出原型可以使用简单的ownership ,实际项目中需要不同级别的授权。RBAC在这方面非常灵活。