【推荐】加密数据转换成本、挑战与工具 - 数据工程师必看 2025版

深入探讨了加密数据工程的实践和工具,指导如何高效地获取和处理链上数据,以及如何构建成本效益更高的 ETL 管道。

如果你不知道自己在做什么,加密数据转换在时间和金钱上都是很昂贵的。阅读此文,让你的 ETL 生活轻松许多。

这是我第四个年度加密数据指南。你可以阅读我的旧指南,以了解这个细分的数据领域,分别是 202220232024

感谢 StormJeffMats 对今年指南的审阅和建议。

我已经离开 Dune,开始工作于 我自己的数据产品,并在过去几个月里设置我们的数据工程和后端。因此,今年的指南将专注于以太坊 (EVM) 数据工程,而不是整个数据工具栈。实际上,过去一年中大部分有趣的产品变化都发生在数据工程方面。

在这本指南中,我将教你如何高效获取你的应用所需的任何链上数据集,并建立一个持续的 ETL 管道。我们将涵盖的主题包括:

  • 数据回填(Backfills),以及随着链的扩展而增加的原始数据成本
  • “数据回填和转换”问题的解决方案,例如后执行转换与重新执行转换的比较

以下是你需要了解的一些定义,以便理解本指南:

  • 客户端:包含以太坊虚拟机 (EVM) 的 软件实现,执行交易并处理区块链状态,如 Geth、Reth 和 Erigon。运行时通常称为“节点”。

  • RPC:客户端上的标准 API 接口,由 Alchemy 等提供者运行,以便开发人员可以查询区块链数据,而无需运行自己的节点。Alchemy 有一个 很好的 RPC 学习沙盒

  • 事件/函数/交易 ( 执行生命周期 ):交易触发合约函数,产生事件作为日志。交易被打包成区块。可以重放交易以获取完整的内存跟踪。

  • 数据平台(如 Dune):聚合、解码并可视化链上数据的浏览器/云平台,允许用户创建和分享自定义查询。

  • 实用 API 库:将复杂的 RPC 调用抽象为直观编程接口的开发者库:

  • ETL,特别是转换 (dbt 模型,数据血缘 ):对原始数据应用一些处理逻辑的过程,以创建被称为“模型”的抽象表,这些模型可用于应用/分析目的。

数据回填与原始数据成本的增加

