第一章:地址画像分析——如何通过链上行为判断一个地址是普通用户、巨鲸、机器人还是钓鱼地址
做链上数据分析这些年,我见过太多人一上来就盯着K线图猛看,结果被割得血本无归。其实啊,真正有价值的信息,藏在链上地址的行为模式里。今天我就带你从零开始,学会给一个地址“画像”——说白了,就是通过它的链上行为,判断它到底是普通用户、巨鲸、机器人,还是钓鱼地址。
1.1 为什么要做地址画像?
你想想看,链上数据是公开的,但信息量太大了。每天几百万笔交易,你不可能一个个去看。地址画像就是帮你快速过滤噪音,找到真正有价值的线索。
我个人习惯,拿到一个新项目,第一件事不是看白皮书,而是拉出前100个持仓地址,挨个做画像分析。为什么?因为地址的行为模式,比项目方画的饼靠谱多了。
核心逻辑:每个地址的行为模式,本质上反映了它的“身份”和“意图”。普通用户、巨鲸、机器人、钓鱼地址,它们的链上行为差异非常明显。
1.2 四大类地址的行为特征
我把常见的地址分为四类,每一类都有明显的“指纹”。
1.2.1 普通用户
这类地址的特征是:交易频率低、金额小、交互协议少。说白了,就是“正常人”的操作。
- 交易频率:平均每天0.1-2笔,不会频繁操作
- 交易金额:单笔通常不超过1000美元
- 交互协议:一般只使用1-3个主流协议(如Uniswap、Aave)
- 持仓时间:持有资产超过7天的比例较高
- Gas设置:通常使用默认Gas,不会刻意抢跑
我在项目中遇到过很多这样的地址,它们的行为模式非常稳定。比如一个地址,每周五晚上固定往Uniswap里存100 USDC买ETH,然后放着不动。这种一看就是普通用户,没什么好担心的。
1.2.2 巨鲸地址
巨鲸的画像就完全不一样了。它们的操作往往带有明显的“策略性”。
- 交易金额:单笔经常超过10万美元,甚至百万级别
- 持仓集中度:通常持有某个代币总量的1%以上
- 交互协议:会使用复杂的DeFi策略(如借贷、流动性挖矿、闪电贷)
- Gas设置:经常使用高Gas抢跑,或者使用MEV机器人
- 地址关联:通常有多个关联地址,形成“钱包集群”
我的经验:判断巨鲸地址,不要只看单笔金额。有些巨鲸会把资金分散到几十个地址里,每个地址只放几万美元。这时候你要看的是“地址集群”的总持仓量。我曾经追踪过一个地址集群,分散在47个地址里,总持仓超过2亿美元,但单个地址看起来都像普通用户。
1.2.3 机器人地址
机器人地址是链上最常见的“噪音源”。它们的特征非常明显,几乎一眼就能认出来。
- 交易频率:极高,每天几百甚至上千笔
- 交易时间:24小时不间断,没有休息时间
- 交易模式:高度重复,比如每5分钟执行一次相同的操作
- Gas设置:精确控制Gas,经常使用0.001 ETH这样的“整数”
- 交互协议:通常只与1-2个协议交互,比如专门做套利的MEV机器人
嗯,这里要注意:不是所有高频交易都是机器人。有些做市商地址也会高频交易,但它们的交易模式更复杂,会调整策略。而机器人地址的交易模式,说白了就是“复制粘贴”。
1.2.4 钓鱼地址
钓鱼地址是最危险的,也是我们做安全审计时最需要警惕的。它们的特征往往带有“欺骗性”。
- 创建时间:通常很新,创建后几天内就开始活跃
- 交易模式:先发送少量代币到目标地址(“诱饵”),然后等待目标授权
- 授权请求:频繁发起ERC20授权(approve)交易,且授权额度极高
- 资金流向:最终资金会汇聚到一个“归集地址”
- 代币类型:经常使用“同名代币”冒充知名项目(比如用“USDC”冒充真正的USDC)
避坑指南:我曾经在审计一个项目时,发现一个地址向300多个地址发送了0.001 ETH,每个地址都附带一个“空投领取”的链接。这个地址的创建时间只有3天,而且所有发送的ETH都来自同一个归集地址。这就是典型的钓鱼地址。如果你看到有人给你发“免费空投”,先查一下这个地址的链上行为,别急着点。
1.3 如何用代码做地址画像?
光靠肉眼观察肯定不行,我们需要用代码来量化分析。下面是我常用的一个Python脚本框架,用来提取地址的行为特征。
# 地址画像分析 - 核心特征提取
def analyze_address(address, chain='ethereum'):
features = {}
# 1. 交易频率分析
tx_count = get_transaction_count(address, chain)
active_days = get_active_days(address, chain)
features['tx_per_day'] = tx_count / max(active_days, 1)
# 2. 交易金额分析
tx_values = get_transaction_values(address, chain)
features['avg_tx_value'] = sum(tx_values) / len(tx_values)
features['max_tx_value'] = max(tx_values)
# 3. 协议交互分析
protocols = get_interacted_protocols(address, chain)
features['protocol_count'] = len(protocols)
# 4. Gas行为分析
gas_prices = get_gas_prices(address, chain)
features['gas_std'] = std(gas_prices) # Gas标准差,机器人通常很低
# 5. 时间模式分析
hour_distribution = get_hour_distribution(address, chain)
features['night_ratio'] = sum(hour_distribution[0:6]) / sum(hour_distribution)
return features
# 判断地址类型
def classify_address(features):
if features['tx_per_day'] > 50 and features['gas_std'] < 0.1:
return '机器人'
elif features['max_tx_value'] > 100000 and features['protocol_count'] > 5:
return '巨鲸'
elif features['night_ratio'] > 0.3 and features['tx_per_day'] < 2:
return '普通用户'
else:
return '需要进一步分析'
个人建议:这个脚本只是一个起点。实际项目中,我会加入更多特征,比如“地址创建时间”、“代币授权额度”、“是否与已知钓鱼地址交互”等。特征越多,判断越准。
1.4 地址画像的核心逻辑图
下面我用一张SVG图来展示地址画像的完整流程。这张图我画了很多次,每次讲课时都会拿出来用。
1.5 实战案例:一个钓鱼地址的完整画像
我记得有一次,一个朋友问我,他收到一个“空投”链接,地址看起来挺正常的,要不要点?我说别急,先查一下这个地址的链上行为。
我们查到的数据是这样的:
| 特征维度 | 数据 | 判断 |
|---|---|---|
| 地址创建时间 | 3天前 | 异常(新地址) |
| 交易频率 | 每天50笔 | 异常(过高) |
| 交易金额 | 全部0.001 ETH | 异常(完全一致) |
| 交互协议 | 无(只发送ETH) | 异常(没有正常交互) |
| 授权行为 | 向300个地址发起approve | 典型钓鱼特征 |
| 资金归集 | 所有ETH来自同一个地址 | 归集模式 |
看到这个结果,我直接告诉他:别点,这是钓鱼地址。后来过了两周,这个地址被标记为“钓鱼地址”,但已经有不少人上当了。
我的教训:判断钓鱼地址,最关键的三个指标是:地址创建时间短、交易金额完全一致、有归集地址。这三个特征同时出现,基本可以断定是钓鱼地址。不要被“看起来正常”的地址名迷惑。
1.6 总结:地址画像的核心要点
做地址画像,说白了就是“看行为,不看表面”。一个地址叫什么名字不重要,它做了什么才重要。
- 普通用户:低频、小额、行为随机
- 巨鲸:高频大额、策略性强、有地址集群
- 机器人:超高频、模式固定、Gas精确
- 钓鱼地址:新地址、金额一致、有归集模式
记住,链上数据不会骗人,但解读数据的人可能会犯错。多练、多看、多总结,你也能成为链上数据分析的高手。
公众号:蓝海资料掘金营,微信deep3321