/ /
基于DeepWiki深度解析EVM扫链基建项目
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

基于DeepWiki深度解析EVM扫链基建项目

导言:DeepWiki 提供了一个革命性的Code2Doc工具,扫清了理解中大型项目的一大障碍。原来接触此类项目,一般依赖项目现有的、人为维护的文档(95%的项目在这块做的比较一般),然后自行梳理出一个大概框架,基于此框架逐步阅读核心代码,最后从核心代码转移到边缘代码。DeepWiki横空出世后,补足了人为维护的文档不全面、不系统、不更新的短板

币安Alpha吸引了无数流量,币安Alpha支持了诸多公链,其中又以EVM兼容链最多,尤其是BNB链,Alpha中最正统的公链。为了构建量化基础数据,高效的扫链必不可少,本文将基于DeepWiki,对DefiLlama出品的EVM Indexer项目进行抽丝剥茧,逐步探究如下内容:

  1. EVM Indexer系统架构
  1. 核心组件和基建
  1. ERC20代币/余额/转账解析

1. 系统架构解读

项目规模:34个文件、2998行代码(含Rust、SQL等)

1.1 DeepWiki总览

DeepWiki的内容由几块组成,分别是:

DeepWiki布局

DeepWiki贴心的将内容纲要分成了如下几部分:

1.2 系统架构

从数据角度来看,整个系统由三个主要模块组成,其共同作用,提供区块链数据索引功能:

系统架构概览:数据角度

从代码模块来看,分成两个主要模块和若干个模块:

系统架构概览:代码模块角度

从数据流角度来看,从原始数据到解析后的数据分成了多阶段:

系统架构概览:数据流角度

系统划分成了4个数据表,从上至下分别是:

系统架构概览:数据持久层Schema

1.3 核心组件

系统核心组件主要有索引器、解析器和ABI读取器三块,上面已经做过简单介绍,接下来详细介绍各部分的功能和逻辑

系统核心组件:索引器、解析器、ABI读取器

首先是索引器,索引器负责从RPC节点读取链上原始数据:

  1. 通过RPC连接区块链
  1. 获取区块、交易、收据、事件日志、智能合约创建事件
  1. 将上述信息存储到PostgreSQL数据库
  1. 将解析进度保存到Redis
索引器:解析原始链上数据,保存到持久层

接下来介绍解析器,解析器负责进一步处理索引器保存的原始数据,包含三个不同用途的解析器:

  1. ERC20转账解析器:从事件日志获取ERC20代币转账
  1. ERC20代币解析器:处理代币元数据(name、symbol、decimals)
  1. ERC20余额解析器:计算和维护代币余额
解析器:包含转账解析器、代币解析器和代币余额解析器

最后介绍ABI获取器,其负责获取并处理智能合约的ABI:

  1. 从区块浏览器如Etherscan获取ABI信息
  1. 将ABI存储到持久层
  1. 抽取方法签名,以便后续交易数据
ABI获取器:获取智能合约ABI信息

DeepWiki提供了一个数据流图,展示了整个系统的数据流向:

完整数据流:ABI获取、原始数据存储、深度的ERC20解析
重要数据表

1.4 安装和配置

系统支持两种安装方式:

  1. 本地安装:在本地机器上编译
  1. 基于Docker安装运行:通过Docker容器

关于配置信息,DeepWiki贴心的将环境变量分成了必选和可选两大类:

  1. 必选:DATABASE_URL、REDIS_URL
  1. 可选:区块浏览器的API Token,如ETHERSCAN_TOKEN
配置信息

1.5 配置结构

链的配置结构包含诸多属性:

配置结构体

不支持批量获取receipt的链如下,该特性通过supports_blocks_receipts进行配置,如果为false,将会逐一获取交易receipt,相对支持批量的链,索引效率略低一点:

不支持批量receipt的链

链的配置在系统中广泛,get_chain方法用于获取链配置信息结构,各个主要组件均用到此方法:

配置信息上下游的使用

2. 核心组件

组件交互和数据流时序图

2.1 索引器

模型类型描述
DatabaseBlockBlock header information including number, hash, and timestamp
DatabaseTransactionTransaction details such as hash, from/to addresses, value, and input data
DatabaseReceiptTransaction execution results including status, gas used, and contract address
DatabaseLogEvent logs emitted during transaction execution
DatabaseContractInformation about newly created contracts
DatabaseChainIndexedStateMetadata about indexing progress

2.2 解析器

2.3 ABI获取器

3. 基建

3.1 数据库层

3.2 RPC客户端

3.3 配置和环境变量

4. ERC20解析

4.1 代币

4.2 余额

4.3 转账

5. 开发指南