NIP-45 定义了客户端如何请求中继统计符合过滤条件的事件数量,而无需传输匹配的事件本身。它复用 NIP-01 的过滤语法,因此客户端通常可以用相同的过滤条件将现有的 REQ 转换为 COUNT 请求。

工作原理

客户端发送带有订阅 ID 和过滤条件的 COUNT 请求:

["COUNT", "<subscription_id>", {"kinds": [7], "#e": ["<event_id>"]}]

中继返回计数结果:

["COUNT", "<subscription_id>", {"count": 238}]

这避免了仅为显示一个数字而下载数百或数千个事件。如果客户端在一个 COUNT 请求中发送多个过滤条件,中继会将它们聚合为单个结果,就像多个 REQ 过滤条件进行 OR 合并一样。

HyperLogLog 近似计数

截至 2026 年 2 月,NIP-45 支持 HyperLogLog(HLL)近似计数(PR #1561)。中继可以将结果标记为近似值,对于跨中继去重,它们可以在计数旁返回 256 个 HLL 寄存器:

["COUNT", "<subscription_id>", {"count": 4527, "hll": "<512-char hex string>"}]

HLL 解决了一个根本问题:跨多个中继统计不同事件的数量。如果中继 A 报告 50 个反应,中继 B 报告 40 个,总数并不是 90,因为许多事件同时存在于两个中继上。客户端通过取每个寄存器位置的最大值来合并 HLL 值,从而获得全网范围的估算,而无需下载原始事件。

规范将寄存器数量固定为 256 以确保互操作性。这使载荷保持较小,并使中继端缓存变得可行,因为每个中继对相同的合格过滤条件计算出相同的寄存器布局。

互操作说明

HLL 仅适用于带有标签属性的过滤条件,因为用于构建寄存器的偏移量来源于过滤条件中第一个标记值。规范还列出了一小组典型查询,包括反应、转发、引用、回复、评论和关注者计数。这些是中继最容易预计算或缓存的计数类型。

重要意义

关注者计数、反应计数和回复计数是主要用例。没有 NIP-45,客户端要么必须信任单个中继的本地视图,要么下载所有匹配的事件并在本地去重。NIP-45 将计数保留在中继内部,HLL 使多中继计数变得可行,而无需将某个中继变成权威来源。


主要来源:

提及于:

另请参阅: