Eigenlayer PermissionController 权限控制器 介绍

  • Layr-Labs
  • 发布于 2025-01-29 20:58
  • 阅读 30

本文档详细介绍了 PermissionController 合约,该合约用于管理 EigenLayer 协议中 AVS 和 operator 的用户权限。PermissionController 定义了三种角色:账户(Accounts)、管理员(Admins)和受托人(Appointees),分别具有不同的权限设置和管理功能,允许进行细粒度的权限控制。

PermissionController

文件 类型 代理
PermissionController.sol Singleton Transparent proxy

PermissionController 处理显式集成它的协议合约的用户权限。请注意,PermissionController 上下文中的“用户”指的是 AVSoperators;它指的是 stakers

PermissionController 集成到其他核心合约中,从而(对于特定方法)使 AVS 和 operators 能够指定其他帐户(“appointees”),这些帐户可以代表他们调用这些方法。使用 PermissionController 作为依赖项的核心合约有:

  • DelegationManager
  • AllocationManager
  • RewardsCoordinator

PermissionController 定义了三种不同的角色:


账户

账户 指的是与协议交互的以太坊地址(如果没有设置受托人)。从核心合约的角度来看,账户是“状态持有者”,即合约方法与状态交互时存储中引用的地址。例如,在 DelegationManager 中,在 operatorShares 映射中持有份额的 operator 地址是一个“帐户”。在 AllocationManager 中,AVS 的“帐户”是创建算子集的地址。

PermissionController 允许一个账户指定 admins 和/或 appointees 代表其执行某些操作。请注意,设置管理员/受托人是可选的,并且承担着确保指定的参与者被有意授予权限的重大责任。

管理员和受托人都可以被授予代表账户行事的权限。管理员被授予对任何启用 PermissionController 的功能的完全控制权,而受托人必须被授予对特定合约上调用特定函数的权限。支持 PermissionController 的方法列表如下。

对于 operators:

  • AllocationManager.modifyAllocations
  • AllocationManager.registerForOperatorSets
  • AllocationManager.deregisterFromOperatorSets
  • AllocationManager.setAllocationDelay
  • DelegationManager.modifyOperatorDetails
  • DelegationManager.updateOperatorMetadataURI
  • DelegationManager.undelegate
  • RewardsCoordinator.setClaimerFor
  • RewardsCoordinator.setClaimerFor
  • RewardsCoordinator.setOperatorAVSSplit
  • RewardsCoordinator.setOperatorPISplit

对于 AVS:

  • AllocationManager.slashOperator
  • AllocationManager.deregisterFromOperatorSets
  • AllocationManager.setAVSRegistrar
  • AllocationManager.updateAVSMetadataURI
  • AllocationManager.createOperatorSets
  • AllocationManager.addStrategiesToOperatorSet
  • AllocationManager.removeStrategiesFromOperatorSet
  • RewardsCoordinator.createOperatorDirectedAVSRewardsSubmission
  • RewardsCoordinator.setClaimerFor

帐户权限

帐户权限存储在定义如下的结构中:

struct AccountPermissions {
    /// @notice 帐户的待处理管理员
    EnumerableSet.AddressSet pendingAdmins;
    /// @notice 帐户的管理员
    EnumerableSet.AddressSet admins;
    /// @notice 从受托人到编码目标和选择器的列表的映射
    mapping(address appointee => EnumerableSet.Bytes32Set) appointeePermissions;
    /// @notice 从编码目标和选择器到受托人列表的映射
    mapping(bytes32 targetSelector => EnumerableSet.AddressSet) permissionAppointees;
}

然后,这些结构存储在定义如下的映射中,以便轻松地获取给定帐户的帐户权限:

mapping(address account => AccountPermissions) internal _permissions;

默认情况下,没有其他地址可以代表给定的帐户执行操作。但是,账户可以添加管理员和/或受托人,以使其他地址能够代表他们行事。

