# @ethernity-cloud/runner 中文文档

规范地址：https://npmcn.com/package/%40ethernity-cloud/runner/

版本：0\.6\.27
npm 元数据更新时间：2026-11-06T19:20:25.736Z
中文译文更新时间：2026-11-14T06:42:04.474Z
软件包许可：AGPL-3\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40ethernity-cloud/runner
原文对照：https://npmcn.com/package/%40ethernity-cloud/runner/?lang=original
项目主页：https://github.com/ethernity-cloud/ethernity-cloud-runner-js#readme
源码仓库：https://github.com/ethernity-cloud/ethernity-cloud-runner-js

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：363 kB，28 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- 运行依赖：10 个
- 首次发布：2023-08-02T09:26:29.272Z
- 最新版本发布：2026-11-06T19:20:25.554Z
- 近 30 天下载量：2229（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：67（近 12 个月 40 个）

## 中文简介

星云运行器

## 安装

```sh
npm install @ethernity-cloud/runner
```

也可以使用：`pnpm add @ethernity-cloud/runner`、`yarn add @ethernity-cloud/runner`、`bun add @ethernity-cloud/runner`

## README

[![Ethernity Cloud logo](https://ethernity.cloud/images/dark_gradient_logo.svg)](https://ethernity.cloud/ "Ethernity Cloud")

### JavaScript 执行 Ethernity CLOUD 协议

### 安装

要从Ethernity Cloud Runner开始开发,您可以通过安装软件包来方便地设置环境 使用 npm :

```console
$ npm install @ethernity-cloud/runner --save
```

此命令将安装 Ethernity Cloud Runner 软件包, 并保存为您的工程中的依赖性 。 与 软件包已安装,您准备开始使用Ethernity Cloud Runner功能并探索其能力 用于您的应用程序开发.

### 环境先决条件

#### 1\. IDE 数据交换

为了简化开发程序,我们建议使用Visual Studio代码——一个强大多能的代码编辑器 为开发者提供无缝体验. 您可以下载 Visual Studio 代码 正式 [网站](https://code.visualstudio.com/)。 。 。 .

运行 IDE 后将创建一个新的工作空间,您可以在此开始开发框架和代码.

#### 2\. 框架

在 IDE 工作空间内使用终端, 遵循这些步骤来设置您选择的框架 .

**节点.js:** Node.js是一个开源的服务器侧JavaScript运行时环境,允许开发者执行JavaScript代码 在网页浏览器之外。 它使用一个事件驱动的,非阻塞的一/O模型,使其效率高并适合 建立可扩展和实时应用程序.

在本地机器上安装节点( C) 这里: [节点.js 下载](https://nodejs.dev/en/download/)。 。 。 .

#### 3\. 钱包设置

钱包是Ethernity Cloud生态系统中的一个关键工具,使用户能够安全储存和转移 用于处理的数据。 作为开发者,拥有Web3 dApp测试钱包是必要的.

带有 Metamask 的钱包设置进程很详细 这里: [开始使用 MetaMask](https://support.metamask.io/hc/en-us/articles/360015489531-Getting-started-with-MetaMask)。 。 。 .

Ethernity Cloud在多个网络上运行. 为您要使用的网络设置您的钱包( 请参看 **网络** 下面关于完整清单和链式标识的章节:

-   Bloxberg(主网和测试网)
-   多边形(主网)和多边形(测试网)
-   IoTeX测试网 Ethereum Sepolia和LitVM LiteForge (测试网)

### 4\. 密码执行

要使用 Ethernity Cloud Runner 执行新的任务,遵循下面提供的直截了当的模板. 简单 将您想要的代码插入指定区域,运行者将处理其余的,与 IPFS 交互 网络和相应处理任务.

```javascript
import EthernityCloudRunner from "@ethernity-cloud/runner";
import { ECRunner, ECStatus, ECAddress } from "@ethernity-cloud/runner/enums";

const executeTask = async () => {
    const code = `___etny_result___("Hello, World!")`;

    // Progress updates (encrypting, submitting, matching, downloading, ...).
    const onProgress = (e) => {
        console.log(`[${e.detail.progress}] ${e.detail.message}`);
    };

    // Fired once the task completes; fetch the result from the runner.
    const onSuccess = async () => {
        const result = await runner.getResult();
        console.log(`Task Result: ${result}`);
    };

    const onError = (e) => {
        console.error(e.detail.message);
    };

    // No network address -> Bloxberg testnet + the browser wallet.
    // To target another network pass its token address, e.g.
    //   new EthernityCloudRunner(ECAddress.POLYGON.TESTNET_ADDRESS);
    const runner = new EthernityCloudRunner();
    // On the Bloxberg testnet the task's artefacts are delivered through the
    // bootnode's payload intake: no storage call is needed. Every other network
    // needs your own Kubo RPC API, which also replaces the intake here:
    //   runner.initializeStorage('http://127.0.0.1:5001');

    // Events are dispatched named by task status (the ECStatus values).
    runner.addEventListener(ECStatus.DEFAULT, onProgress); // "Running" updates
    runner.addEventListener(ECStatus.SUCCESS, onSuccess);
    runner.addEventListener(ECStatus.ERROR, onError);

    const resources = { taskPrice: 10, cpu: 1, memory: 1, storage: 40, bandwidth: 1, duration: 1, validators: 1 };
    // Execute a task with the Python testnet enclave on Bloxberg.
    // Signature: run(resources, secureLockEnclave, code, nodeAddress = '', trustedZoneEnclave)
    await runner.run(resources, ECRunner.BLOXBERG.PYNITHY_RUNNER_TESTNET, code);
}

await executeTask();
```

### 选择信任区

`run()` 财务报告和审定财务报表 `runSession()` 带 `trustedZoneEnclave`安全锁是用来对抗的 它默认一个 `setNetwork()` 选择,否则网络的 pynithy 信任区(`etny-pynithy-testnet` 在 Bloxberg 测试网上; 一个Nodenithy dApp 通过 `etny-nodenithy-testnet`。 。 。 .

发布无 CAS 的安全锁(`<project>-unsafe`运行在一个 `-unsafe` 网络,您选择的名称 `await runner.setNetwork('BLOXBERG', 'TESTNET_UNSAFE')` (或 `('LITVM', 'TESTNET_UNSAFE')`) (中文(简体) ). 一个 `-unsafe` 网络有它命名的网络的链和合同;其信任区是 `etny-pynithy-testnet-unsafe` (单位:千美元)`ecld-pynithy-litvm-testnet-unsafe` 在立特弗姆上,还有一张Nodenithy dApp通行证 `ECRunner.BLOXBERG.NODENITHY_RUNNER_TESTNET_UNSAFE`跑者运行一个 `-unsafe` 仅信任区在一个 `-unsafe` 所以在没有CAS的情况下运行的任务 在网络中总是这么说.

跑者只接受交易结果 飞地是 `_addResultToOrder` 对于此命令, 发送到此网络的协议合同, 并签名用于此链条, 其签名者是来自任务挑战的钱包 。 任务代码37、39和40(`OPERATOR_FAULT_CODES`)是验证器退款的节点-侧断层;跑取者重新提出新的请求.

### `___etny_result___` 函数

这个 `___etny_result___` 函数是Ethernity Cloud Runner任务中使用的特殊函数。 执行任务时, 此 函数允许任务代码从 Ethernity Cloud 平台将结果发回.

在"Ethernity Cloud Runner"的背景下,任务以分散和分布的方式执行. 这个 `___etny_result___` 函数作为任务代码和Ethernity Cloud平台之间的通信渠道. 当函数被调用结果数据作为其参数时,它会将结果发回平台,在那里它可以 处理和储存.

这一特殊职能在确保适当记录已执行任务的成果方面发挥着关键作用 无障碍。 它能够与Ethernity Cloud平台进行无缝互动,使其成为该平台的关键组成部分 Ethernity Cloud Runner)的功能.

### 订阅活动

跑道延伸 `EventTarget` 并且作为一个任务 贯穿其生命周期,派遣 `CustomEvent`编号 **以任务状态命名**因此,您使用 `ECStatus` 值,不是单独的事件名称 enum :

| 事件名称( E)`ECStatus`(中文(简体) ) | 数值 | 当它起火时 |
| --- | --- | --- |
| `ECStatus.DEFAULT` | `"Running"` | 任务加密时进度更新, 正在提交, 匹配, 处理, 并下载结果 . |
| `ECStatus.SUCCESS` | `"Success"` | 任务成功完成,并有结果. |
| `ECStatus.ERROR` | `"Error"` | 任务失败( 例如没有匹配节点, 余额不足, 校验和错误) . |

每个事件 `detail` 实值 `{ message, status, progress }`数字 :

-   `message` ——为当前步骤的人类可读信息.
-   `status` - 那个 `ECStatus` 值(与事件名称相同).
-   `progress` 相位标签从 `ECEvent` (例如:. `"Encrypting task"`, (中文(简体) ), `"In Progress"`, (中文(简体) ), `"Downloading result"`, (中文(简体) ), `"Finished"`),用于推动进度UI.

```javascript
// Progress: use e.detail.progress for the phase and e.detail.message for detail.
const onProgress = (e) => {
    console.log(`[${e.detail.progress}] ${e.detail.message}`);
};

// Success: the result is available on the runner once this fires.
const onSuccess = async () => {
    const result = await runner.getResult();
    console.log(`Task Result: ${result}`);
};

// Error: something went wrong; e.detail.message explains what.
const onError = (e) => {
    console.error(e.detail.message);
};

runner.addEventListener(ECStatus.DEFAULT, onProgress);
runner.addEventListener(ECStatus.SUCCESS, onSuccess);
runner.addEventListener(ECStatus.ERROR, onError);
```

之后 `ECStatus.SUCCESS`电话 `await runner.getResult()` 以获取已解密的任务结果.

飞地报告的任务有非零任务代码,例如 `BASE_EXCEPTION` 对于 dApp 中提出的例外,结尾为 `ECStatus.ERROR`数字 : `runner.getLastError()` 命名代码, `runner.getResultTaskCode()` 返回时 `{ code, name }`,以及 `await runner.getResult()` 仍然返回结果,其值是飞地的错误报告(例外,它的回溯).

### 输入数据集

`run(resources, secureLockEnclave, code, nodeAddress, trustedZoneEnclave, { inputData })` 向任务发送字符串作为输入数据集,在有效载荷中读取为 `___etny_data_set___` (单位:千美元)`ecld.input`) (中文(简体) ). 它被加密为被信任区,并像代码一样被存储,请求带有它的sha256,被信任区在安全锁接收之前进行验证. 交互式会议通过下列方式吸收其投入: `sendInput` 换句话说.

每个动画(挑战、代码、输入)都作为IPFS节点存储,其默认设置存储一个添加到的文件 `--cid-version=1 --raw-leaves`:以256 KiB为块,按原样为一块,多在UnixFS树下. 跑者计算出CID本身,所以任何尺寸的活体在上传前在请求中被命名,而靴子的载荷摄入量将达到其100米B机身盖.

### 任务资源

```javascript
 const resources = { taskPrice: 10, cpu: 1, memory: 1, storage: 40, bandwidth: 1, duration: 1, validators: 1 };
```

这个 `resources` 参数是 **第一个** 参数 `run` python/Node.js模板。 它规定了在EthernityCloud网络上处理的任务所需的各种资源数量。 这个 `resources` 对象包含以下属性:

1.  `taskPrice`:该任务的时薪最多的用户,以整节符(tETNY on Bloxberg)支付. 一个节点在它覆盖自己的价格加上网络增加的收费时按顺序排序:对于Ethernity来说是5%,对于验证器来说是2%,对于任务运行的两个图像的出版商收费(信任区模板是10%,除非其出版商设置另一个,而安全锁是0,除非其出版商设置一个),所以一个节点要求1个令牌从2个价格中取出并带有默认费用.
    
2.  `cpu`:这规定了任务所需的CPU(中央处理股)资源数量. 它表示执行任务代码所需的计算功率.
    
3.  `memory`:这表示任务执行所需的RAM内存量. 它代表了运行任务所需的RAM内存中的存储空间.
    
4.  `storage`: 此属性代表任务执行所需的存储空间 。 它表示任务所需的磁盘空间.
    
5.  `bandwidth`:这定义了任务执行所需的网络带宽量. 它代表着完成任务所需的数据传输能力.
    
6.  `duration`: 此选项指定任务执行的时间或允许的最大时间 。 它规定了任务可以持续多久的时限.
    
7.  `validators`: 此属性决定任务所需的验证器数量 。 验证器是负责处理和验证任务的网络上的节点.
    

提供这些资源需求 `resources` 对象,任务执行引擎(Ethernity CloudRunner)可以使用此信息来分配必要的资源,并在选定的网络上相应处理任务.

当节点在内部对请求发出命令时 `options.orderWaitSeconds` (第六个论点是: `run`,默认 1800),运行者取消请求,请求返回其代管,任务失败 `ECError.NO_NODE`。如果一个节点在取消之前就已经预订了请求,则取消被合同拒绝,任务也随之继续进行.

### 网络

网络的选择是通过传递网络的象征性合同地址(来自 `ECAddress`作为建筑师的第一个论据。 没有争论, 跑者的目标 **布洛斯贝格测试网**。 。 。 .

| 网络 | 类型 | 链式标识 | 构造地址 |
| --- | --- | --- | --- |
| 布洛斯贝格 | 主网 | 8995 (英语) | `ECAddress.BLOXBERG.MAINNET_ADDRESS` |
| 布洛斯贝格 | 测试网 | 8995 (英语) | `ECAddress.BLOXBERG.TESTNET_ADDRESS` |
| 多边形 | 主网 | 137国 | `ECAddress.POLYGON.MAINNET_ADDRESS` |
| 多边形 | 测试网 | 80002 (英语) | `ECAddress.POLYGON.TESTNET_ADDRESS` |
| 木卫一 | 测试网 | 第4690号 | `ECAddress.IOTEX.TESTNET_ADDRESS` |
| 伊特鲁姆·塞波利亚 | 测试网 | 11155111 (英语) | `ECAddress.SEPOLIA.TESTNET_ADDRESS` |
| 立特弗姆立特福尔格 | 测试网 | 4441 (韩语) | `ECAddress.LITVM.TESTNET_ADDRESS` |

有一个测试网,有一个乙醚-卡斯验证器集—— Bloxberg测试网,LitVM LiteForge和Ethereum Sepolia—— 分为两种。 表格的条目在一组证明的飞地上运行了安全锁,在它能够证明的站台(DCAP)上的节点上,该集像主网一样,完全验证了顺序. 每一个都是 `-unsafe` 网络,按名称选择 `await runner.setNetwork('BLOXBERG', 'TESTNET_UNSAFE')`, (中文(简体) ), `('LITVM', 'TESTNET_UNSAFE')` 或者说 `('SEPOLIA', 'TESTNET_UNSAFE')`:同样的链条和合同,对于硬件SGX平台,CAS无法证明(仅限EPID,SGX1);它的飞地是被调试的并自签于其测量的,因此一个结果证明了是哪个图像运行了,而不是一个飞地运行了它,验证者在没有挑战生成的标志检查的情况下判断这样的命令. 它的飞地是 `*_TESTNET_UNSAFE` 条目 `ECRunner` (参见"选择信任区". 主网没有 `-unsafe` 腾讯网.

```javascript
import { ECAddress, ECRunner } from "@ethernity-cloud/runner/enums";

// Run on Polygon Amoy
const runner = new EthernityCloudRunner(ECAddress.POLYGON.TESTNET_ADDRESS);
// ...
await runner.run(resources, ECRunner.POLYGON.PYNITHY_RUNNER_TESTNET, code);
```

这个 `ECRunner` 飞地-图像enum由网络键入,所以使用与您构建的跑者网络相匹配的条目(例如. `ECRunner.IOTEX.PYNITHY_RUNNER_TESTNET`) (中文(简体) ). 主网的变体 `_TESTNET` 后缀.

IoTeX和LitVM测试网共享一个单一的 ECLD 令牌地址,所以跑者从您的钱包/提供者读取链式ID以区分它们——自动使用浏览器钱包或被注入的 `provider`. Ethereum Sepolia有它自己的标志,所以跑者选择它的RPC(`https://ethereum-sepolia-rpc.publicnode.com`无 `rpcUrl`。在IoTeX和LitVM的原始-私钥路径上,通过链式ID作为 **第三届** 构造参数和一个 `rpcUrl` 在钱包选项中:

```javascript
const runner = new EthernityCloudRunner(
    ECAddress.IOTEX.TESTNET_ADDRESS,
    { privateKey: "0x…", rpcUrl: "https://babel-api.testnet.iotex.io" },
    4690 // IoTeX Testnet chain ID
);
```

在这次发布中,靴子的有效载荷摄入量为布洛克斯贝格测试网、Polygon Amoy、LitVM LiteForge和Ethereum Sepolia服务(每个都配有不安全的双胞胎)。 在表上的其他网络( Bloxberg 主网、 Polygon 主网和 IoTeX) 需要运行 `runner.initializeStorage(<your own Kubo RPC URL>)` 在此之前 `run()` (见 **存储和结果为**没有它 `run()` 在发送任何交易前失败, 并有错误 .

### 钱包选项

第二个构造器参数选择钱包 : `{ privateKey, rpcUrl }` 在网络的RPC(或 `rpcUrl`(三); `{ signer }` 和(或) `{ provider }` 使用您已经持有的钱包; 运行器使用浏览器钱包 `window.ethereum`。 。 。 . `encryptionPublicKey` (hex) 提供关键结果加密到钱包无法回答时 `eth_getEncryptionPublicKey`跑道是建立在乙醚六上 所以 `signer` 或者说 `provider` 您的通过必须是 ethers 6 对象; 单靠一个提供者, 跑者在第一次需要时会问它账户.

### 存储和结果为

一个任务的工艺品(加密的挑战和代码,以及会话输入)默认通过启动诺德的有效载荷摄入来交付:跑者在当地计算他们的CID,一旦DO请求链上,POST将字节到 `https://ipfs.ethernity.cloud/payload/<network>/<doRequestId>/<cid>`,这不需要任何标志。 摄入量为靴子的代理所运行的网络服务,跑道为Bloxberg测试网和LitVM LiteForge, 每一条都带有不安全的双胞胎:在所有其他网络上(Bloxberg主网、Polygon主网、Polygon Amoy、IoTeX和Seplia) `run()` 在发送任何交易之前失败, 直到配置了存储 。 在布洛斯伯格测试网, `runner.initializePublicIntake(baseUrl)` 在需要时,在另一个基址上明确选择接收.

`initializeStorage` 以 IPFS API 作为 URL 或 主机、 协议和端口, 通过您自己的 IPFS API 提供, 并优先于 :

```javascript
// Your own Kubo RPC API.
runner.initializeStorage('http://127.0.0.1:5001');
// The same, by host.
runner.initializeStorage('127.0.0.1', 'http', 5001);
// The public API, which answers add and pin with 403 without a writer token.
// The token is sent as given in the Authorization header of every request.
runner.initializeStorage('https://ipfs.ethernity.cloud', undefined, undefined, writerToken);
```

首先从配置的端点读取结果,然后从公共网关读取结果 `https://ipfs.io` 第二,无全权证书;每份请求在60秒后被放弃,在命令的最后期限(期限加15分钟,关闭后至少2分钟)之前重复宣读,然后报告为: `IPFS download result error`。 。 。 .

## 常见问题

### @ethernity-cloud/runner 是什么？

星云运行器

### 如何安装 @ethernity-cloud/runner？

在项目目录运行 npm install @ethernity-cloud/runner，或使用 pnpm add / yarn add / bun add。

### @ethernity-cloud/runner 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/ethernity-cloud\_\_runner 是否存在。

### @ethernity-cloud/runner 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @ethernity-cloud/runner 可以商用吗？

@ethernity-cloud/runner 使用 AGPL-3\.0 许可。最严格的 Copyleft：除分发外，通过网络向用户提供基于它的服务也需要开源对应源码。闭源 SaaS 使用前务必评估。以上为概括，不构成法律意见，请以许可原文为准。

### @ethernity-cloud/runner 的下载量有多少？

根据 npm 官方下载统计，@ethernity-cloud/runner 在 2026/10/14 – 2026/11/12 这 30 天内被下载 2,229 次，日均约 74 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @ethernity-cloud/runner 还在维护吗？

最新版本 0\.6\.27 发布于 2026/11/07（7 天前）；至今共发布 67 个版本，其中过去 12 个月发布了 40 个；首次发布于 2023/08/02。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

