JavaScript 执行 Ethernity CLOUD 协议
安装
要从Ethernity Cloud Runner开始开发,您可以通过安装软件包来方便地设置环境 使用 npm :
$ npm install @ethernity-cloud/runner --save
此命令将安装 Ethernity Cloud Runner 软件包, 并保存为您的工程中的依赖性 。 与 软件包已安装,您准备开始使用Ethernity Cloud Runner功能并探索其能力 用于您的应用程序开发.
环境先决条件
1. IDE 数据交换
为了简化开发程序,我们建议使用Visual Studio代码——一个强大多能的代码编辑器 为开发者提供无缝体验. 您可以下载 Visual Studio 代码 正式 网站。 。 。 .
运行 IDE 后将创建一个新的工作空间,您可以在此开始开发框架和代码.
2. 框架
在 IDE 工作空间内使用终端, 遵循这些步骤来设置您选择的框架 .
节点.js: Node.js是一个开源的服务器侧JavaScript运行时环境,允许开发者执行JavaScript代码 在网页浏览器之外。 它使用一个事件驱动的,非阻塞的一/O模型,使其效率高并适合 建立可扩展和实时应用程序.
在本地机器上安装节点( C) 这里: 节点.js 下载。 。 。 .
3. 钱包设置
钱包是Ethernity Cloud生态系统中的一个关键工具,使用户能够安全储存和转移 用于处理的数据。 作为开发者,拥有Web3 dApp测试钱包是必要的.
带有 Metamask 的钱包设置进程很详细 这里: 开始使用 MetaMask。 。 。 .
Ethernity Cloud在多个网络上运行. 为您要使用的网络设置您的钱包( 请参看 网络 下面关于完整清单和链式标识的章节:
- Bloxberg(主网和测试网)
- 多边形(主网)和多边形(测试网)
- IoTeX测试网 Ethereum Sepolia和LitVM LiteForge (测试网)
4. 密码执行
要使用 Ethernity Cloud Runner 执行新的任务,遵循下面提供的直截了当的模板. 简单 将您想要的代码插入指定区域,运行者将处理其余的,与 IPFS 交互 网络和相应处理任务.
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.
// 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机身盖.
任务资源
const resources = { taskPrice: 10, cpu: 1, memory: 1, storage: 40, bandwidth: 1, duration: 1, validators: 1 };
这个 resources 参数是 第一个 参数 run python/Node.js模板。 它规定了在EthernityCloud网络上处理的任务所需的各种资源数量。 这个 resources 对象包含以下属性:
-
taskPrice:该任务的时薪最多的用户,以整节符(tETNY on Bloxberg)支付. 一个节点在它覆盖自己的价格加上网络增加的收费时按顺序排序:对于Ethernity来说是5%,对于验证器来说是2%,对于任务运行的两个图像的出版商收费(信任区模板是10%,除非其出版商设置另一个,而安全锁是0,除非其出版商设置一个),所以一个节点要求1个令牌从2个价格中取出并带有默认费用. -
cpu:这规定了任务所需的CPU(中央处理股)资源数量. 它表示执行任务代码所需的计算功率. -
memory:这表示任务执行所需的RAM内存量. 它代表了运行任务所需的RAM内存中的存储空间. -
storage: 此属性代表任务执行所需的存储空间 。 它表示任务所需的磁盘空间. -
bandwidth:这定义了任务执行所需的网络带宽量. 它代表着完成任务所需的数据传输能力. -
duration: 此选项指定任务执行的时间或允许的最大时间 。 它规定了任务可以持续多久的时限. -
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 腾讯网.
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 在钱包选项中:
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 提供, 并优先于 :
// 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。 。 。 .