管理员

管理员能够代表原始帐户执行任何操作 - 包括添加或删除管理员。这使得可以对 operators 进行密钥轮换等操作,或创建存储在冷密钥上的备份管理员。

注意: 默认情况下,帐户是其自身的管理员。但是,一旦添加管理员,情况就不再如此;只有 _permissions.admins 中列出的管理员才是管理员。如果一个账户既要添加管理员又要继续充当自己的管理员,它必须被添加到管理员列表中

添加管理员

添加管理员的相关函数是:

addPendingAdmin
/**
 * @notice 设置一个帐户的待处理管理员
 * @param account 要设置待处理管理员的帐户
 * @param admin 要设置的管理员
 * @dev 可以为一个帐户设置多个管理员
 */
function addPendingAdmin(address account, address admin) external onlyAdmin(account);

添加新管理员时,帐户或管理员必须首先调用 addPendingAdmin()。然后,待处理的管理员必须调用 acceptAdmin() 才能完成该过程。帐户不能强迫另一个帐户担任管理员角色。

待处理的管理员没有任何特定权限,但是一旦他们调用 acceptAdmin(),就会被授予管理员的全部权限。

影响

  • 将地址添加到帐户的 pendingAdmins 集合中
  • 发出 PendingAdminAdded 事件,指定为其添加待处理管理员的帐户

要求

  • 建议的管理员不能已经是 account 的管理员
  • 建议的管理员不能是 account 的待处理管理员
  • 调用者必须是 account 的管理员,或者如果没有设置管理员,则调用者必须是 account 本身
removePendingAdmin
/**
 * @notice 删除帐户的待处理管理员
 * @param account 要删除待处理管理员的帐户
 * @param admin 要删除的管理员
 * @dev 只有帐户的管理员才能删除待处理的管理员
 */
function removePendingAdmin(address account, address admin) external onlyAdmin(account);

帐户或管理员可以调用 removePendingAdmin() 以防止待处理的管理员接受其角色。但是,只有在待处理的管理员尚未调用 acceptAdmin() 的情况下,此操作才有效。如果发生这种情况,管理员可以调用 removeAdmin 来删除不需要的管理员。

影响

  • 从帐户的 pendingAdmins 集中删除一个地址
  • 发出 PendingAdminRemoved 事件,指定为其删除待处理管理员的帐户

要求

  • 建议的管理员必须是帐户的待处理管理员
  • 调用者必须是帐户的管理员,或者如果没有设置管理员,则调用者必须是帐户的地址本身
acceptAdmin
/**
 * @notice 接受帐户的管理员角色
 * @param account 要接受管理员的帐户
 * @dev 只有帐户的待处理管理员才能成为管理员
 */
function acceptAdmin(address account) external;

由待处理的管理员调用,以声明帐户的管理员角色。调用者必须事先已添加为待处理的管理员。

请注意,一旦帐户成功添加了管理员(即待处理的管理员已调用 acceptAdmin()),帐户的地址本身将不再具有其默认的管理员特权。此行为使寻求执行 密钥轮换 的帐户受益,因为添加管理员允许他们从其原始的、可能已泄露的密钥中删除权限。如果帐户想要为其自己的地址保留管理员特权,建议首先将自己添加为管理员,然后再根据需要添加任何其他管理员。

影响

  • 从帐户的 pendingAdmins 集中删除调用者
  • 将调用者添加到帐户的 admins 集合中
  • 发出 AdminSet 事件,指定为其添加管理员的帐户

要求

  • 调用者必须是帐户的待处理管理员

删除管理员

removeAdmin
/**
 * @notice 删除帐户的管理员
 * @param account 要删除管理员的帐户
 * @param admin 要删除的管理员
 * @dev 只有帐户的管理员才能删除管理员
 * @dev 当删除管理员导致没有剩余管理员时,恢复
 */
