职责与边界
Python Executor 在 CPython 宿主进程中运行用户函数。它接收 Worker 派发的函数执行工作,并通过宿主桥接路由挂起的后端操作。EVM 查询携带函数提供的链与区块。 编程流程见编写 EVM 数据函数。本页说明执行组件。代码位置
核心类型与接口
python/blockx_runtime/host.py 定义面向 Python 的宿主桥接。审计代码可用的能力名称维护在 python/blockx_audit/tables.py。
数据流 / 执行流程
- Worker 向 Executor 宿主派发函数及其参数。
- 运行时加载函数定义并调用入口。
- 状态读取与合约查询经
NodeRPCBridgeProvider传递链和请求参数。 - Worker IO 处理后端请求,宿主恢复计算。
- 函数返回输出,Worker 收集结果并交给选定 Writer Plugin。
函数加载与入口解析
ModuleRegistry 按摘要缓存编译后的源码,并维护每个任务的命名空间。它可以通过 host.fetch_source 获取缺失源码。释放任务时移除其命名空间;函数身份与版本选择见 Function Code View。
python/blockx_audit/tables.py 中的 resolve_entry_name 提供共用的选择规则。运行时将其应用于 entrySelector:
- 选择器的最后一段如果命中符合条件的顶层函数,就使用该函数。
- 否则使用
_,它可以是函数定义,也可以是指向顶层函数的别名。 - 否则按源码顺序使用第一个符合条件的公开顶层函数。
- 如果都不存在,则解析为
_,并在加载时报告缺少可调用入口。
__ 开头的名称或危险内建名称。公开函数回退规则跳过以 _ 开头的名称和危险内建名称。审计绑定检查会拒绝对已有 _ 定义重新绑定的别名。
返回值序列化
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。