背景与痛点
在日常的链上交互或智能合约审计中,快速摸清一个未知合约的底细是刚需。通常,我们需要完成以下繁琐的步骤:
- 去 Etherscan/BscScan 查看是否开源。
- 切换到
Read/Write Contract面板,翻找有没有mint、setTax、pause等敏感函数。 - 如果是代理合约,还得去查
ProxyAdmin的权限归属。 - 去安全平台(如 GoPlus)查貔貅、税率、黑名单等风险字段。
- 打开控制台,手动
eth_call查一下owner()或totalSupply()的实时数据。
这套流程下来,不仅要在十几个标签页之间反复横跳,而且很容易遗漏隐藏的管理权限。为了提高效率,我决定开发一个一站式合约查询系统,将源码解析、安全检测、链上交互整合到一个页面中。
技术栈方面,前端主打轻量响应,后端直接对接了 Sourcify v2(获取源码和 ABI)、GoPlus(安全风险字段)以及多链公共 JSON-RPC 节点。
核心技术难点与实现方案
1. 数据源的整合与清洗
EVM 兼容链虽然多,但数据源侧重点不同。系统目前支持 BSC、Ethereum、Polygon、Base、Arbitrum 等主流网络。
- 源码获取:利用 Sourcify v2 的去中心化验证机制,获取完全匹配或部分匹配的 Solidity 源码。这里需要注意的是,获取到的源码包含 OpenZeppelin 等依赖库,需要做树状结构的组装呈现。
- 安全字段:直接接入 GoPlus 的 API,拉取代币的持有者分布、LP 锁仓比例等数据。踩坑点在于:部分非标准代币(如 ERC-777 或带有自定义逻辑的代币)在 GoPlus 可能会返回空值,后端做了容错处理,前端增加了“未检测到”的兜底展示,避免用户误以为是安全代币。
2. ABI 解析与敏感权限高亮
获取到 ABI 后,系统需要对函数进行分类:Read(读)、Write(写)、Sensitive(敏感)。
- 实现逻辑:遍历 ABI JSON 数组,根据
stateMutability区分读写。对于敏感函数,我建立了一个特征字典(如owner、mint、setTax、pause、upgrade等),一旦命中,前端直接标红高亮,并自动生成中文注释,让“后门”无处遁形。
3. 代理合约(Proxy)的穿透与权限追踪
现在大量项目使用 TransparentUpgradeableProxy 等可升级代理。系统会自动识别代理模式,穿透读出实现合约地址。
技术实现:通过检查 EIP-1967 的特定插槽(如 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),利用 RPC 读取逻辑合约地址。同时,读取 ProxyAdmin 合约及其 owner。这一步非常关键,它能帮用户直接看清“谁”有权限随时篡改合约逻辑。
4. 链上实时值读取(RPC 批量 eth_call)
很多浏览器的数据存在延迟。为了拿到最新状态,系统会直接向节点发起 eth_call。
- 性能优化:因为无参读函数可能多达十几个,如果逐个发送 RPC 请求,网络开销极大。我在这里使用了 JSON-RPC 的**批量请求(Batch Request)**特性,将
totalSupply()、owner()、sellRatio()等所有无参读函数打包在一个 HTTP 请求中发送,大幅提升了读取速度。
适用场景与效果
目前系统已经稳定运行,通过页面底部的“原始数据可导出”功能,用户还可以直接复制包含 ABI、验证信息、安全字段的完整 JSON,方便进行二次分析或存档留证。
对于日常开发和安全研究,它主要适用于以下场景:
- 打新防雷:交易前输入地址,快速核对买卖税和黑名单限制。
- 权限排查:直接查看敏感函数和代理合约的
owner,评估中心化风险。 - 审计前置:一键导出 ABI 和源码,省去手动下载的麻烦。
体验地址
项目体验地址,如果你也在做 Web3 开发或链上交互,欢迎体验并给出建议。
🔗 系统地址:bcs.cqgywh.cn/
如果大家在开发类似工具时遇到代理合约解析或 RPC 批量请求的问题,欢迎在评论区交流探讨,我有空会一一回复!