@xyo-network/event-kit-cli
要求Node 26或更新版本;存储库固定在Node 26.9.0上。
安装的二进制文件在固定的XL1上组成公共Node握手客户机 网关会话,定稿语句图重播,并选定公开 datalake。
命令
event-kit publisher service publish|show|rotate-key|retire
event-kit publisher key show
event-kit publisher subscription show|challenge|accept
event-kit subscriber service show
event-kit subscriber subscription subscribe|show|revoke
event-kit publisher run --config publisher.json
发现命令需要 --publisher。精确的订阅发现和
发行商挑战/接受流程也需要独立 --subscriber 和
--subscription 选择器。读书不需要种子。
--replay-floor-block <n> 选择显式可信授权引导
边界和嵌入在持久重放标识。默认为genesis。
对于非零下限,必须设置第一个服务发布 validFromBlock
在那一层或之后;这种模式不要求完整的楼板前历史。
写要求 --seed-file <path> 和(可选) --account-index <n>。这个
种子文件必须是没有组或其他权限的常规非符号链接文件
位。发布者写入要求派生签名者为发布者声明
源;订阅者写入要求它是订阅者声明源。
生成的写入(service publish, service rotate-key, subscription subscribe)也要求 --operation-id <32-lowercase-hex>。生成新鲜
为每个新的逻辑突变随机操作ID,并在每次重试时保留它。
重复使用相同的ID与改变语义输入失败关闭;精确的重试
返回 intentDisposition: "resumed" 并重新发布或调和相同的内容
规范对象和签名的XL1事务。接受使用它的挑战
hash作为操作ID,而退役和撤销使用目标对象
散列,因此这些命令不接受单独的标志。
服务发布读取一个严格的公共JSON对象:
{
"deliveryMode": "durable",
"sources": [{ "kind": "xl1-finalized", "chainId": "<40 lowercase hex source chain ID>" }],
"maxPositionsPerWake": 32,
"maxSubscriptionLifetimeBlocks": 100000
}
订阅发布读取一个严格的、受权限限制的JSON对象。
这个 endpoint, audience, challengeSecret 参数加密
并且永远不会被CLI返回:
{
"deliveryMode": "durable",
"audience": "my-indexer",
"challengeSecret": "<32-byte unpadded base64url>",
"deploymentId": "my-indexer",
"endpoint": "https://subscriber.example/event-kit/wake",
"source": { "kind": "xl1-finalized", "chainId": "<40 lowercase hex source chain ID>" },
"fromPosition": 0,
"maxPositionsPerWake": 32,
"expiresAtBlock": 100000
}
publisher subscription challenge 验证/解密选定的最终文件
Tuple和durable开始了它唯一被允许的挑战尝试。它只打印
公共挑战和选择器散列:它不执行HTTP请求,也从不执行
打印解密后的目标。将挑战传达给订阅者
运营商选择的专用信道。 publisher subscription accept 然后
需要 --input <response.json> 包含端点证明的:
{
"schema": "network.xyo.event.wake.challenge.response",
"challenge": "<challenge object hash>",
"proof": "<32-byte unpadded base64url>"
}
网络与状态
使用 --network local|sequence|mainnet 选择读配置文件。写命令
委派到XL1发布边界。本地命令需要显式的
--chain-id; 序列和主网标识来自已发布的SDK。
--rpc-url 和 --datalake-url 替换端点,而不是链身份。每一个
在重播之前和之后,根据所选链检查会话。
主网络读取可用。主网络写被XL1边界拒绝
在CLI读取种子文件或构造签名者/数据写入器之前;有
没有旁路标志。 publisher run --network mainnet 只提供了
(d - 008). 它读取
要签名的种子醒来,不打开签名者、数据生成器或出版物,然后离开
对第7阶段宿主的挑战和接受。
--state-dir 默认为 ./event-kit-state。重播检查点、发布
日志、变异意图、发布者加密密钥保管和挑战
记录在选定的网络、精确链ID和发布者下被隔离
地址在私有SQLite权限。CLI拒绝遗留文件系统状态
而不是默默地放弃加密保管或发布恢复。
突变意图是不可变的私有记录。出版商服务/关键
intent保留生成的加密私钥用于恢复;订阅者
意图保留确切的授权和密文以及私有输入指纹,
从来没有端点或挑战秘密明文。保护并备份这个
目录作为秘密操作状态。
使用 --json 的机器可读结果
哈希、身份、最终块和生命周期证据。
居民运行时
publisher run --config publisher.json 现在合成持久SQLite状态,
D-005的发现/质疑/接受/撤销
有界HTTPS交付,以及环回健康探测。源合同支持定稿
XL1,最终确定了以太坊,完成了固定的UTC时间间隔。看到
常驻出版商手册 的配置,
握手命令,Vercel预览证书,
恢复后,剩下的凭据和资格大门。
有一个未版本化的有线合同。 --event-kind版本后缀模式;
和 maxBlocksPerWake 被拒绝;使用明确的源和源位置。
XL1接受高度确定授权资格,而
订阅的 fromPosition 确定源追赶从哪里开始。
准备尽最大努力
服务和订阅JSON要求 deliveryMode: "best-effort",匹配
bestEffort: {"refreshIntervalSeconds":30,"maxHintAgeSeconds":300,"maxAttempts":3}
和 maxPositionsPerWake: 1。本机现有的发布/订阅命令
继续使用 --input,需新鲜 --operation-id、固定网络和
私人 --seed-file; mode/policy是严格的JSON字段,而不是新的连接id。
使用新审查的授权投影,同时保留相同的 SQLite所有者/托管目录,所有握手命令支持:
--replay-namespace ces-best-effort-v2 --replay-floor-block <H+1>
--replay-start-anchor-block <H> --replay-start-anchor-hash <rootH>
本机读取器验证确切确定的H/rootH,在H处开始为空,然后读取
H+1的权威。新服务/密钥/授权/订阅/接受声明必须
使用新的服务ID和版本1,没有遗留的替代
链接或隐含的旧权威。对应的运行时配置字段为
authorizationReplayNamespace, authorizationFloorBlock,
authorizationStartAnchor: {"block":H,"hash":"rootH"}。保持发行商的身份;
种子、状态目录和历史密钥/检查点/意图不变。
尽力而为HTTP成功返回有界 admissionId, eventHash, wakeId,
acceptedAt, expiresAt; 它从不声称是持久的 receiptId。接收机源
验证和应用过程必须独立观察。