W3
链上操作进阶预计 40-50 分钟9 个步骤20 次学习

链上数据分析实战:从浏览器查询到 Dune SQL

链上数据是公开的,但「公开」不等于「好用」:节点接口查不了跨表关联、区块浏览器点不出批量结论、代理合约的事件还常常解码失败。这一篇把四类数据来源(区块浏览器、节点 RPC、索引器、数据平台)各自能干什么讲清,然后带你走完一次真实分析:从「某代币最近 24 小时有多少笔转账」到「持仓前 10 名是谁、其中哪些其实是合约或资金池」。过程中会踩到链上分析最常见的几个坑——代币精度(decimals)、把 LP 池当成大户、把合约地址当持有人、忽略区块重组——最后说明哪些结论<strong>根本不可能</strong>从链上数据得出(身份、真实意图、场外交易),避免用数据编故事。

⚠️
操作前必读

数据分析本身不动资金,但用错数据做决策会直接亏钱。三类高频误判请务必避开:一、把合约地址、流动性池、销毁地址当成「大户」——持仓榜前列经常是这些东西,误判成「庄家吸筹」会得出完全相反的结论;二、忽略代币精度——把 6 位小数的 USDC 按 18 位算,持仓量会差 10¹² 倍;三、把「链上数据」当成全部真相——交易所内部转账、跨链桥余额、场外交易都不在公开账本上,只看得见的部分做推断很容易得出错误结论。

任何「某地址在吸筹/出货」的结论,都要先排除这几类干扰项再下判断。

01

为什么不能直接查节点:RPC 的三条硬限制

登录记录进度

很多人第一次想做链上分析,直觉是「我有 RPC,查一下不就行了」——很快会撞上三条限制。一、查询范围有限:查事件日志的 eth_getLogs 接口通常限制区块范围(几百到几千个区块一次),想拉一整年的数据要循环几万次请求,慢且容易被限流。

二、不能做关联查询:RPC 接口是「一次问一件事」的钥匙孔,没有 SQL 那种 JOIN、GROUP BY、聚合window函数,想做「统计每个地址的转账总额并排序」需要把原始数据全部拉到本地自己算。

三、拿不到历史状态:想查「某个地址三个月前的余额」需要归档节点(archive node),普通全节点只保留最近状态,公共 RPC 基本不提供这种查询。

这三条限制决定了正确做法:要单笔查询用浏览器或 RPC,要批量统计与关联分析用数据平台或索引器。 选错工具会让一件十分钟的事变成十小时。

💡
小技巧:

记法:RPC 是「点查」,数据平台是「面查」。想知道一笔交易的状态用 RPC,想统计一千个地址的行为用 SQL。

02

四类数据来源各自能干什么

登录记录进度

一、区块浏览器(Etherscan 等):点查之王——看某笔交易、某个地址、某个合约的详情与源码,还能用它的标签库识别已知实体(交易所、桥、混币器)。缺点是批量能力弱、无法自定义统计。二、节点 RPC:适合程序化获取实时数据(余额、nonce、Gas 价格、单次合约调用),是钱包与 DApp 的后端。

三、索引器(The Graph 等):把链上数据按你定义的结构(subgraph)索引成可查询的 API,适合给应用做后端查询,但需要项目方部署并维护 subgraph,覆盖范围取决于有没有人做。

四、数据平台(Dune、Flipside 等):把原始链上数据解码成表格(交易表、日志表、按协议解码的明细表),让你直接写 SQL 做批量统计与看板,是做研究最顺手的工具。

实际工作里四者是组合使用:浏览器定位、RPC 取实时、SQL 做统计、索引器接应用

💡
小技巧:

看到某地址有交易所标签,不要据此断定「这是交易所自己的钱」。标签通常表示「该地址与某平台有关联」,可能是热钱包、也可能是某个用户的充值地址——结论强度取决于标签来源。

03

看懂链上数据的三种原始表

登录记录进度

无论用哪个平台,底层都是同一批数据,理解三张原始表就够用。transactions(交易表):一笔由外部账户发起、被矿工/验证者打包的交易,字段包括 from、to、value、gas_used、input(调用数据)、success。

