# Safe 怎么核对所有者、阈值和模块？

整理：链小知（AI 辅助）
资料核对日期：2026-10-11
引用地址：https://lianxiaozhi.com/tools/guides/safe-check-control
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

检查多签账户的实际控制路径，避免仅凭 3/5 标签判断资金权限。

## 使用工具
- [Safe](https://lianxiaozhi.com/tools/safe) · [官方入口](https://app.safe.global/)
- [Etherscan](https://lianxiaozhi.com/tools/etherscan) · [官方入口](https://etherscan.io/)

## 前置条件
- 准备 Safe 合约完整地址、部署网络、查询时间和能核对的部署/实现版本资料；另一网络的同地址状态不能替代。
- 适用官方 getOwners、getThreshold、getModulesPaginated 方法；按实际部署 ABI 和 2026-10-11 文档核对，第三方模块另查其规则。
- 只读不需 owner 签名或网络费；不添加 owners、不改阈值、不启停模块、不签署队列提案。

## 1. 确认正确网络和 Safe 状态读取对象

从 app.safe.global 打开该网络下的 Safe，对照完整合约地址，再在该链浏览器打开同地址，保存两个 URL。显示名称可自定义，不能凭名称或标签认定身份。

确认读取 Safe 代理账户自身状态，记录能核明的实现/部署版本；版本或 ABI 未识别时标未知。singleton/implementation 的 owners 不是目标 Safe 的 owners，不能读错对象后继续报告。

核对结果：网络、Safe 地址及读取对象一致，版本已核明或明确未知。
依据：[Safe Smart Account Concepts](https://docs.safe.global/advanced/smart-account-concepts)
依据：[Etherscan 代理合约读取范围](https://info.etherscan.com/what-is-proxy-contract/)

## 2. 同时核对完整 owners 和当前阈值

Settings > Owners 逐一保存完整 owner 地址；Settings > Setup 查看 Required Confirmations。只查看，不点击添加或提交。名称与地址混在一起时，展开或复制完整地址。

在同 Safe 地址的 Read as Proxy 或正确 ABI 只读入口查询 getOwners()、getThreshold()，无参数返回 owner 数组和阈值 m。数组数为 n，写成 m/n，并与页面比对；差异检查网络、时间和缓存，不挑较好看的数值。

核对结果：保存数组、n、m 和时间；m 应在 1 至 n，异常和读取失败保持待核。
依据：[Safe Owners and Signatures](https://help.safe.global/articles/9629761095)
依据：[Safe getOwners](https://docs.safe.global/reference-smart-account/owners/getOwners)
依据：[Safe getThreshold](https://docs.safe.global/reference-smart-account/owners/getThreshold)
依据：[Safe Smart Account Concepts](https://docs.safe.global/advanced/smart-account-concepts)
依据：[Etherscan 只读合约与写入边界](https://info.etherscan.com/how-to-safely-interact-with-smart-contracts-on-the-explorer/)
依据：[Etherscan 代理合约读取范围](https://info.etherscan.com/what-is-proxy-contract/)

## 3. 给模块分页设置明确参数

找到 getModulesPaginated。第一页 start 输入 0x0000000000000000000000000000000000000001，pageSize 可取 50（正整数）。保存返回 array 和 next；哨兵地址是查询起点，不是资产接收地址。

接口要求 start 是模块或 0x1 起点，pageSize 大于零。参数非法、ABI 不匹配或 RPC 错误时记录错误，不能把它当空数组。缺少方法时标模块未读取，不在 Write Contract 尝试改状态。

核对结果：第一页参数和返回可复现，空数组也须伴随成功读取和 next 才能解释。
依据：[Safe getModulesPaginated](https://docs.safe.global/reference-smart-account/modules/getModulesPaginated)
依据：[Etherscan 只读合约与写入边界](https://info.etherscan.com/how-to-safely-interact-with-smart-contracts-on-the-explorer/)
依据：[Etherscan 代理合约读取范围](https://info.etherscan.com/what-is-proxy-contract/)

## 4. 沿 next 取完全部分页

next 为 0x0000000000000000000000000000000000000001 时结束；否则将它原样作为下一次 start，保持 pageSize，追加 array，直到结束。保存每页输入、输出与顺序，去重不删除原始记录。

模块可能在查询时变化。出现指针循环、结果前后不同或中途失败，停止全量结论并记录时间区间；有同一区块只读能力时固定区块，没有就说明为一段时间的观察。

核对结果：每页成功且取得结束指针才说完整；未取完写已读模块与缺口，不写无其他模块。
依据：[Safe getModulesPaginated](https://docs.safe.global/reference-smart-account/modules/getModulesPaginated)

## 5. 逐个核对模块独立的控制规则

每个 enabled module 记录全地址，追溯官方说明与实现，核对谁可触发、资产/调用目标、额度、期限或停止条件；审计资料需与部署版本对应。未知地址仅列待查，不凭名字猜权限。

官方文档说明模块能使用独立访问规则并绕过常规 owner 签名验证，所以 3/5 只覆盖 owner 路径。模块 admin、消费限额或周期支付路径应另行描述，本篇不执行调用，也不凭应用能显示就判断安全。

核对结果：owner 与每个模块控制路径分列，未知权限和未匹配版本的审计均标待核。
依据：[Safe 模块风险说明](https://help.safe.global/articles/5490514177-what-is-a-module)
依据：[Safe Smart Account Concepts](https://docs.safe.global/advanced/smart-account-concepts)

## 6. 区分队列提案和当前生效状态

owner/threshold 更新会进入交易队列；提案出现或集齐签名不代表状态已改变。变更需成功执行回执，再重新读取 owners、threshold 和 modules 后才确认生效。

本检查不执行变更。交付网络、地址、版本范围、owners、阈值、完整分页及模块规则；guards、fallback handler 和全部升级路径未在本篇完整审计。本篇作者没有真实账户读取回执或变更验收。

核对结果：报告基于已读状态，待执行、版本未知、读取失败和其他控制组件待查分别标明。
依据：[Safe Owners and Signatures](https://help.safe.global/articles/9629761095)
依据：[Safe Smart Account Concepts](https://docs.safe.global/advanced/smart-account-concepts)
依据：[Safe getModulesPaginated](https://docs.safe.global/reference-smart-account/modules/getModulesPaginated)

## 常见错误
- 实现地址状态不能代替目标 Safe 代理状态。
- 阈值仅覆盖 owner 路径，模块可用另一套访问规则。
- 0x1 为分页哨兵，参数错误和未读完不代表无模块。
- 提案、签名数和页面访问不能证明变更生效。

## 完成检查
- Safe 网络、地址、版本范围、完整 owners 和阈值可复查。
- 每页 start/pageSize/array/next 保留，得到结束指针才确认全量模块。
- 未知控制规则明确；作者 documentation，没有真实只读回执、签名或完整安全审计。

## 相关知识

## 官方依据
- [Safe Smart Account Concepts](https://docs.safe.global/advanced/smart-account-concepts)
- [Safe Owners and Signatures](https://help.safe.global/articles/9629761095)
- [Safe getOwners](https://docs.safe.global/reference-smart-account/owners/getOwners)
- [Safe 模块风险说明](https://help.safe.global/articles/5490514177-what-is-a-module)
- [Safe getModulesPaginated](https://docs.safe.global/reference-smart-account/modules/getModulesPaginated)
- [Safe getThreshold](https://docs.safe.global/reference-smart-account/owners/getThreshold)
- [Etherscan 只读合约与写入边界](https://info.etherscan.com/how-to-safely-interact-with-smart-contracts-on-the-explorer/)
- [Etherscan 代理合约读取范围](https://info.etherscan.com/what-is-proxy-contract/)
