
一、授权边界需要分层理解
区块链用户授权的应用边界是什么?关键在于区分账户控制权、业务操作权和权限管理权。能够控制一个账户,不代表能够调用所有合约功能;获得某项业务权限,也不意味着可以把权限授予其他人。
以下讨论适用于以太坊账户和采用所有者或角色机制的智能合约。不同系统的权限规则可能不同,不能仅凭“区块链应用”这一名称判断授权范围。
二、账户签名不等于合约许可
Ethereum 的账户文档区分由私钥控制的外部账户与由代码控制的合约账户,并强调钱包是与账户交互的界面,而不是账户本身。签名用于证明操作来自相应的密钥持有者。
这意味着,“由谁发起”和“是否有权执行”是两个问题。用户签署一笔请求,只能解决其中的身份验证环节;如果目标功能设置了访问限制,操作还需要满足合约中的权限条件。钱包界面上的确认不能替代这些检查。
三、权限应对应具体功能
OpenZeppelin 的访问控制文档介绍了所有者模式和基于角色的模式。前者适合单一管理主体,后者允许把不同操作分配给不同角色,体现最小权限原则。
适用边界应落实为“哪个账户可以执行哪些功能”,而不是笼统地写成“已授权用户”。例如,内容管理和资源创建属于不同职责时,可以分别定义权限;但是否真正隔离,仍取决于相关功能有没有执行对应检查。
四、操作权限与管理权限要分开
角色持有者默认不因此获得为他人分配该角色的能力;角色的授予和撤销由相应管理员控制。因此,评估授权范围时,既要看当前角色能做什么,也要看谁能够改变角色分配。
对于职责会变动的应用,动态授予和撤销有其适用性。普通业务角色的范围即使很小,如果权限管理权过于集中,整体控制边界仍可能较宽。不能只检查业务角色而忽略管理层。
五、常见问题与判断方法
持有私钥是否就能操作任意合约?不能。私钥提供相应账户的签名能力,不会自动获得其他合约的受限权限。拥有一个角色是否意味着拥有全部管理权?也不能这样推断,应分别核对业务权限和角色管理规则。
判断一个应用的授权边界,可以依次确认账户主体、受限功能、对应角色和角色管理员。界面名称与文字承诺只能辅助理解,最终应以实际生效的合约规则为准;这些技术规则也不能单独证明某项业务安排在现实中的合法性。