为了打破大规模链上数据清洗时的性能瓶颈,Chaintable 采用了**函数式数据处理(Functional Data Processing)**范式。 在这里,你的核心工作是编写纯粹的数据处理函数(Function)。你不需要操心如何连接数据库、如何编写复杂的 SQL Insert 语句,更不用操心目标表的写入冲突与并发锁。你只需定义数据的转换规则,剩下的全部由平台托管。
1. 核心哲学:逻辑与算力的深度解耦
Chaintable 将“业务逻辑”与“底层算力”进行了绝对的剥离,由以下三大支柱共同支撑:纯粹的逻辑定义(Stateless Function)
你只需要编写一个简单的 Python 函数,定义“如何将这一行/这一块原始链上数据转化为业务数据”。这个函数在逻辑上是**无状态(Stateless)且幂等(Idempotent)**的,它不依赖也无法修改外部全局环境,只严格关注输入与输出。 标准的计算函数示例:计算的无限扩展(BlockX Serverless Cluster)
由于你编写的函数是完全无状态的,这意味着它们具备天然的可并行性。当面对海量历史区块回填或极高频的实时流时,BlockX 并发引擎可以将成千上万个函数调用(Function Calls)在瞬间分发到数百个 Serverless 计算节点上运行,实现计算能力的线性弹性扩展。计算状态共享与智能 IO 拦截
在链上数据处理中,函数往往需要点查某些依赖状态(例如:查询某个智能合约的 Decimal 精度,或验证某个地址是否在黑名单中)。如果每个并发函数都去请求一次节点,会瞬间对基础设施造成毁灭性的 IO 压力。- 世界状态假设:BlockX 在执行层实现了智能拦截机制。在一个 Task 计算周期内,相同的数据库查询或节点 RPC 请求会被自动拦截、合并并缓存。
- 开发者红利:你可以放心地在函数里编写简单的、符合直觉的点查逻辑,BlockX 会帮你实现“一次网络请求,全域节点共享”,在保护上游节点的同时大幅度提升吞吐量。
2. 函数的使用范围
在 Chaintable 中,不论是数据索引还是数据应用,你的主要工作都是编写计算函数一项。根据产品开发阶段的不同,同一个 Function 可以无缝部署在三个完全不同的场景中执行,且保证逻辑语义的绝对对齐(Deterministic Execution):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 缓存。