注意:只有外部账户发起的才是「交易」,合约内部调用不会单独出现在这里。logs(事件日志表):合约在执行中通过 emit 写出的日志,是分析代币流转的主力——例如 ERC-20 的 Transfer 事件记录了 from、to、value。

日志有 topic0(事件签名哈希)与 topic1/2/3(indexed 参数),所以能高效按地址过滤。traces(内部调用表):合约之间的调用轨迹,用于看清「一笔交易在链上到底触发了什么」,比如某个 swap 经过了几层路由。

新手最常犯的错是只查 transactions 就想统计代币转账——代币转账往往发生在合约内部,必须查 logs 或 decoded 表。

💡
小技巧:

判断该查哪张表:「钱变了」看 logs 里的 Transfer,「有调用」看 traces,「交易本身」看 transactions。

04

事件解码与代理合约的坑

登录记录进度

日志里的数据是原始十六进制,要变成人能读的「转账 500 USDC」需要ABI(应用二进制接口)来解码:ABI 告诉解码器「第 1 个参数是 address、第 2 个是 uint256」。

这带来两类常见问题。一、没有 ABI 就解码不了:未验证源码的合约,平台无法自动解码,你只能看到原始 topic 与 data,只能靠事件签名哈希反查。二、代理合约是重灾区:现在大量合约用可升级代理模式(业务逻辑在 implementation 合约,用户交互的是 proxy 地址)。

数据平台上有时会出现「同一个代币的 Transfer 事件分散在两个地址下」「解码失败」——原因是 ABI 挂在实现合约上,而事件从代理地址发出,平台若没做代理识别就会漏。处理办法:先去浏览器确认这个地址是代理还是实现、读出 implementation 地址,再用实现合约的 ABI 去解码;或者在数据平台上用「已解码」表时注意核对记录数是否明显偏少。

🚫
避坑提醒:

代理合约还意味着「合约行为可以变」。 你分析的那份逻辑可能已经被升级替换,历史调用与当前逻辑不一定一致。做安全判断时,除了读源码,还要查它历史上有没有被升级过、升级权限在谁手里。

05

写第一条 SQL:统计某代币的转账活跃度

登录记录进度

在 Dune 一类平台上,第一个实用查询通常是「某代币最近 24 小时有多少笔转账、涉及多少独立地址」。思路就三步:一、找表,用平台的解码表(形如 erc20_ethereum.evt_Transfer)或直接从原始日志表过滤出该代币合约地址的 Transfer 事件;二、筛条件,限定时间窗口(按 evt_block_timeblock_time)与代币合约地址;三、做聚合,按小时分组统计笔数、对 from/to 去重后统计独立地址数。

写的时候注意两个细节:一是时间字段用 UTC,别用本地时区做「最近 24 小时」;二是同一个地址在一小时内既有转入又有转出时,去重要小心(一次简单 count(distinct ...) + count(distinct ...) 会重复计算同一个人)。

这类查询的价值在于建立基线:知道某个代币日常是几百笔还是几万笔之后,「突然涨到十倍」才有意义。

💡
小技巧:

先做「基线查询」,再做「异常查询」。没有基线的判断(「今天转账很多!」)几乎总是错的——很多代币在空投或做活动时,转账量本来就会跳一个数量级

06

实战:查持仓前 10,并排除干扰项

登录记录进度

「谁持有这个代币最多」是最常被问、也最容易得出错误答案的问题。正确做法分四步。一、算净持仓:ERC-20 没有「余额」字段,余额只能通过累加 Transfer 事件推出——每个地址收到的总额减去转出的总额(注意转账手续费型代币会在事件里直接扣减,所以以事件为准)。

二、按 decimals 还原:把整数余额除以 10 的 decimals 次方,USDC 是 6 位、多数代币是 18 位,搞错就是几个数量级的错误。三、排除非「自然人」地址:常见干扰项包括——合约地址(代码不为空)、流动性池(DEX 的 pair/pool 合约)、销毁地址(0x000...dead 之类)、桥与托管合约、项目自己的金库与解锁合约、以及本身就是代币合约的地址

