# NIP11

## 中继信息文档

`draft` `optional` `author:scsibug` `author:doc-hex` `author:cameri`

中继可以向客户端提供服务器元数据，以向它们通知能力、管理联系人和各种服务器属性。这是通过 HTTP 以 JSON 文档的形式提供的，与中继的 WebSocket 在相同的 URI 上。

当中继接收到对支持 WebSocket 升级的 URI 具有 `Accept` 标头 `application/nostr+json` 的 HTTP（S）请求时，它们应该返回具有以下结构的文档。

```json
{
  "name": <string identifying relay>,
  "description": <string with detailed information>,
  "pubkey": <administrative contact pubkey>,
  "contact": <administrative alternate contact>,
  "supported_nips": <a list of NIP numbers supported by the relay>,
  "software": <string identifying relay software URL>,
  "version": <string version identifier>
}
```

任何字段都可以省略，并且客户端必须忽略它们不理解的任何其他字段。中继必须通过发送 `Access-Control-Allow-Origin`、 `Access-Control-Allow-Headers` 和 `Access-Control-Allow-Methods` 报头来接受 CORS 请求。

## 字段描述

### 姓名

中继可以选择 `name` 在客户端软件中使用。这是一个字符串，应少于 30 个字符以避免客户端截断。

### 描述

有关中继的详细纯文本信息可能包含在 `description` 字符串中。建议不要包含用于自动换行的标记、格式或换行符，只需使用两个换行符来分隔段落。对长度没有限制。

### PubKey##\#

管理联系人可能以 `pubkey` 与 NOSTR 事件相同的格式列出（公钥为 `secp256k1` 32 字节十六进制）。如果列出了联系人，这将为客户端提供一个建议的地址，以便向系统管理员发送加密的直接消息（请参阅 `NIP-04`）。此地址的预期用途是报告滥用或非法内容、提交错误报告或请求其他技术帮助。

中继运营商没有义务对直接消息作出回应。

### 联系人

也可以在 `contact` 字段下列出备用联系人，其目的与 `pubkey` 相同。最好使用 NOSTR 公钥和直接消息。此字段的内容应该是一个 URI，使用或 `https` 等 `mailto` 方案为用户提供联系方式。

### 支持的 NIP##\#

随着 NOSTR 协议的发展，某些功能可能只能由实现特定 `NIP`。该字段是在中继中实现的 s 的 `NIP` 整数标识符的数组。示例包括 `1`、FOR `"NIP-01"` 和 `9` FOR `"NIP-09"`。客户端 `NIPs` 不应该被公布，并且可以被客户端忽略。

### 软件

可以在 `software` 属性中提供中继服务器实现。如果存在，这必须是项目主页的 URL.

### 版本

中继可以选择将其软件版本发布为字符串属性。字符串格式由中继实现定义。建议使用版本号或提交标识符。

## 额外字段

### 服务器限制

这些是中继对客户端施加的限制。你的客户应该预料到，超过这些*实际的*限制的请求会被拒绝或立即失败。

```json
{
...
  limitation: {
        max_message_length: 16384,
        max_subscriptions: 20,
        max_filters: 100,
        max_limit: 5000,
        max_subid_length: 100,
        min_prefix: 4,
        max_event_tags: 100,
        max_content_length: 8196,
        min_pow_difficulty: 30,
        auth_required: true,
        payment_required: true,
  }
...
}
```

