85 lines
4.2 KiB
Markdown
85 lines
4.2 KiB
Markdown
---
|
||
title: 房间版本 3
|
||
type: docs
|
||
weight: 30
|
||
version: 3
|
||
---
|
||
|
||
{{< boxes/warning >}}
|
||
本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 <a href="https://codeberg.org/wholetrans/docs-matrix-spec">Forgejo 存储库</a> 打开 Issue、提交 Pull Request 或<a href="mailto:errata@wholetrans.org">邮件联系</a>我们提出改进建议和参与翻译与核对。
|
||
{{< /boxes/warning >}}
|
||
|
||
|
||
该房间版本在 [版本 2](/rooms/v2) 的基础上,改进了事件格式。
|
||
|
||
## 客户端注意事项
|
||
|
||
此房间版本更改了发送给客户端的事件 ID 格式。客户端应注意,这些事件 ID 可能包含斜杠和其他潜在有问题的字符。客户端应将事件 ID 视为不透明标识符,不应尝试对其进行解析或转换(这一点与其他房间版本相同)。
|
||
|
||
客户端应预期事件 ID 的格式将由 `$randomstring:example.org` 变为类似 `$acR1l0raoZnm60CBwAVgqbZqoO/mYU81xysh1u7XcJk`(注意没有域名,且可能出现斜杠等特殊字符)。
|
||
|
||
虽然在本房间版本中未作更改,但实现本地化脱敏算法的客户端应参阅下文 [脱敏](#redactions) 部分获取完整说明。
|
||
|
||
## 服务器实现组件
|
||
|
||
{{% boxes/warning %}}
|
||
本节所含信息仅供服务器开发者参考。使用 Client-Server API 的应用通常不受这里涉及的细节影响。上面关于客户端注意事项的部分才是 Client-Server API 相关用例应参考的资源。
|
||
{{% /boxes/warning %}}
|
||
|
||
房间版本 3 除采用此处描述的事件格式外,也遵循了 [房间版本 2](/rooms/v2) 的其余行为规范。
|
||
|
||
### 处理脱敏
|
||
|
||
{{% rver-fragment name="v3-handling-redactions" %}}
|
||
|
||
### 事件 ID
|
||
|
||
{{% boxes/rationale %}}
|
||
在其他房间版本(即版本 1 和 2)中,事件 ID 是与事件其他内容分离的独立字段,必须单独进行追踪。这样会导致服务器在收到多个具有相同 ID 的事件时(无论是在同一房间还是不同房间),很难区分应当采用哪一个事件。通过移除专有事件 ID,服务器需通过事件的哈希值来确定其 ID。
|
||
{{% /boxes/rationale %}}
|
||
|
||
{{% added-in v=3 %}} 事件 ID 是该事件的[引用哈希](/server-server-api#calculating-the-reference-hash-for-an-event),采用[无填充 Base64](/appendices#unpadded-base64) 编码,并以 `$` 前缀。采用此方式生成的事件 ID 形如 `$CD66HAED5npg6074c6pDtLKalHjVfYb2q4Q3LZgrW6o`。
|
||
|
||
### 事件格式
|
||
|
||
当事件通过联邦协议传递时,将不再包含 `event_id` 字段。接收服务器应自行计算相应的事件 ID。
|
||
|
||
此外,`auth_events` 和 `prev_events` 字段的格式也被更改:不再是 `(event_id, hash)` 对的列表,而是直接为事件 ID 的普通列表。
|
||
|
||
事件格式的这些更改意味着服务器必须识别所收到事件所在房间的版本,以便能正确解析和处理事件。通过对服务器-服务器 API 的调整(例如在 [`GET /_matrix/federation/v1/make_join/{roomId}/{userId}`](/server-server-api/#get_matrixfederationv1make_joinroomiduserid) 响应中包含 `room_version` 字段),此要求得以实现。
|
||
|
||
v3 房间内事件的完整结构如下所示。
|
||
|
||
{{% definition path="api/server-server/definitions/pdu_v3" %}}
|
||
|
||
#### 已弃用的事件内容模式
|
||
|
||
{{% rver-fragment name="v1-deprecated-formatting-off-spec" %}}
|
||
|
||
{{% rver-fragment name="v1-stringy-power-levels" %}}
|
||
|
||
### 授权规则
|
||
|
||
{{% boxes/note %}}
|
||
{{% added-in v=3 %}} `m.room.redaction` 事件与其他事件一样,受授权规则约束。实际上,这通常意味着授权规则会允许其通过,除非 `m.room.power_levels` 事件在其 `events` 或 `events_default` 属性中对 `m.room.redaction` 事件设置了权限要求。特别注意,_脱敏权限等级_(redact level)**不**被授权规则考虑。
|
||
|
||
能够发送脱敏事件并不意味着该脱敏操作就应该被执行。接收服务器必须进行额外的检查,详见[处理脱敏](#handling-redactions)部分。
|
||
{{% /boxes/note %}}
|
||
|
||
{{% rver-fragment name="v3-auth-rules" %}}
|
||
|
||
## 与 v2 保持一致的部分
|
||
|
||
以下部分自 v2 起未做修改,现为保证完整性仍予以保留。
|
||
|
||
### 脱敏
|
||
|
||
{{% rver-fragment name="v1-redactions" %}}
|
||
|
||
### 状态解析
|
||
|
||
{{% rver-fragment name="v2-state-res" %}}
|
||
|
||
### 规范化 JSON
|
||
|
||
{{% rver-fragment name="v1-canonical-json" %}}
|