AICENT.COM
← 返回中文博客

draft-li-rttp-iqa-addressing-01 新增了什么:信任租约、线格式与应答语义

2026-10-28 · RTTP · IQA
规范解读 · 第 14 篇 · 本文引证来源 · 精读对象(引文逐字): draft-li-rttp-iqa-addressing-01(全文) · 其所取代的前版: draft-li-rttp-iqa-addressing-00(全文) · 系列页: datatracker · 率先承载线格式的工作白皮书: iqa.org/whitepaper/ · 10 月 9 日的逐字节解剖: What fits in 128 bytes · 本文实测的版本发布史: iqa-org · rttp · §8.3 点名的一致性实验室: Agent-Authority-Conformance · 姊妹双柱: RTTP(rttp://,CRI 27)· IQA(iqa://,CRI 28)

2026 年 10 月 27 日,draft-li-rttp-iqa-addressing 的 -01 修订版进入 Independent Submission 队列。先看算术:34 页对 -00 的 16 页,1,937 行对 911 行——文档体量翻了一倍还多。但翻倍并非均匀分布,而它没有落在哪里的信息量更大:第 1 至 5 节——共享寻址模型、两个 scheme 的语法与客户端要求,也就是本系列前十三篇逐字精读的派生寻址核心——结构上一字未动。-01 新增的是三个全新顶层章节(信任租约、线格式、应答语义)、一个相关工作章节,以及一章从地基重建的安全考量。本文只依据一手文本,按顺序精读这些新增。

-00 → -01 · 什么动了,什么没动16 页 / 911 行(2026-09-24)→ 34 页 / 1937 行(2026-10-27)§1–§5 · 未动共享模型 · rttp 语法 · ROUTE_SHARD 派生 · iqa 语法 · 客户端规则§6 · 新增 · 信任租约与新鲜度lease_expiry 随字节携带 · 离线校验 · 缓存租约 vs 实时读取§7 · 新增 · 线格式PulseHeader128 + 扩展块 · AE-128 信封 · 测试向量 AE128-VECTOR-1§8 · 新增 · 应答语义五个拒绝值 · 优先序 · grant_ref · 观察时刻规则另有新增:§12 相关工作 · 安全考量重建(截断诚实账 · RFC 9846)章节清单由两版 IETF 档案文本 diff 而来;页数以 ISE 列表为准
图 1:修订版的解剖。派生寻址核心字节级稳定;增长全部来自三个承重新版块——租约、线格式、应答单——外加一张相关工作地图和一章重建的安全考量。

租约:新鲜度移入字节本身

第一个新增章节 §6「信任租约与新鲜度」,给 iqa 应答装上了时钟。规则很紧凑:每份 attestation 应答把自身的新鲜度窗口携带在应答本身之中——信封的 lease_expiry 字段——验证方拿它与自己的时钟比对,全程离线。没有缓存头,没有查询结果,没有带外约定。过期租约 MUST 拒绝;验证方 MUST NOT 延展、续期或重新解释一个过期租约,唯一的途径是获取新应答。新鲜度不再是信道的属性,而是字节的属性。

然后是那个数字,表述得异常审慎:“Current deployments use 120 seconds. The number constrains the verifier's honesty, not the speed of any channel: a verifier that accepts a statement older than its lease is asserting more than it knows.”(现行部署使用 120 秒。这个数字约束的是验证方的诚实,而非任何信道的速度:接受超过租期的陈旧陈述的验证方,是在断言它并不知道的更多。)运营者 MAY 配置其他窗口;机制不依赖这个值——草案刻意把 120 秒定位为部署观察,而非协议常量。

§6.2 命名了两种运行模式,命名本身就在做实事。缓存租约模式下,验证方依赖一份此前取得、租约未过期的应答——本地离线校验,草案明言这是该模式的设计要点,而非降级。但该模式不对「现在」做任何主张:要求现时观察的策略会以 authority_not_determined 拒绝;接受租约新鲜证据的策略可以放行,暴露面由租约本身兜底。实时 standing 读取模式下,验证方每次请求都咨询 organ,失败规则正是本系列此前引用过的那句:“an organ that cannot be reached is not read as silent consent.”(无法触达的 organ 不会被读作默许。)两种模式共享两条规范性底线——过期租约 MUST 拒绝;不可达的 organ MUST NOT 被读作肯定性 standing。

§6.3 收尾时顺便封住了自己的边界:存储转发与归档用途——在租约过期很久之后验证一份陈述、其年龄写在字节里而非比对窗口——不在本文档定义范围之内,且明确不构成矛盾:不做新鲜度主张的陈述,永远不会被新鲜度主张证伪。

线格式:两个 128 字节帧

第二个新增章节 §7「线格式」,是实现者会读得最细的一章,因为它是唯一可以直接执行的一章。两个定长帧,每个 scheme 一帧,都恰好 128 字节,都大端序,都 fail closed:接收方 MUST 拒绝任何长度不是 128、或魔数/版本不认识的帧。而一个设计决策居于正中:主体的派生地址以固定偏移出现在两个格式中,就是 §4.4 派生的那同一个 16 字节值。草案原话:“One subject has one derived address and two carriers.”(一个主体有一个派生地址、两个载体。)两个帧还把一次主张的 WHEN 拆开分携——脉冲声明它于何时发出(TIMESTAMP,绝对纳秒),应答声明它可靠到何时(lease_expiry)——草案把寓意直接写透:“the schemes' job is to make the where, the when, and the whether trustworthy and cheap.”(这套 scheme 的职责,是让 where、when 与 whether 可信且便宜。)

rttp 脉冲帧头(§7.1)是固定偏移的:RTTP 魔数、VERSION_ID 130、SEQUENCE_ID、TIMESTAMP、TTL 与优先级字节、ROUTE_SHARD、32 字节 AID_ORIGIN,以及一个 26 字节的扩展块。这个扩展块(§7.1.1)是全文档最务实的一段。它占用的是此前保留且全零的字节——不移动、不重定义任何既有字段,而且不递增 VERSION_ID——于是只读 0x00–0x65 偏移的旧实现照常通过验证。块内:一个 SPEC_REV 字节、一个 FLAGS 字节(当前唯一的比特是 URI_ANCHORED——跨节点转发的实现 MUST 要求它置位;未置位即分片不具备全局转发语义),以及承载开放动作 token 的 16 字节 ACTION 字段——拒绝规则全部 fail closed 写明,开放集保持开放:“enumerating an open set would close it,”(枚举一个开放集等于关闭它,)因此无法识别的动词 MUST 按未知安全性处理,绝不静默套用默认。

时间字段(§7.1.2)刻意收窄。TIMESTAMP 是自 Unix 纪元起的纳秒绝对计数,接收方用自己的时钟减去它便得到脉冲年龄——离线、仅凭字节:“a pulse states how old it is, whatever channel carried it.”(脉冲自陈其年龄,无论它经由何种信道。)但年龄不是 standing——接收方 MUST NOT 把它当作对主体有效性的陈述;脉冲的时刻只有对照应答的租约才与决策相关。TTL_PULSE 是限制转发的跳数计数,仅此而已。SEQUENCE_ID 为发送方自身的发射排序——无跨发送方含义,无全局排序。

iqa 信封(§7.2)承载应答:IQAE 魔数、版本、HMAC-SHA256 算法字节、lease_expiry、主体的 intent_shard、attestation、organ 标签、每判决唯一的 nonce,以及 standing 字节。standing 字节取四个值之一——0x00 ghost、0x01 probation、0x02 radiant、0x03 genesis——由本文档固定的闭集,语义被指回它该在的地方:“this document fixes only the wire encoding.”(本文档只固定线编码。)attestation 覆盖整帧、attestation 字段自身置零后计算——换掉的 organ 标签、翻转的判决、交换 standing 字节的重放帧,都活不过验证。验证流程四步,全部本地。然后是把散文变成物理的部分:§7.2.1 发布了AE128-VECTOR-1——一个完整的 128 字节帧:授权方 f3b2a1c4.pillar.example、分片 557c8154d3780cb78cc5fa1bd72b331c、连同 HMAC——任何实现 MUST 仅凭参数逐字节复现。自带测试向量的规范,关于歧义的争论已经提前打完。

§8.1 · 拒绝阶梯 · 首个命中即出null 拒绝 = 「许可」的唯一表示 · 不存在肯定性的 granted 值1 evidence_binding_mismatch证据绑定于另一授权或主体,与请求不符2 evidence_expired所呈证据的租约已过期3 authority_not_determined不可达来源在此被拒绝 · 绝不被读作默许4 authority_revoked主体的授权已被撤销5 operation_not_permitted主体或授权所禁止的其余一切闭集 · MUST NOT 越集发射 · MUST NOT 重新解释 · 无理由的应答不合规
图 2:§8.1 的拒绝阶梯。五个值、一条本身就是定义组成部分的优先序,以及一条纪律:不可达的授权来源以它自己的名字被拒绝,绝不折进实质性判决。

应答单:拒绝带名字,授权带回执

第三个新增章节 §8「Attestation 应答语义」,定义了每份应答携带的两个字段:拒绝原因与授权回执(grant reference)。拒绝原因从一个否定式起步:“A null refusal reason is the only representation of “permitted”; there is no affirmative “granted” value.”(null 拒绝原因是「许可」的唯一表示;不存在肯定性的「granted」值。)许可在租约之外不主张任何东西;只有拒绝才说话。五个拒绝值构成闭集,优先序本身就是定义的一部分——实现 MUST NOT 发射集合之外的值,MUST NOT 重新解释已发射的值——而报告了结果却没报理由的应答干脆不合规:理由正是让拒绝可审计的东西。

授权回执(§8.2)是收据面:每份应答——许可或拒绝——都要点名它所依赖的授权:授权标识符、证据标识符、签发与到期时刻,以及 observation_as_of_ms——应答所依赖的 standing 观察的 as-of 时刻,或 null。最后一个成员承载了全节最锋利的规则,瞄准的是给应答悄悄注水的最安静手法:“observation_as_of_ms is null whenever the observation the answer relied on is absent or not fresh, even if a later, successful observation is available at answer time.”(只要应答所依赖的观察缺席或不新鲜,observation_as_of_ms 就必须是 null,即便应答时刻有更晚的成功观察在手。)在所依赖证据过期之后做的诊断性读取不得回填该字段——“diagnostic reads do not participate in authorisation and do not renew evidence”(诊断读取不参与授权,也不续期证据)——草案用一句话说透原则:该成员记录的是“the age of what the answer actually relied on, not the freshness of the freshest thing the implementation happened to see.”(应答实际依赖之物的年龄,而非实现碰巧看到的最新鲜之物的鲜度。)

§8.3 随后为词表的出处贴上标签,标签精确:闭集及其优先序由本文档定义;该词表已经在 Linux Foundation Decentralized Trust 的 Agent-Authority-Conformance 实验室所记录的公开一致性运行中被实际行使——“the laboratory records runs and certifies nothing.”(实验室只记录运行,不为任何东西认证。)部署履历与规范性定义,分句存放。

这些都不是新的:线格式先于草案上线

进入安全考量一章之前,先做一处澄清——因为从最近几周的公开动态看过来的读者,很可能把这个修订版的方向完全读反。新章节里的任何东西,都不是最近从哪里学来的——而且诚实的记录比「滞后」更干净:-00 于 9 月 24 日提交时,AE-128 信封在已发布代码里还不存在,所以 -00 根本无从携带它。§7 的两半以不同深度上线。rttp 脉冲帧头——§7.1 的那个 128 字节帧——从一开始就是公开的:9 月 12 日的公开语义演示中它已按线格式逐字节在跑,VERSION_ID 130 一应俱全;并自 1.2.8 线起随 rttp 包发布(wheel 实测)。iqa attestation 信封——§7.2 的 128 字节 IQAE 帧、连同它的 HMAC 与租约——则随 iqa-org 1.3.1 发布,2026 年 10 月 4 日三注册表同发:比 -01 将其成典早二十三天。rttp 包自 1.2.8 线起随包自带离线自检:83 项检查、零网络调用,写稿当天刚复测过一遍。

公开记录始终追着代码跑,从不领先。10 月 4 日信封上线,五天后的 10 月 9 日,我们以《What fits in 128 bytes — trust you can re-verify offline》为题公开发表了对这个 128 字节帧的逐字节解剖。10 月 23 日,工作白皮书 v0.6 印出了与 -01 §7.2 如今承载的完全相同的十二字段布局与同一个测试向量 AE128-VECTOR-1;-01 落地的当天我们把两者逐字节比对,布局完全一致。草案没有从白皮书借来线格式,白皮书也没有从任何讨论借来——白皮书记录的,是包早已在做的事。

所以新章节的诚实时间线是:脉冲帧公开演示(9 月 12 日)、URI 双 scheme 成典(-00,9 月 24 日)、信封上线(10 月 4 日)、公开解剖(10 月 9 日)、工作白皮书(10 月 23 日)、成典(10 月 27 日)。-00 成典的是它提交那天已存在的东西;-01 成典的是现在存在的东西。一份规范在代码上线二十三天后才将其记录在案,这不是新颖性的自白,而是时滞的更正。

一致性这条线上的方向同样如此。贡献给实验室语料的租约-撤销向量,以及 §8.3 所引用的公开运行,行使的是这套实现早已在说的词表——实验室只记录运行、不为任何东西认证,而 §12 地图上的学习方向是从部署工件指向规范,从不从走廊指向代码。最近几周任何墙上的任何言论都没有教会我们这些字节;墙只是这些字节碰巧被公开地、独立地行使的地方。

诚实重述的安全考量——与新地图

安全考量一章(§9)重建了。开篇是现在明确对两个 scheme 同时适用的地基:无查询、无可投毒的解析器;无 userinfo、因此 URI 中无处藏密;未知动作动词携带未知安全性。然后补上 -00 从未有过的:截断诚实账。派生地址是 SHA-256 摘要的前 16 字节;该构造防御的是找到产生同一地址的第二个授权方——约 2128 次运算——而非抽象意义上的碰撞搜索:生日碰撞在约 264 处存在,且还需第二个独立方采纳那个碰撞标签。8-hex 展示形式被明确圈为展示便利:32 位空间的生日界在约 216 次采纳处到来,使它们不配作为唯一标识符。本章还首次点名传输层——帧可以骑 HTTP、TLS(引用 RFC 9846,TLS 1.3,2026 年 7 月)、QUIC 或 gRPC——不要求任何传输,也不排除任何传输。

新增的 §12「相关工作」画出了 -00 缺的那张地图。CWT 与 RATS 用丰富的声明词表和通用解析器栈解决便携 attestation——草案明言,需要丰富声明处,那些仍是正确的工具;信封以表达力换定长偏移的确定性,让只有 SHA-256 和一把钥匙的验证方零依赖完成验证。W3C AI Agent Protocol 社区组的三轴讨论获得致谢,同时被严格限界:本文档主张前两轴——证据新鲜度与授权有效性——并刻意不主张第三轴、动作时刻授权,那属于调用层。AAE 回答代理可以做什么,与两个 scheme 自然组合、互不依赖。APS 家族则被引用为一致性实验室租约-撤销-轴工作所构建其上的语料——并且注明,针对它的独立运行、包括作者本人的运行,均已公开。

这个修订版没有做什么

值得与新增写得一样清楚。-01 不主张动作时刻授权——它自己这么说了。它不定义四个 standing 值的含义、不定义主体如何在它们之间移动——它也自己说了,并指向参考规范。它不改任何 IANA 注册事实——两个 scheme 站在原位:provisional CRI 27 与 CRI 28。致谢部分开始感谢在公开运行中行使应答词表的独立实现者与评审者,本轮修订的评审者将随其报告到达而录入。前十三篇精读的核心——派生、语法、同意规则、fail-closed 默认——原封未动。这次修订是围着那个核心把文档加厚了一倍,而不是盖过它。

一句话:-01 让派生寻址核心字节级稳定,另加三个承重新版块——让新鲜度成为字节属性的租约、带字节级测试向量的两个 128 字节线格式、拒绝带名字与授权带回执的应答单——where、when 与 whether,从此可执行。

已封印 rttp://dfc0dfca.blog.aicent · iqa://dfc0dfca8e197983ba3f5e744a7b6fc5.forge.iqa · 密封记录