Skip to main content

职责与边界

Python Executor 在 CPython 宿主进程中运行用户函数。它接收 Worker 派发的函数执行工作,并通过宿主桥接路由挂起的后端操作。EVM 查询携带函数提供的链与区块。 编程流程见编写 EVM 数据函数。本页说明执行组件。

代码位置

核心类型与接口

python/blockx_runtime/host.py 定义面向 Python 的宿主桥接。审计代码可用的能力名称维护在 python/blockx_audit/tables.py。

数据流 / 执行流程

  1. Worker 向 Executor 宿主派发函数及其参数。
  2. 运行时加载函数定义并调用入口。
  3. 状态读取与合约查询经 NodeRPCBridgeProvider 传递链和请求参数。
  4. Worker IO 处理后端请求,宿主恢复计算。
  5. 函数返回输出,Worker 收集结果并交给选定 Writer Plugin。
函数的 EVM 对象提供读取上下文。任务的函数代码快照固定定义,与数据读取使用的区块相互独立。

函数加载与入口解析

ModuleRegistry 按摘要缓存编译后的源码,并维护每个任务的命名空间。它可以通过 host.fetch_source 获取缺失源码。释放任务时移除其命名空间;函数身份与版本选择见 Function Code View。 python/blockx_audit/tables.py 中的 resolve_entry_name 提供共用的选择规则。运行时将其应用于 entrySelector:
  1. 选择器的最后一段如果命中符合条件的顶层函数,就使用该函数。
  2. 否则使用 _,它可以是函数定义,也可以是指向顶层函数的别名。
  3. 否则按源码顺序使用第一个符合条件的公开顶层函数。
  4. 如果都不存在,则解析为 _,并在加载时报告缺少可调用入口。
命名入口规则不能选择以 __ 开头的名称或危险内建名称。公开函数回退规则跳过以 _ 开头的名称和危险内建名称。审计绑定检查会拒绝对已有 _ 定义重新绑定的别名。

返回值序列化

python/blockx_runtime/wire.py 先转换 Python 值,宿主再将其打包为值程序。Worker 将值程序转换为结果携带的 JSON。 计算过程中将 EVM uint256 值保留为 Python 整数。消费方也必须无精度损失地解码 JSON 整数。协议转换不会额外授予审计函数导入权限或能力。

状态与生命周期

Worker 管理 Executor 宿主进程及其连接。运行时初始化安装桥接并准备函数执行。函数源码加载和版本身份与 Function Code View 协作。

挂起与恢复不变量

原生宿主在一个解释器线程上驻留多个调用,每次运行一个协程。修改调度或桥接时,需要保持以下不变量: 调度器跟踪 CS_QUEUED、CS_RUNNABLE、CS_RUNNING、CS_WAIT_IO、CS_WAIT_FUNCTION_CODE、CS_WAIT_SUBCALL、CS_WAIT_SLEEP 和 CS_DONE。取消与截止时间由宿主调度器裁定,运行时编码对应终态。EVM 后端响应在既有调用上下文中恢复等待的函数。

配置

宿主嵌入 CPython 3.14 或更高版本。按照快速开始构建,并提供虚拟环境的包目录。

扩展点

通过运行时桥接和对应后端适配器增加函数可见能力。修改允许的函数接口时,同步更新审计能力表。验证链与区块上下文原样传递到后端请求。

测试

BlockX 仓库中的以下测试覆盖桥接集成、入口选择、模块命名空间及返回值转换,按需使用宿主替身:
宿主与进程测试还覆盖原生执行边界,共享环境准备位于 internal/testutil/pyhost.go。

相关文档

BlockX 仓库中的设计参考:docs/specs/function-code-python-whitelist.md。