抵达点上的三个问题,三个回答
本文引证来源 · breakout 提案:0010 帖,10 月 21 日(Sean Mann, RP1) · 我们的三个问题:0042 帖,10 月 27 日 · 规范:draft-li-rttp-iqa-addressing(datatracker) · 信道频谱:iqa.org/scenarios · 规范页:rttp.com/URI/ · iqa.org/URI/ · 已发布包(计数于 11 月 2 日在隔离安装环境实测):rttp 1.3.1(PyPI) · iqa-org 1.3.1(PyPI) · 注册表:rttp,CRI 27 · iqa,CRI 28 · 姊妹柱:RTTP(rttp://)· IQA(iqa://)
10 月 21 日,Sean Mann(RP1)在墙上发起了 TPAC 都柏林空间计算、数字孪生、物理 AI 与机器人 breakout 的提案。真正吸引我们注意的并不是关于浏览器的那句话,而是这一句——0010 帖原文逐字引用:「Reaching them takes spatial browsing. A device would find what's published at a location as a person or robot arrives, without anyone typing a URL, and combine content from many independent publishers into one 3D scene.」(抵达它们需要空间浏览。设备应当在人或机器人抵达时发现某地点发布了什么,无需任何人键入网址,并把许多独立发布者的内容合成为一个三维场景。)
10 月 27 日,我们用三个问题回应——0042 帖:给地点锚定服务命名、抵达点上的新鲜度、把孪生体绑定到它的建筑——原话是「all asked from the arriving device's point of view」(全部站在抵达设备的视角发问)。会议于 10 月 28 日召开,纪要尚未上墙。我们不等它,也不用预测去填沉默:问题是我们提的,而我们维护的这套栈,对其中每一个都已经在跑一个成型的答案。下面,每个问题都按我们回答一切的唯一方式回答——指向一个机制、规范中的一节、以及任何人都能离线重算的一次计算。
先把两个名字一次说全。RTTP(rttp://)柱是 Resonant Time Transfer Protocol:它回答哪里与何时。IQA(iqa://)柱是 Identity Quality Assurance:它回答是否。两个 scheme 在 draft-li-rttp-iqa-addressing(revision 2,11 月 1 日发布)中一并规范,并已临时注册为 CRI 27 与 CRI 28。
一 —— 名字是算出来的,不是签发出来的
问题一(0042 帖,逐字引用) · 墙上原文
“What is the intended name space for location-anchored services — names issued by a registry (DNS- or DID-style), or names that can be derived from the publisher or the content itself, so that discovery keeps working when no registry is reachable from the arrival point?”(地点锚定服务的命名空间是什么——是由注册表签发的名字(DNS 式或 DID 式),还是可以从发布者或内容本身派生的名字,使得当抵达点够不到任何注册表时,发现依然工作?)
我们的答案就是我们自己问题的后半句:派生。rttp 地址形如 rttp://<intent>.<pillar>.<root>[/<action>],它的路由成分不存储在任何地方——它是算出来的:ROUTE_SHARD = SHA-256(ASCII(canonical_authority))[0:16](I-D 第 4.4 节)。这个名字存在,仅仅因为发布者的 canonical authority 存在,此外别无理由。没有签发,也就没有可在命名层失效、过期或被撤销的东西。
I-D 在保留测试名上带了一个可复算的实例:权威 f3b2a1c4.pillar.example 得出 ROUTE_SHARD = 557c8154d3780cb78cc5fa1bd72b331c。任何一方——发送方、接收方、没有网络的审计员——用同一个字符串加一个哈希函数,别的不用,就能重算出同样的十六个字节。这正是问题所要的性质:抵达点够不到注册表时,发现照常工作,因为命名这一步从头到尾不联系任何注册表。
而且这套设计不只是「不查询」——客户端规则明令禁止查询,这样任何合规实现都无法悄悄把依赖重新引入。I-D 第 4.5.4 节逐字引用:「A client MUST NOT perform a lookup in order to use an rttp or iqa URI: no DNS query, no registry query, and no fetch of any resource named or implied by the URI. Use of either scheme is a local computation; there is no resolver to poison and no registration to hijack.」(客户端 MUST NOT 为了使用 rttp 或 iqa URI 而执行任何查询:不发 DNS 查询、不发注册表查询、不抓取 URI 命名或隐含的任何资源。使用两种 scheme 都是一次本地计算;没有可被投毒的解析器,也没有可被劫持的注册。)
抵达点恰恰是签发型名字最弱的地方。厂房地下室、灾害现场、门禁围栏——这些地方 DNS 树够不着,DID 解析是晴天功能。派生名字在网络消失时不会「优雅降级」;它从来就不需要网络。注册表模型的最弱点与派生模型的最强点,是同一个点。
二 —— 字节自带时钟
问题二(0042 帖,逐字引用) · 墙上原文
“Does the session's model assume online verification at discovery time, or can published claims carry their own locally checkable time boundaries — an issue time, a validity window, or a standing lease — so that a device can judge how old what it found is, offline?”(会议的模型是假设发现时在线验证,还是允许已发布的声称携带自身可本地校验的时间边界——签发时刻、有效期窗口、或常设租约——使设备能离线判断它找到的东西有多旧?)
我们的答案:第三个选项,而且是构造使然——不是钉在载荷上的签发时刻,而是验证答案自身的一个字段。I-D 第 6.1 节逐字引用:「Every attestation answer produced under the iqa scheme carries its freshness window in-band: the answer states the instant until which it may be relied on, in a field of the answer itself (the lease_expiry field of Section 7.2), not in a cache header, a lookup result, or an out-of-band agreement.」(iqa scheme 下产生的每一份 attestation 答案都把新鲜度窗口带在带内:答案自身的一个字段(第 7.2 节的 lease_expiry 字段)声明它可被信赖到的时刻,而不是写在缓存头、查询结果或带外协议里。)
消费这个字段的校验刻意是本地的。第 6.1 节继续逐字引用:「A verifier checks the stated expiry against its own clock. The check is local and offline: no network call is involved in deciding whether an answer is fresh.」(验证方用自己的时钟核对所声明的到期时刻。校验是本地且离线的:判定一份答案是否新鲜不涉及任何网络调用。)过期的租约必须按过期处理;验证方不得延长、续期或重新解释它,除非取得一份新答案。这套流程没有任何一步需要连接——而这正是地下室里的设备最缺的东西。
窗口短,是设计使然:现行部署用 120 秒,运营方可配置其他长度。I-D 对这个数字的用途说得很明白:它「constrains the verifier's honesty, not the speed of any channel」(约束的是验证方的诚实,而不是任何信道的速度)。一台接受超过租约的旧声明的设备,是在主张自己并不知道自己主张的东西——租约的存在,就是让它无法悄悄这样做。
而抵达点面对的不是一种网络条件,是一段频谱,租约设计刻意横跨这段频谱。三种模式,逐字引用自 iqa.org/scenarios:live lease(活租约)——「120 s window · reject on skew」——用于分钟级信道;lease residual(租约残留)——「last known lease · age stated in the bytes」——用于存储转发;archival(归档)——「no freshness check · seal fully verifiable」——用于印刷、携带与存档的记录。频谱中段的设计句是我们一再引用的那句:「The satellite is a courier, not a network. The 120 s window is not expected to hold; the bytes say how old the claim is.」(卫星是信使,不是网络。120 秒窗口不指望守得住;字节自己说这份声称有多旧。)
三 —— 绑定是随身携带的,不是查出来的
问题三(0042 帖,逐字引用) · 墙上原文
“What establishes that binding, and what lets the arriving party verify it on its own — a registry lookup, or an attestation the publisher carries and the arrival can check without contacting anyone?”(是什么确立这种绑定,又是什么让抵达方能自行验证它——是一次注册表查询,还是发布者随身携带、抵达方无需联系任何人即可核验的 attestation?)
我们的答案:发布者随身携带的 attestation。I-D 第 7.2 节规定的 attestation 信封是 128 字节、固定偏移:magic 值与版本、租约到期时刻、十六字节分片、attestation 值、具名的 organ、一字节的 standing 值、以及覆盖整帧计算的 HMAC-SHA-256。读它只需要一个哈希函数和一张固定的偏移表;里面没有任何解析器。
抵达方在联系任何人之前就能自行核验的,分三层。第一层,分片——离线:信封里的 shard 必须等于从发布者所声称的权威派生出的 route shard,与地址的派生是同样的十六字节。一个没有绑定到发布者声称之权威的孪生体,会在本地计算中过不了这一关——任何信任问题还没来得及出场,它就先出局了。第二层,结构与时钟——离线:固定偏移意味着租约到期时刻可以被读出并对照本地时钟判定,与问题二完全一样;第二答的机制作用在第三答的工件上。第三层,裁决——organ 的事务:信封具名担保的 organ,而掂量这个名字正是验证答案的用途所在——在使用时刻评估(第 6.3 节),网络缺席时沿问题二的模式频谱降级,永不静默上浮。
当一次校验无法完成时,设计 fail closed,词汇表由 I-D 固定为五个拒绝原因的闭集,优先顺序是定义的一部分。抵达点最需要的那一个是 authority_not_determined,I-D 自己的原话分毫不差:「An unreachable source is refused under this value, never read as assent.」(不可达的源按此值拒绝,绝不读作同意。)网络沉默不等于世界同意——对一个站在建筑面前的机器人来说,这一句话就是「设计好的行为」与「事故报告」之间的距离。
最后是我们自己纪律里的一条提醒,因为这三个问题恰恰在邀请它:地址是哪里,不是什么——也不是何时。派生不是身份。哈希命名那个地方;信封为那份声称担保;绑定活在第二列随身携带的字节里,从来不在假装成证明的第一列里。只靠名字对得上就绑定的孪生体,等于什么都没绑定。
这篇文章不是什么
它不是议程推销。三个问题是提供给会场 floor 的,至今对任何抵达点设计开放;会议的模型也许有它自己的好答案,等纪要上墙我们会饶有兴致地读——0042 帖原话就是这么说的,现在依然作数。公开回答自己提的问题,不是替代讨论;它是让讨论从机制出发、而不是从词汇出发的前提。
它也不是没有凭据的主张。规范是公开的:revision 2,四十页,Independent Submission 流。规范文法与 standing 语义已发布并封存于 rttp.com/URI/ 与 iqa.org/URI/。模式频谱在 iqa.org/scenarios。已发布包的自检计数是我们本周从 PyPI 隔离安装实测的:rttp 1.3.1,83 of 83;iqa-org 1.3.1,111 of 111。
都柏林的 floor 开了一个小时;网上的 floor 永不关门。三个问题留在了抵达点上,而三个回答已经在那里跑着:一个算出来而非签发出来的名字、一个把时钟带在答案本身字节里的租约、一个抵达方无需联系任何人即可验证的绑定。问题属于那场会议;回答属于每一个抵达者——而且每一个回答都可以在地下室里、没有网络、没有许可、从已经公开的字节里核验。