* `max_message_length`：这是中继的传入 JSON 的最大字节数 将尝试解码并采取行动。当你发送大量订阅时，你将受到此值的限制。它还有效地限制了任何事件的最大大小。值从 `[` 到 `]` 计算，并且在 UTF-8 序列化之后（因此某些 Unicode 字符将占用 2-3 个字节）。它等于 WebSocket 消息帧的最大大小。
* `max_subscriptions`：可能的订阅总数 在到此中继的单个 WebSocket 连接上处于活动状态。与中继有（付费）关系的经过身份验证的客户端可能具有更高的限制。
* `max_filters`：每个订阅中筛选值的最大数目。 必须为 1 或更高。
* `max_subid_length`：订阅 ID 作为字符串的最大长度。
* `min_prefix`：对于 `authors` 要匹配的和 `ids` 过滤器 对于十六进制前缀，你必须在前缀中至少提供此数量的十六进制数字。
* `max_limit`：中继服务器会将每个过滤器的 `limit` 值限制为此数字。 这意味着客户端将无法从单个订阅筛选器中获取超过此数量的事件。这种箝位通常由继电器静默完成，但有了这个数字，你可以知道，如果你缩小滤波器的时间范围或其他参数，会有额外的结果。
* `max_event_tags`：在任何情况下，这都是列表中 `tags` 元素的最大数量。
* `max_content_length`：中 `content` 的最大字符数 任何事件的字段。这是 Unicode 字符的计数。在序列化为 JSON 之后，它可能会更大（以字节为单位），并且如果定义了，则仍然受 `max_message_length`。
* `min_pow_difficulty` 新事件将至少需要这种功率的困难， 基于[NIP-13](https://github.com/pqingshuang/nostrbook/blob/main/fu-lu-1-nip-xiang-jie/13.md)，否则它们将被此服务器拒绝。
* `auth_required`：此中继需要[NIP-42](https://github.com/pqingshuang/nostrbook/blob/main/fu-lu-1-nip-xiang-jie/42.md)身份验证 在新连接执行任何其他操作之前发生。即使设置为 False，特定操作也可能需要身份验证。
* `payment_required`：在新连接可以执行任何操作之前，此中继需要付费。

### 事件保留

可能存在与永久存储数据相关联的成本，因此中继可能希望声明保留时间。此处所述的值是未经身份验证的用户和访问者的默认值。付费用户可能会有其他政策。

保留时间以秒为单位， `null` 表示无限长。如果提供零，则这意味着根本不存储事件，并且优选地，当接收到这些事件时，将提供错误。

```json
{
...
  retention: [
    { kinds: [0, 1, [5, 7], [40, 49]], time: 3600 },
    { kinds: [[40000, 49999], time: 100 },
    { kinds: [[30000, 39999], count: 1000 },
    { time: 3600, count: 10000 }
  ]
...
}
```

`retention` 是一个规范列表：每个规范将适用于所有类型或类型的子集。可以将种类字段的范围指定为包含起始值和结束值的元组。然后，将指定类型（或所有）的事件限制为 AND `count` 或时间段。

通过将这些 `kind` 值的保留时间设为零，可以有效地将依赖于特定 `kind` 数字的基于 NOSTR 的协议列入黑名单。虽然这很不幸，但它确实允许客户端通过单个 HTTP 获取快速发现支持其协议的服务器。

无需为指定保留时间（如中[NIP-16](https://github.com/pqingshuang/nostrbook/blob/main/fu-lu-1-nip-xiang-jie/16.md)所定义），\_短暂的事件\_因为它们不会被保留。

### 内容限制

一些继电器可能受一个民族国家的任意法律管辖。这可能会限制哪些内容可以以明文形式存储在这些中继上。鼓励所有客户端使用加密来绕过此限制。

不可能描述每个国家的法律和政策的局限性，这些法律和政策本身通常是模糊和不断变化的。

因此，该字段允许中继运营商指示哪个国家的法律可能最终对其强制执行，然后间接地对其用户的内容强制执行。

用户应该能够避免在他们不喜欢的国家进行中继，和/或在更有利的地区选择中继。展现这种灵活性取决于客户端软件。

```json
{
...
  relay_countries: [ 'CA', 'US' ],
...
}
```

* `relay_countries`：两级 ISO 国家代码（ISO 3166-1 alpha-2）的列表，其法律和政策可能会影响此中继。 `EU` 可用于欧盟国家。

请记住，接力可能在一个国家举办，而不是拥有接力的法律实体所在的国家，因此很可能涉及多个国家。

### 社区首选项

至少对于公共文本笔记，接力可能会试图促进当地社区的发展。这将鼓励用户除了他们通常的个人关注之外，还关注该中继上的全球反馈。为了支持这一目标，继电器可以指定以下一些值。

```json
{
...
  language_tags: [ 'en', 'en-419' ],
  tags: [ 'sfw-only', 'bitcoin-only', 'anime' ],
  posting_policy: 'https://example.com/posting-policy.html',
...
}
```

* `language_tags` 是指示在中继上所说的主要语言的[IETF语言标签](https://en.wikipedia.org/wiki/IETF_language_tag)有序列表。
* `tags` 是要讨论的主题的限制列表。例如 `sfw-only`，表示在此中继上仅鼓励"安全工作"内容。这依赖于对"工作"和"社区"在谈论什么时感到"安全"的假设。随着时间的推移，一组通用的标签可能会出现，允许用户找到适合他们需要的中继，并且客户端软件将能够轻松地解析这些标签。 `bitcoin-only` 标签表示任何*替代币*，*“加密”或区块链*评论都将被毫不留情地嘲笑。
* `posting_policy` 是指向人类可读页面的链接，该页面指定了中继的社区策略。在这种 `sfw-only` 情况下，链接到一个页面是很重要的，这个页面涉及到你的发布政策的细节。

该 `description` 字段应用于简要描述你的社区目标和价值观。其他详细信息和法律条款 `posting_policy` 请参见。使用 `tags` 字段表示对内容或要讨论的主题的限制，这些内容或主题可以由相应的客户端软件进行机器处理。

### 付费中继

需要付款的中继可能希望公开其费用表。

\`\` \`JSON{ ... 支付 \_URL：" https：//my-relay/payments "，费用：{ }, ... }


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sherry-pang.gitbook.io/nostr-cn/fu-lu-1-nip-xiang-jie/11.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