function removeAdmin(address account, address admin) external onlyAdmin(account);

帐户的管理员可以调用 removeAdmin() 来删除同一帐户的任何其他管理员。但是,任何给定的帐户必须始终保留一个管理员。换句话说,一旦帐户添加了管理员,它必须始终永久保留至少一个管理员。

影响

  • 从帐户的 admins 集中删除指定的管理员
  • 发出 AdminRemoved 事件,指定为其删除管理员的帐户

要求

  • admins.length() 必须大于 1,这样删除管理员就不会删除帐户的所有管理员
  • 要删除的地址必须是帐户的管理员
  • 调用者必须是帐户的管理员,或者如果没有设置管理员,则调用者必须是帐户的地址本身

受托人

受托人能够针对特定合约的特定功能充当另一个帐户,从而授予帐户细粒度的访问控制。

具体来说,帐户(或其管理员)可以授予受托人访问给定 target(即合约)上的特定 selector(即function)。targetselectortargetSelector 的形式组合在一起,用于唯一标识特定合约上的已授权功能。

可以授予受托人访问多个函数/合约的权限。每个新的 targetSelector 授权都需要从头开始设置受托人,并且撤销受托人的权限需要撤销每个单独的 targetSelector 权限,如下所述。

添加受托人

setAppointee
/**
 * @notice 为给定帐户设置受托人
 * @param account 要设置受托人的帐户
 * @param appointee 要设置的受托人
 * @param target 要为其设置受托人的目标
 * @param selector 要为其设置受托人的选择器
 * @dev 只有帐户的管理员才能设置受托人
 */
function setAppointee(
    address account,
    address appointee,
    address target,
    bytes4 selector
) external onlyAdmin(account);

帐户(或其管理员)可以调用 setAppointee(),以使另一个地址能够调用给定合约上的特定功能。然后,该地址只能代表 account 在该特定合约上调用该特定功能。

请注意,与成为管理员的过程不同,appointee 不需要接受该任命。

影响

  • targetSelector 添加到 appointeePermissions 映射中的指定 appointee 集中
  • appointee 添加到 permissionAppointees 映射中的指定 targetSelector 集中
  • 发出 AppointeeSet 事件,指定帐户、受托人、目标合约和函数选择器

要求

  • 调用者必须是帐户的管理员,或者如果没有设置管理员,则调用者必须是帐户的地址本身
  • 建议的受托人不能已经具有给定 targetSelector 的权限

删除受托人

removeAppointee
/**
 * 删除给定帐户的受托人
 * @param account 要删除受托人的帐户
 * @param appointee 要删除的受托人
 * @param target 要删除受托人的目标
 * @param selector 要删除受托人的选择器
 * @dev 只有帐户的管理员才能删除受托人
 */
function removeAppointee(
    address account,
    address appointee,
    address target,
    bytes4 selector
) external onlyAdmin(account);

帐户(或其管理员)可以调用 removeAppointee() 来删除 appointee 对给定合约/函数对的权限。请注意,目前没有任何方法可以原子地删除给定受托人的所有权限或给定函数选择器的所有受托人 - 必须单独撤销每个权限。

另请注意,不能为 admins 撤销对特定函数/合约的权限。管理员始终具有完全访问权限,除非另一个管理员将其从管理员列表中删除。

影响

  • appointeePermissions 映射中的指定 appointee 集中删除 targetSelector
  • permissionAppointees 映射中的指定 targetSelector 集中删除 appointee
  • 发出 AppointeeRemoved 事件,指定帐户、受托人、目标合约和函数选择器

要求

  • 调用者必须是帐户的管理员,或者如果没有设置管理员,则调用者必须是帐户的地址本身
  • 建议的受托人必须已经具有给定 targetSelector 的权限
  • 原文链接: github.com/Layr-Labs/eig...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Layr-Labs
Layr-Labs
江湖只有他的大名,没有他的介绍。