
一、授权边界由什么决定
区块链用户授权的应用边界是什么?可以从三个问题理解:谁发起操作、该账户能执行什么、谁能改变这些权限。本文讨论以太坊账户与智能合约访问控制的一般机制,不将这些机制视为所有区块链应用都具备的能力。
授权应落实到具体账户、具体功能和明确的检查规则。能够与合约交互,不等于能够调用其中全部管理功能;拥有某项业务权限,也不意味着拥有整个系统的控制权。
二、账户控制不等于业务许可
以太坊账户文档区分了由私钥控制的外部账户和由代码逻辑控制的合约账户。签名用于验证操作来源;钱包则是与账户交互的界面或应用,账户与钱包不是同一概念。
因此,证明某个操作来自一个账户,与判断该账户是否有权执行操作,是两个不同层次的问题。例如,一个签名能够通过验证的请求,仍可能因为不满足合约权限条件而无法执行。签名本身也不能直接证明账户背后人员的现实身份或组织职务。
三、适用场景:单一管理与角色分工
OpenZeppelin访问控制文档介绍了所有者模式与基于角色的权限管理:前者适合单一管理主体,后者用于细分不同职责。角色持有者通常不能仅凭该角色向他人授予权限,授予与撤销由相应管理员角色管理。
适用条件取决于业务分工。只有一类管理职责时,可以采用较简单的权限结构;存在多种职责时,应分别界定操作范围。判断权限是否合理,重点不是角色名称,而是它实际允许哪些操作,以及是否超出履职需要。
四、管理权也是授权边界的一部分
评估授权不能只看当前谁能执行某项操作,还应看谁能够修改执行者名单。即使某个账户没有直接业务权限,只要它能够授予该权限,仍具有重要的管理影响力。
授权边界也不会自动覆盖整个应用。某项功能设置了权限检查,不代表其他入口、其他合约或链下服务已经受到同样约束。讨论系统权限时,需要明确结论覆盖的对象,不能把局部规则扩大为整体保证。
五、常见问题与判断方法
连接钱包是否等于获得管理权限?不是。钱包提供交互入口,管理权限仍取决于合约规则。拥有一个角色是否意味着可以分配该角色?不一定,需要进一步检查对应的管理员权限。
撤销角色是否会撤销全部能力?不能据此推断。账户可能同时具有其他角色,撤销某一角色也不等于回滚此前已经完成的操作。判断授权边界时,应分别核对权限对象、允许动作、管理主体与撤销范围,而不是只看界面上的“已授权”提示。