> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blockx.chaintable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 按区块计算

> 将 EVM trace 行转换为同一区块的派生记录。

处理已就绪的源区块，为目标表生成派生记录。本例筛选带有金额的 trace 行，并保留整数值。

## 链与区块上下文

本例将 `eth` 作为函数的链参数。同一个 `block` 对象选择源区块与目标写入上下文。如果增加 EVM 读取，应将 `block.id` 显式传给函数及其 `EVM` 实例。

## 前置条件

* 已连接的 block 部署及可读的 BlockDB 源数据。
* 源 schema 包含 `id`、`tx_id`、`from_addr`、`to_addr` 和十进制整数 `value`。
* 目标表具有兼容列，其中 `value` 能保持整数精度。
* 从源通知或应用输入就绪流程取得的 BlockDB `Block` 对象。

## 提交区块计算

```python theme={null}
from blockx import (
    SOURCE_ROW, BlockTableCallConfig, BlockTableWriteHandler,
    Function, TaskBuilder,
)

source_code = """
def _(chain_id, record):
    value = int(record.get("value") or 0)
    if value <= 0 or not record.get("tx_id"):
        return None
    return {
        "id": record["id"],
        "chain_id": chain_id,
        "tx_id": record["tx_id"],
        "from_addr": record["from_addr"],
        "to_addr": record["to_addr"],
        "value": value,
    }
"""


def submit_block(block, source_table, target_table):
    task = TaskBuilder.build(
        BlockTableCallConfig(block=block, triggerSources=[{
            "table": source_table,
            "func": Function(source_code=source_code),
            "params": ["eth", SOURCE_ROW],
        }]),
        BlockTableWriteHandler(targetTable=target_table, block=block),
    )
    result = task.submit(timeout=120)
    if not result.task_result.success:
        raise RuntimeError(result.task_result.failure_code)
    return task.task_id, result.handler_result
```

使用已就绪区块、源表名与目标表名调用 `submit_block`。调用方判断依赖何时可读，将就绪检查放在函数执行之外。

## 选择普通表输出

如果结果应写入不带区块写入上下文的按键表，将 handler 替换为 `NormalTableWriteHandler(targetTable=target_table)`。函数仍需接收计算所需的上下文。见[配置参考](/zh/reference/task-configuration)。

需要条件更新时，选择目标 schema 中可比较的列。遇到相同 `id` 的已有行时，此 handler 保留较大的 `value`：

```python theme={null}
from blockx import NormalTableWriteHandler


def increasing_value_handler(target_table):
    return NormalTableWriteHandler(
        targetTable=target_table,
        condition=("value", "UpdateIfLarger"),
    )
```

将 `increasing_value_handler(target_table)` 作为第二个参数传给 `TaskBuilder.build`。改用 `UpdateIfSmaller` 可保留较小值。等价字典写法是 `condition={"column": "value", "policy": "UpdateIfLarger"}`。条件列不能是 `id`；省略 `condition` 时执行无条件 upsert。条件 upsert 不保证整个任务及其其他副作用幂等。

## 确认完成

记录任务标识、源区块、目标表与 Writer 结果。区块写入异步提交。下游计算前，先确认目标区块的存储完成与读取条件；见[执行语义](/zh/concepts/execution-semantics)。

## 处理失败

* 重新计算前，先修正缺失的源字段或目标列。
* 将 `PLUGIN_FAILED` 与函数失败分别排查。
* 提交后连接结束时，先查询原任务和写入状态，再决定是否创建新工作。

## 继续阅读

* [回填历史 bundle](/zh/guides/bundle-backfill)
* [编写 EVM 数据函数](/zh/guides/write-functions)
* [查询结果与处理失败](/zh/guides/results-and-failures)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.