Etherscan 查合约源码(Read Contract)|从 Verified Contract 完整读
Etherscan 上每个合约地址都有一个 Contract Tab。如果项目方提交了源码且通过 Etherscan 编译比对,就会显示绿色对勾的 Verified Contract 徽章,你能在浏览器里直接读完整 Solidity 源码。本文教你看 Read Contract / Write Contract 两栏。
Etherscan 怎么查合约源码?直接答:输入合约地址 → 进入合约页 → 切到「Contract」Tab → 看是否显示绿色对勾的 Verified Contract 徽章 → 已验证的会显示完整 Solidity 源码、Read Contract(只读方法)、Write Contract(可调用方法)三栏 → 未验证的只显示 Bytecode。读源码不需要花钱,调用 Write Contract 方法需要钱包签名并花 Gas。
如果你正在调研一个 DEX 或 DeFi 协议,并打算先把链上资产兑换成 USDT 出金到法币,可顺路准备 币安官网 的实名账号,并用 币安官方App 看充币地址。下载入口在 下载页。
什么是「Verified Contract」
A:Verified Contract 表示项目方主动把合约 Solidity 源码、编译器版本、构造参数提交给 Etherscan,Etherscan 重新编译后比对生成的字节码与链上字节码一致——一致才会标记 Verified。
| 比较项 | Verified | Unverified |
|---|---|---|
| 是否能读源码 | 能 | 不能(只能读字节码) |
| 是否能用 Read Contract | 能 | 不能 |
| 是否能用 Write Contract | 能 | 不能 |
| 项目可信度 | 较高 | 较低(但也有合理情况) |
| 标识 | 绿色对勾 | 无 |
A:Verified ≠ 安全——验证只能保证「源码与链上字节码一致」,不能保证「合约逻辑无后门或漏洞」。安全审计是另一回事,由 OpenZeppelin、CertiK、Trail of Bits 等独立机构做。
第 1 步:拿到合约地址
合约地址也是 0x 开头 42 位 hex。常见来源:
| 来源 | 例 |
|---|---|
| Token 项目方官网 | 通常在 footer「Token Contract」处 |
| CoinGecko / CoinMarketCap | 币种页有合约地址 |
| 钱包资产页点开某代币 | MetaMask 等显示「Token Contract Address」 |
| Etherscan Top Tokens 页 | 按市值排名 |
A:永远从项目方官方渠道拿合约地址,不要从聊天群、SEO 广告或不明 dApp 拿——仿冒 Token 是钓鱼最常见路径。
第 2 步:粘到 Etherscan 进入合约页
打开 etherscan.io,把合约地址粘到顶部搜索框。如果是合约,地址页右上角会显示「Contract」徽标。然后切到 Contract Tab。
第 3 步:看顶部 4 个子 Tab
合约 Tab 内有 4 个子 Tab:
| 子 Tab | 内容 |
|---|---|
| Code | Solidity 源码 + 编译器版本 + 构造参数 |
| Read Contract | 所有 view/pure 方法(只读,不花 Gas) |
| Write Contract | 所有 state-changing 方法(写操作,花 Gas) |
| Events | 合约 emit 的所有事件历史 |
Verified 合约才会有 Read/Write 子 Tab——unverified 只有 Bytecode。
第 4 步:在 Code 子 Tab 读源码
页面会显示一个或多个 Solidity 文件。多文件项目(用 Hardhat / Foundry)会有 import 关系——Etherscan 把它们都展开扁平化呈现。
| 显示项 | 含义 |
|---|---|
| Contract Name | 主合约名 |
| Compiler Version | 编译器版本(如 v0.8.20) |
| Optimization Enabled | 是否启用优化 |
| Other Settings | License、EVM 版本等 |
| Constructor Arguments | 部署时传入的构造参数 |
A:对普通用户来说,至少看清「合约里有没有 onlyOwner 修饰符的转账方法」「有没有 selfdestruct」「有没有 delegatecall 到外部地址」——这三类是常见后门信号。
第 5 步:用 Read Contract 读链上当前状态
Read Contract 子 Tab 列出所有 view / pure 方法,可以不花 Gas 直接调用——浏览器作为客户端,本地查节点。
| 常见 Read 方法 | 用途 |
|---|---|
name() |
代币名 |
symbol() |
代币符号 |
decimals() |
小数位数 |
totalSupply() |
总供应量 |
balanceOf(address) |
查某地址持仓 |
allowance(owner, spender) |
查某地址给某 spender 的授权额度 |
owner() |
合约 owner(如有 Ownable) |
输入参数后点 Query 即得结果,无需连接钱包。
A:Read Contract 是查授权额度最简单的方式——比如想查你给 Uniswap V2 Router 授权了多少 USDT,调 allowance(你地址, Router 地址) 即得真实数字。
第 6 步:用 Write Contract 调用方法(需签名)
Write Contract 子 Tab 列出所有可写方法。点击任一方法 → 输入参数 → 点「Connect to Web3」连接 MetaMask → 点 Write → MetaMask 弹签名 → 链上执行。
| 常见 Write 用法 | 场景 |
|---|---|
transfer(to, amount) |
转账代币 |
approve(spender, 0) |
撤销授权(amount=0) |
revokeRole(role, account) |
撤销角色(仅特殊合约) |
A:撤销 Token 授权最稳的做法就是在 Etherscan 上调代币合约的 approve(spender, 0)——比 Revoke.cash 等第三方工具更直接(虽然慢一点)。详见 Token approval 分类的 Revoke 教程。
第 7 步:看 Events 历史
Events 子 Tab 显示该合约 emit 的所有历史事件,按区块倒序。这是看合约「真实做过什么」最权威的入口——不是看注释、不是看名字,而是看 emit 出来的事实。
| 常见事件 | 含义 |
|---|---|
Transfer(from, to, amount) |
代币转账 |
Approval(owner, spender, amount) |
授权变化 |
OwnershipTransferred(prev, new) |
owner 变更 |
实战:判断一个新 Token 是否是 rugpull 风险
| 检查项 | 红旗信号 |
|---|---|
| Verified | 未验证 |
| Top 10 Holders 持仓 | > 80% 集中 |
| owner 是否放弃 | 否(owner != 0x0) |
| 是否有 mint() 方法 | 有且 onlyOwner 可随时增发 |
| 是否有 blacklist 黑名单 | 有(owner 可冻结任意地址) |
| 流动性是否锁仓 | 否或锁期 < 30 天 |
A:6 项命中 3 项以上就是高风险 rugpull 候选——不要交互、不要兑换。
用 OpenChain Trace 增强分析
Etherscan 的 Logs 可读性有限——复杂的合约调用链建议用 Tenderly 或 OpenChain(openchain.xyz/trace)做调用栈可视化。这两个工具都能从 TxHash 一键导入。详见 查交易 分类的 Trace 篇。
风险提示
读合约源码不会花钱也不会触发任何链上动作。但 Write Contract 一旦签名就真正生效——尤其approve 与 setApprovalForAll 的金额参数必须看清。写错参数没法撤回,只能再发一笔覆盖。
如果链上资产想兑换法币,可借助 币安官网 完成 KYC 后走 C2C。
实操核对清单
- [ ] 拿到合约地址(来自官方渠道)
- [ ] 已确认 Verified Contract 徽章
- [ ] 已浏览 Code 子 Tab 看主要逻辑
- [ ] 已用 Read Contract 验证 totalSupply / balanceOf 等
- [ ] 调用 Write Contract 前已确认所有参数
- [ ] 已用 Events Tab 看历史事件
一站式回顾
A:Etherscan Contract Tab 是合约「公开档案」——源码、读方法、写方法、历史事件全部一屏可查。Verified 是看源码的前提,Read 不花 Gas、Write 花 Gas 必须签名——这两条是核心规则。
如果还要分析合约的安全等级,下一步建议看 Verified Contract 标识与风险篇。
常见问题
不是合约的地址也能进 Contract Tab 吗?
A:不能。普通钱包地址(EOA)的地址页没有 Contract Tab——只有合约地址才会显示。Etherscan 通过查询该地址是否有 codehash 区分两者。
一个合约能否事后改源码?
A:链上字节码不能改(合约部署后不可变),但 Etherscan 上的「Verified Source」是项目方提交的,理论上可以重新提交不同版本——不过 Etherscan 会比对一致性,不一致就不会标记 Verified。所以「换汤不换药」走不通。
用 Read Contract 查别人的余额合规吗?
A:合规。链上数据公开,任何人可读。Read Contract 不消耗 Gas、不留痕迹(除非你连了钱包)。这是区块链「透明账本」的核心特性。
Write Contract 的 Gas 谁付?
A:连接钱包的当前账户付。Write Contract 实际上就是用你钱包发起一笔交易,Gas 从你钱包扣。如果钱包 ETH 不足支付 Gas,MetaMask 会提示余额不足。
我能在 Etherscan 上调用别人的合约方法吗?
A:调用没限制——任何人都能调任何 Public/External 方法。但合约里有权限检查(如 onlyOwner、onlyRole)的方法,不是 owner 调了会 revert。Gas 还是会扣(失败的 Gas 不退)。
合约 Verified 时间会不会比合约部署时间晚?
A:通常会晚。部署是发交易,验证是后续动作——项目方部署后才提交源码到 Etherscan 验证。差几小时到几天都正常。如果一个合约部署 3 个月还没验证,要警惕。
多个合约能用同一份源码吗?
A:能,这就是 EIP-1167 Minimal Proxy / Clones 模式——一份逻辑合约对应 N 个轻量代理合约。Etherscan 会把代理合约标记为「Proxy」并一键跳转到逻辑合约源码。
文档发布于 2026-05-08,下次复测计划 2026-08-08(约每 90 天回访一次,确认 Etherscan Contract Tab 4 个子 Tab 与 Verified 标识规则未变)。