EVM 数据有三个核心原始数据集:

  • 区块/交易(顶层交易的 from/to/gas/data
  • 日志/收据(合约产生的事件,与交易相关)
  • 跟踪(每个交易的完整调用跟踪)

Shovel 有一个指南 对这些基本数据集进行了相当不错的介绍,而 Cryo 还提供了接近 40 个原始数据集 在他们的 CLI 工具中:

img

Cryo 数据集 链接。这些对数据分析师和科学家快速提取和利用非常有用,但对于应用数据管道来说并不太合适。

从过去区块下载所有数据被称为“数据回填”,而持续同步被称为“向前填充”(frontfill)。使用 Quicknode RPC 在 Base (EVM) 上数据回填区块 + 收据的费用几乎是 $10,000:

img

来自 Quicknode Streams 的报价,从区块 1 开始的 Block + Receipts。

在折扣后,大多数平台对 Base 的跟踪和日志的数据回填报价大约为 $4,000,月度向前填充成本约为 $2,000。你可以通过在像 Blockjoy 这样的服务上运行自己的 reth 节点,以 $650/月的价格优化一些费用(不过,保持节点运行和客户端最新也有自己的人工成本)。

许多团队尝试直接将数据回填的数据存入他们自己的数据库,然后再进行转换(ELT),因为可能需要多次模型尝试才能获得你想要的最终数据集。在过去,对于像以太坊主网这样的小链,这种做法的成本要便宜得多(我记得那时数据回填仅需 $200)。

区块链在过去一年中迅速扩展,Solana 和 Base (EVM) 领跑。为了让你感受到规模,核心 Solana 数据大约占用 500TB,而 Base 数据占用 50TB。随着当前存储规模的增长,你可能还要为存储、转换和查询所有这些数据在 GCP/AWS 上增加每月 $4,000 到 $10,000 的成本,然后再乘以你试图支持的链的数量。如果你不小心,这些成本会迅速累积起来!

Image

Twitter(存档是链的历史状态。像 GETH/RETH 这样的客户端根据实现可能有不同的要求,这张图主要用于显示数据增长的速度)

请记住,所有链都开始迅速扩展,Base 正以指数级增加其 gas 限制(理解为交易/状态的数量),而 Solana 目标为每秒 100 万笔交易。开发者们只在努力减少节点需要的状态大小,而不是那些需要索引和处理数据的可怜家伙们。因此,如果你计划将链上的所有原始数据都作为数据策略的一部分进行存储,你将要面临巨大的 $$$ 成本压力。

我们也正在迅速远离逐块处理模型(再见 2 秒区块时间),转向纯事件流模型(每个区块 100-200 毫秒,利用 预确认 时甚至更快)。再次强调,这意味着你一直依赖的一些较慢的数据管道和延迟转换将开始崩溃,那你的管道就不知道要多久才能再次赶上最新的区块/事件。

那么你能做些什么呢?是时候开始研究不同的回填和转换加密数据的方法了!

加密数据转换的思维模型

通常,数据管道的第一次迭代涉及跟踪一组合约中的几个事件,然后对它们进行基本转换,然后将其插入数据库。

Subgraphs on theGraph 创建了围绕这种模式的最佳开发者体验 (DX),让你可以跟踪事件和工厂,并保存必要的相关参数,例如在 Aave 清算时的借贷池储备和用户参数。 过程如下:

  1. 在 yaml/schema 中列出一组合约和 ABI
  2. 定义一组映射(转换逻辑) TypeScript 文件,将每个事件处理为 schema 中的列
  3. 在整个链的历史上运行这些映射,并逐块将这些 schema 持久化到数据库中
  4. theGraph 处理原始数据,因此你不必处理完整回填的 RPC 和存储问题

然而,多年来,这些初始子图遇到了几个限制:

  • 回填可能会遇到性能问题(因此每次编辑子图时),并且在更快的链上也可能滞后。
  • 如果你需要一些增强的解码、读取功能或 RPC 调用,那么你无法使用 viem 或其他辅助包。
  • 仅支持 graphQL,因此聚合查询和进一步的转换非常麻烦。

意识到这些限制后,2022/2023 年的许多数据产品都包含某种“子图迁移”功能,例如 Satsuma(被 Alchemy收购)、Goldsky、Ponder、Subquery、Subsquid 和 StreamingFast。所有这些都采取不同的方法来保持子图的简单 DX,同时解决一些前面提到的问题。theGraph 当然也在尝试解决其中一些问题,选择 StreamingFast 作为其核心合作伙伴。

我们将在接下来的部分中深入探讨所有核心数据工程问题,但在这个阶段,我们可以将我们的转换需求定义如下:

Hook 一个事件/函数(如 Swap),然后在 Hook 时使用一组合包和读取功能收集“外围”信息。这也是收集更大数据集的过滤版本的好时机,例如仅在交易中发生 Swap 时的完整跟踪。

执行后转换 (Post-Execution Transforms)

所以我们知道我们可以将提取和转换步骤与一些类似子图的 Hook结合起来。我们称之为“执行后转换”,定义在事件/区块提交后如何转换 RPC 的默认原始数据。以下是我发现对特定用例最有用的一些工具。

请记住,单个平台不太可能满足你所有的需求,因此不要过于依赖始终使用相同的工具。

让我们从允许你直接从 RPC 构建的工具开始:

最简单的自托管转换解决方案:Ponder(TypeScript 库)

不依赖于云供应商的最佳方法是使用 ponder.sh。你可以Hook任何 ABI 事件,然后使用 viem 进行任何链上调用/读取,以增强数据,然后将其插入到你的数据库中。这里有 一个简单的例子,展示了如何将钩子和读取功能结合在一起。你可以想象Hook一个 Uniswap V3 Swap 事件,然后调用 他们的 TWAP 预言机,并将其与区块开始和结束时的 tick 变动读取结合起来。

我个人使用 ponder 来支持 Bytexplorer mint 页面 以跟踪 ERC6551、ERC20、ERC721、ERC1155 和一些工厂合约

如果你跟踪几个特定合约,需要在转换过程中进行各种 API 调用,并希望将这些数据存储在自己的数据库中;那么 Ponder 将是与 Quicknode 或 Alchemy 等 RPC 提供商结合使用时最简单且成本最低的选择。

你可以查看 envio 以获取类似的解决方案。

轻量级云解决方案:Quicknode(TypeScript/Python)

如果你想要比 Ponder 更轻量的解决方案,并且有一个简单的键值存储(如 mongoDB),那么可以查看 Quicknode 函数(他们也提供 RPC)。如果你不需要将数据重度连接到某个内部数据库表,但仍希望比子图更灵活的东西,我会选择这个。

他们有 这里与 Aave 的精彩指南。你可以将函数视为 AWS 上的 lambda,包含三个关键步骤:

  1. 设置一个“流”以回填数据,通过函数运行
  2. 编写一些任意的 TypeScript/Python 脚本作为可以链接在一起以转换数据的“函数”
  3. 将输出存储在可以通过 API 查询的键值存储中

我相信 indexing.co 是唯一一个也支持函数的平台,你可以联系他们的团队进行测试。

这是最灵活和轻量的选择,如果你正在处理特定对象数据(不需要许多聚合或连接的钱包、代币和合约集合),非常有用。

最快速的自托管批量分析解决方案:Cryo(Rust、Python)

我之前已经提到过他们,但 Cryo 支持几乎 40 个原始数据集,这些数据集是对原始 RPC 数据的基本转换。Storm(维护者)在自托管数据及 Cryo 的适用性方面做了很好的高层次演讲:

https://youtu.be/1DFxuspPE2g

你可以在这里找到 更近期的演讲,内容更深入

如果你只想要用于一次性分析目的的通用原始数据集,你应该查看是否有 任何支持的数据集在 cryo,你可以通过他们的 CLI 轻松提取(运行节点或获取 RPC → 使用 cryo 提取 → 保存为 parquet 文件 → 使用 duckdb 查询)。不过,这并不适合构建连续管道或在提取过程中添加转换。

现在进入 SQL 工具,让你在基于 RPC 数据构建的基本表上进行构建……

无需自己的数据仓库进行转换/查询:Dune(SQL)

我的建议是首先使用 像 Dune 这样的云 SQL 数据提供商 来测试你的转换逻辑,而不产生成本,然后再直接跳入原始数据,使用我稍后将讨论的一些工具。你应该将你的合约数据视为所有可用数据的小子集,使用像 Dune 这样的平台将帮助你在执行后空间中建立对转换的熟悉度。从 creation_traces(已部署合约)、ERC20 转账、价格、DEX 交易、ENS 名称等,都是你可能在后续创建或使用的表。你可以为伪 DAG 创建自己的查询视图和物化视图:

img

每个查询都有一个“lineage”按钮。请注意,你无法按继承顺序以编程方式执行查询,因此lineage仅供展示。

我经常利用 Dune API 过滤器 在将大型表加载到我的数据库之前在后台测试这些转换——只需记住 对结果进行查询过滤,而不是在每个调用中重新执行查询(这将非常昂贵)。你也可以 将小部分数据上传到 Dune 以测试你的一些内部架构。这对于你可能需要运行的每日或每周任务也很有用,例如 Cowswap 进行分配求解器奖励

请记住,Dune 数据不是实时的,不同表的时效性有很大的变化( 从 1 分钟到 1 小时到 1 天 ),在繁忙时段执行引擎可能会排队/变化。使用 Dune,不要期望能够将原始数据集拉入自己的数据库而不花费很多钱。理想的设置是需要提取像 dex.trades 这样的深度抽象表,你可以使用每月 $1k 的高级计划提取最后 1 亿笔交易(1 亿行,25 列,每信用 25,000 个数据点,100,000 个信用)。1 亿笔交易大约等于 Base 上 2 个月的交易(截至 2024 年 12 月)。你可以使用如 array_agg 函数将尽可能多的值提取到一个单元格中,以节省信用。

Allium 提供了一种 SQL 产品,具备更强大的 API 和数据提取,实时性在 5 秒内,并有专用引擎——尽管社区示例查询和表相对较少。

如果你想要一种数据解决方案,你不需要自己的链上数据仓库。你在这里的复杂性将体现在寻找和创建所需的 SQL 表上。你可以预计,按规模每月至少支付 $1k,以便立即访问加密行业中最强的数据管道。

最简单的 SQL 转换到你的仓库:Goldsky (SQL)

不幸的是,Dune 在数据工程方面的用户体验不好。管理 查询视图的管道 以便流入外部数据库并不容易。我发现 Goldsky 在这方面提供了最佳的自助体验,拥有 DAG 表构建工具:

img

Goldsky Mirror / Pipeline

他们支持许多接收端(从查询推送数据到你的数据库),仅需单击即可实现多个数据目的地,接近 fivetran 这一类工具的易用性。如果你友好地联系 团队,我相信他们会为首次填补或学术使用提供一些友好的定价。

你可以像在 Dune 中一样在 Goldsky 中创建查询的 DAG,然而 Goldsky 实际上通过与 Flink 的流式 SQL 支持有状态转换( 而不是批处理 ,就像 dbt 一样)。你还可以通过 http 请求或 webhook 交织来自外部处理程序的数据,以便在推送和与其他 Goldsky 数据集连接之前外部管理一些自定义功能。

重新执行转换(Re-Execution Transforms)

如果你是初学数据工程师,我强烈建议使用前面提到的解决方案来实现你想要的任何功能。当你进入更高级和数据密集的管道时,你可能需要研究重新执行转换。

使用自定义执行分叉链 在 Solidity 测试工作流中已经是一种常见做法。基本思路是,你可以获取一个链及其状态,进行复制、编辑并在本地运行,从而可以对其进行任何操作:

  • 从任何钱包提交任何块的交易(无需密钥)
  • 编辑合约代码以添加事件甚至新变量以增强数据
  • 添加操作码或其他低级功能以获得更多可视性( 作弊码

完成编辑后,你可以重放之前/未来的区块,然后使用相同的 RPC 端点提取增强后的数据。

近年来,构建更接近执行级别的数据工具的趋势正在增加,因为你在这里进行的任何编辑都将节省执行后昂贵的连接和查询所需的时间。

唯一的缺点是,你需要学习 Solidity 和一些低级 VM 生命周期概念,以利用这些工具。

最简单的事件编辑器:Shadow(云或自托管)

有时,你想增强关键发出事件(例如 Swap)周围的数据。Shadow 使添加新事件变得简单,让你可以捕获更多关于执行确切时间的数据。请注意,以交易级粒度获取数据需要重新执行环境,所有来自执行后工具的功能只能获取区块级粒度的数据。这对于价格、流动性、余额、健康因子、预言机数学等数据非常重要。

这是一个示例,展示他们向 Uniswap V3 添加的事件,特别是使在交换过程中更容易获取流动性和价格数据。他们建立了 示例注册表,以便轻松学习并与他们的 shadow reth 节点一起运行,该节点利用了一些 reth 客户端执行功能。 如果这些对你来说都是生僻词,不用担心,基本上就是说你可以编辑事件并相对简单地自行运行。

Shadow 的首席技术官 Emily Hsia 进行了精彩的演示,讲述了如何在数据管道中使用 Shadow,具体如下(2:39:18):

https://www.youtube.com/watch?v=ta7yY51RK2Q&t=219s

当你编辑事件时,RPC 标准支持不会发生任何变化,因此你可以使用 Ponder 和 Shadow RPC 创建在其上构建的数据工程体验。

其他选项包括 ghostlogssim patch,但这些不是开源和自托管的(如果这对你很重要)。

最强大的重新执行Hook:Sim (smlXL, 被Dune收购 )

对于更复杂的转换,你可能需要在执行的不同时间点获取数据,而不仅仅是单个事件。你可以使用 Sim 在智能合约中创建钩子,例如每次存储变量(如余额映射)改变时、每个转账事件或每个交易/区块的调用跟踪时进行钩挂:

img

你可以使用类似 Dune Echo API 的工具轻松获取最新区块的实时余额,但我的用例要求能够获取任何历史区块的余额——甚至是在特定交易内。因此,我创建的一个有趣的 Sim 画布是使用存储钩子和区块钩子的组合来获取交易中所有地址和代币的余额变化(前后)。

我 lambda 中的逻辑(在 solidity 中的钩子集)如下:

  1. 对于给定交易,在余额映射被更改之前,将所有者、代币地址和当前余额存储到一个名为“balances”的数据映射中,其中包含“BalanceInfo”结构
  2. 每次余额更改时,更新“BalanceInfo”中的最终余额值
  3. 我们只保留最后一次更新,并在区块结束时返回整个“balances”映射以及完整的前后“BalanceInfo”数据(在测试日志中显示)
  4. 没有任何内容会保存到数据库,我可以使用“外部触发器”组件通过 API 调用处理这些

img

有代码的画布链接

这种数据提取需要 RPC 跟踪、存储布局和低级内存差异跟踪来生成——这种专业知识在加密领域很少有人具备。与此同时,我可以仅用 100 行代码使用 Sim 创建该管道。在交易级别获取动态数据如余额以前是不可能的,但现在可以实现。

Sim 是我在新数据工程堆栈中使用最多的数据工具,覆盖了 90% 的用例。剩余的 10% 由 Dune 和 Quicknode 处理。

在上述转换之后,你可以在此基础上编写 SQL 查询,并将其作为 API 端点执行或直接沉入到数据库中,如 Goldsky。

Sim 还支持 有状态的 Solidity 转换,这意味着你可以添加一个存储变量,其状态在所有区块中持续。通过简单的映射变量,你基本上可以在你的 lambda 中创建一个键值存储!

轻量级自定义读取函数:TEVM(TypeScript 库)

在加密领域,一个常见的数据收集工具是“multicall”( 链接 ),你可以在其中创建一个新合约,该合约在被调用时会调用一组其他读取函数。这样,你可以在只进行一次 RPC 调用的情况下收集多个合约的数据(节省时间和金钱)。实际上,Viem 在他们的模拟调用中拥有一个增强版本( 链接 ),可以让你覆盖状态。

我们现在可以更进一步,完全重写任何现有合约上的读取函数。这就像编辑事件,但它是直接用 TypeScript 编写的( 链接 ),这使得它更加轻量,因为它没有 Shadow 和 Sim 的完整编译/部署过程。

img

推特链接

老实说,我还没有用 TEVM 构建很多示例,但我很快就会有一些有趣的公共实验。我对此非常兴奋,因此现在将这个工具包括在这里供其他人查看。

结尾的想法:转换的权衡

总而言之,你的数据管道将取决于你在何时何地处理转换。下面是我今天提到的工具和概念的小图表,以及它们何时可以使用:

img

请记住,这些只是所有加密数据工具的一个子集,还有许多其他工具,但它们大致上属于上面显示的相同使用类型。

作为经验法则,我通常会首先尝试在云平台提供商上启动一个基本管道,然后再决定是否想要将其提取到外部管道/数据库。每次都从头开始处理每个数据集会极大地拖慢你的速度,并在基础设施和工程师方面花费你更多成本。

最终,你很可能需要结合这些工具,以满足你的应用和分析数据要求。加密的开源和开放数据特性使我们得到了许多强大的工具和平台,而不仅仅是封闭的 API。

许多分析师生活在 Dune 的世界里,只知道 SQL。学习此处的一些工具的其余数据堆栈将会提升你的技能和职业,因为随着空间的发展,应用程序的数量和质量也会随着提高。这些应用程序将需要良好的数据。良好的数据需要优秀的数据工程师和工程 - 我希望这将由你来推动。

祝大家在 2025 年好运!

如往常一样,欢迎随时 与我联系,分享你的想法或问题。

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cryptodatabytes
cryptodatabytes
https://substack.com/@andrewhong5297