四、看变化而不是看快照:单看「现在持有多少」意义有限,加上「最近 7 天净流入/流出」才能判断是在集中还是在派发。做完这四步,原本的「前 10 名持有 80%」往往变成「其中 6 个是池子与合约,真正的大户只有 2 个,且其中 1 个在持续流出」——这才是可用的结论。

🚫
避坑提醒:

「持仓高度集中」这类结论必须排除池子与合约后再下。 大量文章把流动性池地址列成「巨鲸」,读者据此以为项目被控盘,实际池子里的币属于所有提供流动性的人。结论错了,交易方向就反了。

07

链上分析的六个常见坑

登录记录进度

把高频错误收成一份清单,每次分析前过一遍。一、精度(decimals):金额不做还原,几个数量级就错了。二、池子/合约地址当人:见上一步。三、忽略区块重组(reorg):链上交易在足够多的区块确认前可能被回滚,做实时监控时要按确认数留缓冲(以太坊上通常等 12 个区块以上),否则会得出「刚发生又消失」的结论。

四、用「最新快照」当历史:没有归档节点或归档表时,历史余额是算不出来的,别用现在的持仓去解释三个月前的事。五、把交易所内部转账当链上行为:用户在交易所里买卖币,链上完全看不到,因此「这个币最近没人动」不代表没人交易。

六、解码失败当成「没发生」:查不到记录可能只是没解码,先去浏览器交叉验证一笔真实交易再下结论。

💡
小技巧:

做实时监控时,把「确认数」当成硬性缓冲:先按 12 个区块确认过滤,再对外报数,否则你会经常报出「已回滚的交易」。

08

从查询到看板:把结论变成可复用的东西

登录记录进度

单次查询只在当下有用,真正的价值来自能持续更新的看板。做法:把查询保存成平台的查询对象(有稳定 ID),再把多个查询挂到一个看板上(图表、表格、计数卡组合),设置刷新频率与时间范围参数。

三个实务建议:一、把「时间窗口」做成参数,这样同一个看板能看 24 小时、7 天、30 天,不用为每个窗口写一份查询。二、在图表上标注事件(上线日、空投日、某条新闻),否则读者会把「活动带来的跳涨」误读成「基本面变化」。

三、写明数据口径:查的是哪张表、怎么定义「活跃地址」、有没有排除合约——没有口径说明的数字等于没有数字。这一点对本项目同样适用:凡是页面上给用户看的数量,都要能从数据源算出来并在注释里写清来源。

💡
小技巧:

看板上线前问自己一句:「这个数字如果翻倍,我该做什么?」 答不上来,说明这个指标只是好看,不构成决策依据。

09

链上数据得不出什么结论

登录记录进度

这一条比前面所有技巧都重要:知道自己看不到什么,才不会被数据带着编故事。 链上数据无法回答的问题包括——一、身份:地址背后的自然人是谁(除非有公开的标签或链下信息佐证),同一人可能用几十个地址,一个人也可能被多人共用。

二、意图:一笔转账是在买入、还是在搬仓、还是在做市商调仓?单看链上只能看到动作,看不到动机。三、场外与交易所内部:交易所内部账本、OTC 交易、跨链桥在另一侧的余额,都不在公开账本上,所以「这个币的总流通」在多数情况下算不准

四、因果关系:某地址买入后价格上涨,不能推出「是它拉起来的」——同期可能有几十个变量。可靠的用法是用链上数据验证假设(「如果真是派发,应该看到 X 地址持续流出」),而不是用链上数据发明假设

🚫
避坑提醒:

看到一个「链上数据证明庄家在出货」的结论时,先问三件事:样本是不是只有几个地址?有没有排除池子与交易所?能不能被同一批数据的另一种解读推翻? 大多数这类结论经不起第三问。

全部步骤已完成

操作完成后建议再核对一次到账金额与手续费,并保留交易哈希作为凭证。

相关教程