想在 以太坊区块浏览器 上一键列出所有功能雷同的 智能合约 吗?把本文的 SQL 查询片段存进口袋,真实情况中只需替换一个地址,30 秒就能拿到完整列表。
为什么需要「找相似」?
开发审计、市场研究、漏洞复现乃至 去中心化金融 DeFi 项目 fork(分叉)检测,都可能触发以下场景:
- 代码复用:发现 ETH 主网有人直接抄走自家 合约源码。
- 安全跟踪:某合约被曝漏洞,迅速定位同样逻辑的实现。
- 套利脚本:监控 AMM 交易对 或 ERC-20 分发合约,一旦有“孪生部署”即可抢先介入。
传统做法是逐条阅读源码或借助 GitHub 关键词搜索,深浅未知、信息滞后;借助公开的 BigQuery 以太坊数据集,则能一步走进全网维度。
解锁工具:BigQuery 公有数据集
Google Cloud 把 以太坊区块链 8 TB 的链上数据搬到了云端,表 bigquery-public-data.ethereum_blockchain.contracts 已经预处理了:
- 合约代码哈希
function_sighashes—— 合约所有对外暴露的函数 4 字节签名- 部署时间与区块号
借助 Jaccard 相似度 + Levenshtein 编辑距离,仅需 30 秒即可跑出结果。
30 秒实操步骤
Step 1:访问控制台
直接在浏览器打开 Google Cloud BigQuery 控制台(已嵌入查询模板)。
Step 2:替换变量
把 SQL 中 address = '0x01eacc3ae59ee7fbbc191d63e8e1ccfdac11628c' 的地址换成你想侦察的 合约地址,点击「运行」即可。
Step 3:阅读结果
输出表 similarity 字段越接近 1 代表相似度越高,建议先按 function_count 筛除空壳合约再深入。
高能查询代码逐块讲解
以下 BigQuery 标准 SQL 片段已内置 JavaScript UDF:
-- Jaccard 相似算法:度量函数签名集合的交集占比
CREATE TEMP FUNCTION jaccard(v1 ARRAY<STRING>, v2 ARRAY<STRING>) RETURNS FLOAT64
LANGUAGE js AS """
...省略:对两个数组取并集再计算...
""";
-- Levenshtein 算法:度量字符串编辑差异
CREATE TEMP FUNCTION Levenshtein(a STRING, b STRING) RETURNS FLOAT64
LANGUAGE js AS """
...省略:经典 DP 实现...
""";
WITH target AS (
SELECT function_sighashes
FROM `bigquery-public-data.ethereum_blockchain.contracts`
WHERE address = '0x01eacc3ae59ee7fbbc191d63e8e1ccfdac11628c'
)
SELECT
address,
block_timestamp,
jaccard(target.function_sighashes, c.function_sighashes) AS similarity,
ARRAY_LENGTH(c.function_sighashes) AS function_count
FROM `bigquery-public-data.ethereum_blockchain.contracts` AS c, target
WHERE jaccard(target.function_sighashes, c.function_sighashes) > 0.7
ORDER BY similarity DESC
LIMIT 100;解释:当similarity > 0.7时,常用函数重合度已可达“功能基本相同”水准;若想筛掉空白合约,可额外加上function_count > 2。
案例研究:锁定 Uniswap V2 同款工厂
- 目标:搜索所有克隆 UniswapV2Factory 的合约。
- 操作:把合约地址换成官方工厂
0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f,相似度阈值设为 0.95。 - 结果:1 分钟内迸出 17 条记录,含 SushiSwap & PancakeSwap ETH 主网早期版本等,一目了然。
常见问题 Q&A
Q1:没有 BigQuery 账户怎么办?
A:先注册 Google Cloud,新手赠送 300 美金试用金,足够跑上千次查询。
Q2:对比源码明文准确度不是更高吗?
A:链上源码不一定上传,而函数签名强制存在于 Bytecode;BigQuery 方案覆盖率 100%,识别速度秒级。
Q3:只想找特定事件日志一致,也能改吗?
A:把 function_sighashes 换成 topics,段落相同原理即可。
Q4:运行 500 行以上结果会超出免费额度吗?
A:单次扫描 8 GB,费用不到 0.02 美金;建议把 LIMIT 500 精简到 100。
Q5:如何排除已有 Proxy Pattern?
A:另查 implementation_slot 为空即可;或加 is_proxy = false 筛选列。
延伸技巧:把结果实时推送 Node 脚本
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const sql = `YOUR SQL HERE`;
bigquery.query(sql).then(rows => {
// 即刻推送 TG/ Discord 机器人,第一时间发现 fork 行为
});安全提示
- 低相似度并不意味着逻辑一致,仍需人工审读或自动 漏洞扫描。
- 部署时将查询结果缓存到 Redis,避免重复扫描。
立即上车
把今天学到的 SQL 模板保存在书签:替换地址即可永久复用。下一次你只需要 30 秒,就能让全网 类似合约 现身屏幕。