30 秒批量找出以太坊相似智能合约的高效方法

·

想在 以太坊区块浏览器 上一键列出所有功能雷同的 智能合约 吗?把本文的 SQL 查询片段存进口袋,真实情况中只需替换一个地址,30 秒就能拿到完整列表。

为什么需要「找相似」?

开发审计、市场研究、漏洞复现乃至 去中心化金融 DeFi 项目 fork(分叉)检测,都可能触发以下场景:

传统做法是逐条阅读源码或借助 GitHub 关键词搜索,深浅未知、信息滞后;借助公开的 BigQuery 以太坊数据集,则能一步走进全网维度。


解锁工具:BigQuery 公有数据集

Google Cloud 把 以太坊区块链 8 TB 的链上数据搬到了云端,表 bigquery-public-data.ethereum_blockchain.contracts 已经预处理了:

借助 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 同款工厂

  1. 目标:搜索所有克隆 UniswapV2Factory 的合约。
  2. 操作:把合约地址换成官方工厂 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f,相似度阈值设为 0.95。
  3. 结果: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 行为
});

👉 点此步骤详解,10 分钟在本地跑通


安全提示


立即上车

把今天学到的 SQL 模板保存在书签:替换地址即可永久复用。下一次你只需要 30 秒,就能让全网 类似合约 现身屏幕。

👉 抢先体验:更深度的链上筛选宝典