Skip to main content

为了打破大规模链上数据清洗时的性能瓶颈,Chaintable 采用了**函数式数据处理(Functional Data Processing)**范式。 在这里,你的核心工作是编写纯粹的数据处理函数(Function)。你不需要操心如何连接数据库、如何编写复杂的 SQL Insert 语句,更不用操心目标表的写入冲突与并发锁。你只需定义数据的转换规则,剩下的全部由平台托管。

1. 核心哲学:逻辑与算力的深度解耦

Chaintable 将“业务逻辑”与“底层算力”进行了绝对的剥离,由以下三大支柱共同支撑:

纯粹的逻辑定义(Stateless Function)

你只需要编写一个简单的 Python 函数,定义“如何将这一行/这一块原始链上数据转化为业务数据”。这个函数在逻辑上是**无状态(Stateless)幂等(Idempotent)**的,它不依赖也无法修改外部全局环境,只严格关注输入与输出。 标准的计算函数示例:
def trace_to_token_transfer(record):
    # 1. 防御性过滤:排除代理调用等非转账行为
    if record.get('call_type') == 'delegatecall':
        return None

    # 2. 核心边界校验:必须有有效价值且包含交易 ID
    if not (record.get('value', 0) > 0 and record.get('tx_id')):
        return None

    # 3. 声明式输出:仅返回 dict / list[dict] / None
    # 平台会自动捕获返回值,并将其无缝、安全地持久化到目标 Block 表中
    return dict(
        id=record['id'],
        token_id='0x000000000000000000000000000000000000EEEE',  # 原生 ETH 标识
        from_addr=record['from_addr'],
        to_addr=record['to_addr'],
        value=record['value'],
        tx_id=record['tx_id'],
    )

计算的无限扩展(BlockX Serverless Cluster)

由于你编写的函数是完全无状态的,这意味着它们具备天然的可并行性。当面对海量历史区块回填或极高频的实时流时,BlockX 并发引擎可以将成千上万个函数调用(Function Calls)在瞬间分发到数百个 Serverless 计算节点上运行,实现计算能力的线性弹性扩展。

计算状态共享与智能 IO 拦截

在链上数据处理中,函数往往需要点查某些依赖状态(例如:查询某个智能合约的 Decimal 精度,或验证某个地址是否在黑名单中)。如果每个并发函数都去请求一次节点,会瞬间对基础设施造成毁灭性的 IO 压力。
  • 世界状态假设:BlockX 在执行层实现了智能拦截机制。在一个 Task 计算周期内,相同的数据库查询或节点 RPC 请求会被自动拦截、合并并缓存。
  • 开发者红利:你可以放心地在函数里编写简单的、符合直觉的点查逻辑,BlockX 会帮你实现“一次网络请求,全域节点共享”,在保护上游节点的同时大幅度提升吞吐量。

2. 函数的使用范围

在 Chaintable 中,不论是数据索引还是数据应用,你的主要工作都是编写计算函数一项。根据产品开发阶段的不同,同一个 Function 可以无缝部署在三个完全不同的场景中执行,且保证逻辑语义的绝对对齐(Deterministic Execution)
       ┌───────────────────  Your Python Function  ───────────────────┐
       │                                                              │
       ▼                               ▼                              ▼
【 1. 数据生产场景 】            【 2. OpenAPI 场景 】          【 3. Notebook 调试 】
 运行于 BlockX 弹性集群         运行于 OpenAPI 交付集群         运行于本地 Notebook 进程
 面向海量区块, 大规模并发        对外暴露为低延迟 HTTP 接口      实时 Print 日志, 断点 Debug

1. 数据生产场景(Data Ingestion)

这是函数最核心的运行场景。
  • 执行主体:BlockX 高并发集群。
  • 运行机制:由事件驱动循环触发,BlockX 负责将函数瞬间分发到计算节点,并行处理数以万计的区块事件。此时开启任务级 IO 缓存优化,全力利用集群算力。

2. OpenAPI 场景(Data Delivery)

当数据在 BlockDB 中生产完成后,你需要将这些高价值数据交付给下游的在线应用(如网页、App、DApp 后端)。
  • 执行主体:OpenAPI 执行集群。
  • 运行机制:你可以一键将该 Function 发布为标准的 OpenAPI(HTTP 接口)。当下游应用调用接口时,该函数充当轻量级的“API 后端逻辑”,直接从 BlockDB 读取数据、执行聚合或格式转换并即时响应。这允许你在不改变底层存储结构的前提下,通过修改函数逻辑,极其灵活地调整对外提供的数据视图。

3. Notebook 调试与本地处理(Sandbox & Debug)

在正式发布任务之前,你需要对逻辑进行验证。
  • 执行主体:Notebook 进程自身沙箱环境。
  • 运行机制:函数直接运行在当前的 Notebook 实例中。开发者可以传入少量的测试区块数据进行小规模计算,实时观察变量状态、查看 print() 打印日志,执行调试。

3. 跨环境执行行为的对齐规范

为了确保“所见即所得”,Chaintable 在底层做了严苛的跨语言与跨环境行为对齐:
  • 严谨的确定性:无论是本地 Notebook 里的单步调试,还是 BlockX 里的多核并发,亦或是 OpenAPI 的即时响应,函数的计算结果在逻辑层面上严格一致
  • 透明的层级优化:唯一的区别在于执行层的性能优化。Notebook & OpenAPI 采用标准执行模式,侧重于响应的极低延迟(Low Latency);而 BlockX 则在保持标准语义的基础上,附加了大规模并发下的状态合并与 IO 缓存
对于开发者而言,掌握函数编写,即可掌握数据生产,数据交付和数据测试的核心能力。