
适用范围:先明确合约负责什么
以下讨论适用于以智能合约承载审批权限或流程规则的系统。若区块链仅用于保存审批结果,业务系统自身的身份认证、权限检查和流程控制仍需独立保障。记录难以修改,不等于原始材料真实,也不等于审批决定合理。
设计时应区分材料审核、审批决策与结果执行。能够明确表达为条件的规则可以由代码检查;需要专业判断的事项,不能仅凭一次链上调用就视为已经完成实质审查。

权限设计:有角色不等于能审批所有事项
OpenZeppelin 的访问控制文档区分了单一所有者与基于角色的授权,并强调最小权限。对应审批业务,可以分别设置申请、复核、批准和权限管理职责,避免同一账户默认拥有全部能力。

角色检查还需结合具体事项的授权范围。例如,拥有审批角色,不应自然获得审批所有部门申请的权力。禁止申请人自批、代理授权何时失效等业务约束,也需要明确表达;角色名称本身不会自动实现职责分离。
流程校验:不能只在页面上限制操作
Ethereum 智能合约安全文档强调,应在合约内部检查调用权限、输入和状态条件。审批按钮是否显示不能充当安全边界,因为公开的合约入口可能被绕过页面直接调用。
审批流程应定义允许的状态转换,例如待审事项才能被批准,已撤回事项不得继续执行。会签还应检查参与者资格,防止同一主体被重复计入。退回后重新提交时,需要明确原有意见是否继续有效,避免不同版本的材料共用一次授权。
管理员治理:多账户不自动等于安全
审批权限之外,还要审视谁能新增审批人、撤销角色或改变规则。默认管理员往往掌握广泛的授权能力,因此应单独设计其保管、交接和异常处置机制。所有权转移可采用新账户确认的方式,降低误转风险。
多签适合需要共同授权的敏感管理操作,但不是业务会签的直接替代。业务会签可能要求不同部门分别表态,多签通常只验证签名门槛;若多个签名密钥仍由同一人控制,也不能形成真正的独立制衡。
上线验证与常见误区
测试应覆盖越权调用、重复批准、撤权后操作、错误状态转换以及管理员交接失败等情形。除正常流程测试外,还应结合静态分析、模糊测试和独立审查;审计能增加发现问题的机会,但不能保证没有漏洞。
已经部署不意味着永远无需维护,也不能假定发现问题后一定能直接修改代码。上线前应明确暂停权限、规则变更方式和未完成审批的处理原则。核心判断标准不是是否使用区块链,而是权限是否收敛、流程是否可验证、异常是否有清晰的责任与处置边界。