管理员库提供了一种阻止没有“管理员状态”的用户调用合约内函数的方法。管理员库与所有权库 不同之处在于,可以有多个用户具有管理员状态。管理员库通常用于需要涉及多个用户或白名单的合约中进行管理调用。
此库扩展了所有权库 。必须导入并使用所有权库才能启用管理员库。只有合约的所有者才能添加和删除管理员用户。
有关管理员库的实现详细信息,请参阅Sway Libs 文档 。
要使用管理员库,必须将 Sway Libs 添加到Forc.toml
文件中,然后导入到您的 Sway 项目中。要将 Sway Libs 作为项目的依赖项添加到Forc.toml
文件中,请参阅入门指南 。
要导入管理员库,请确保在导入语句中同时包含管理员库和所有权库。
use sway_libs::{admin::*, ownership::*};
要使用管理员库,请确保为您的合约设置了合约所有者。以下演示了如何使用所有权库 设置合约所有者。
use sway_libs::{admin::add_admin, ownership::initialize_ownership};
#[storage(read, write)]
fn my_constructor(new_owner: Identity) {
initialize_ownership(new_owner);
}
#[storage(read, write)]
fn add_a_admin(new_admin: Identity) {
// Can only be called by contract's owner set in the constructor above.
add_admin(new_admin);
}
要向合约添加新的管理员,请调用add_admin()
函数。
#[storage(read, write)]
fn add_a_admin(new_admin: Identity) {
// Can only be called by contract's owner.
add_admin(new_admin);
}
注意 只有合约的所有者才能调用此函数。请参阅上面的示例以设置合约所有者。
要从合约中删除管理员,请调用revoke_admin()
函数。
#[storage(read, write)]
fn remove_an_admin(old_admin: Identity) {
// Can only be called by contract's owner.
revoke_admin(old_admin);
}
注意 只有合约的所有者才能调用此函数。请参阅上面的示例以设置合约所有者。
要将函数限制为仅限管理员,请调用only_admin()
函数。
#[storage(read)]
fn only_owner_may_call() {
only_admin();
// Only an admin may reach this line.
}
注意: 管理员和合约所有者彼此独立。如果合约所有者调用了
only_admin()
,它将会回滚。
要将函数限制为仅限管理员或合约所有者,请调用only_owner_or_admin()
函数。
#[storage(read)]
fn both_owner_or_admin_may_call() {
only_owner_or_admin();
// Only an admin may reach this line.
}
要检查用户的管理权限,请调用is_admin()
函数。
#[storage(read)]
fn check_if_admin(admin: Identity) {
let status = is_admin(admin);
assert(status);
}