MSC: Federation endpoint for retrieving current extremities
parent
ea0aef0aa3
commit
fea82572d0
@ -0,0 +1,141 @@
|
||||
# MSC4370: Federation endpoint for retrieving current extremities
|
||||
|
||||
[MSC4284: Policy Servers](https://github.com/matrix-org/matrix-spec-proposals/pull/4284) introduces
|
||||
an idea for an extremely lightweight server implementation to be developed to reduce the amount of
|
||||
spam which ends up persisted in a room's DAG. In these server implementations, knowing the "current"
|
||||
state of the room can be important for factoring into deciding whether an event is spammy.
|
||||
|
||||
"Current state" is not a concept which exists over federation, however: servers are expected to calculate
|
||||
and heal their copy of the DAG to resolve a definition of "current state" for the room. A policy server
|
||||
might not be persisting or tracking the DAG for a room though, especially because it typically only
|
||||
concerns itself with impact to *current* users in the room at the time the policy server is asked to
|
||||
scan an event.
|
||||
|
||||
To avoid the burden of persisting (and calculating, healing, resolving, etc) the room DAG, policy
|
||||
servers have two options:
|
||||
|
||||
1. Attach themselves to a full homeserver implementation via the Client-Server API, calling endpoints
|
||||
like [`GET /state`](https://spec.matrix.org/v1.16/client-server-api/#get_matrixclientv3roomsroomidstate).
|
||||
2. Wait for a "trusted" server to ask an event to be scanned, then call [`GET /state/:roomId`](https://spec.matrix.org/v1.16/server-server-api/#get_matrixfederationv1stateroomid)
|
||||
against that server using the just-scanned event ID as a reference (after waiting a little bit so
|
||||
the remote server can persist its now-approved event).
|
||||
|
||||
The first option is fiddly for policy servers which operate at the Federation layer natively, like
|
||||
the Foundation's own policyserv implementation, because managing a bot account for this one information
|
||||
source can be a lot of overhead.
|
||||
|
||||
The second option relies on the policy server receiving an event from a server it trusts before it
|
||||
can "learn" the state of the room. If the room has a lot of traffic from other servers, its view of
|
||||
"current state" may drift significantly and produce inaccurate spam determinations. This is the approach
|
||||
policyserv currently uses.
|
||||
|
||||
This MSC introduces a new endpoint that (primarily) policy servers can use to retrieve the *current*
|
||||
extremities a given server has so it may then retrieve the current state for the room. Policy servers
|
||||
which require historical context of room state (or the DAG in general) should behave like a normal
|
||||
homeserver and resolve the DAG to that point in time - this MSC will not be overly useful to them.
|
||||
|
||||
By allowing a server to retrieve the current extremities, that server can request (and cache) current
|
||||
state whenever it feels it needs to rather than waiting for a remote server to become active. This
|
||||
could be on a timer, after a certain number of events have been scanned in the room, after specific
|
||||
event types are seen, or a combination of all 3 - when to call the new endpoint is left as an implementation
|
||||
detail.
|
||||
|
||||
This MSC expects that the current extremities for a room are highly cached or easily discovered by
|
||||
a given server implementation - it's the exact same information it would populate in `prev_events`
|
||||
if it were to send an event at that time.
|
||||
|
||||
Though not primary drivers for this proposal, this MSC's new endpoint also enables two bonus features:
|
||||
|
||||
1. A server which has lost its copy of the DAG, but has a room ID and server name, can call the new
|
||||
endpoint to get current extremities and work backwards from there to rebuild the DAG. This doesn't
|
||||
fix a scenario where the server has a total loss of room information, but a step towards recovery
|
||||
is always better than none. A server may use this feature after data loss if a user happens to have
|
||||
a cache of their room list still, for example.
|
||||
|
||||
Other MSCs in this space include:
|
||||
* [MSC2316: Federation queries to aid with database recovery](https://github.com/matrix-org/matrix-spec-proposals/pull/2316)
|
||||
* [MSC2314: A method to backfill room state](https://github.com/matrix-org/matrix-spec-proposals/pull/2314)
|
||||
(**MSC2314 is a strong alternative to this MSC.**)
|
||||
|
||||
2. If a lightweight server were to want to send an event, such as a redaction or a ban, it can use
|
||||
this MSC's new endpoint to get accurate-enough `prev_events` for its event, then inspect current
|
||||
state to populate `auth_events` and send the event to all other servers in the room.
|
||||
|
||||
Currently policy servers manage a bot account to accomplish this task - see above regarding how
|
||||
fiddly that can be. Eliminating the need to manage a bot account is a desirable feature for the
|
||||
Foundation's policyserv implementation.
|
||||
|
||||
## Proposal
|
||||
|
||||
A new endpoint is added to the [Server-Server API](https://spec.matrix.org/v1.16/server-server-api/)
|
||||
to retreive the current extremities (as event IDs) the server has in the given room. The endpoint
|
||||
requires normal authentication for federation endpoints and MAY be rate limited. "Current" is at the
|
||||
time of the request and has no guarantee of being accurate after the request is completed.
|
||||
|
||||
Servers should note that this endpoint returns the same information which would be supplied in the
|
||||
`prev_events` for an event, if they were to send one.
|
||||
|
||||
Request shape:
|
||||
|
||||
```
|
||||
GET /_matrix/federation/v1/extremities/{roomId}
|
||||
Authorization: X-Matrix ...
|
||||
```
|
||||
|
||||
(there are no query parameters or request body)
|
||||
|
||||
Response shape:
|
||||
|
||||
```
|
||||
Content-Type: application/json
|
||||
{
|
||||
"prev_events": ["$event1", "$event2"]
|
||||
}
|
||||
```
|
||||
|
||||
The response is contained in an object for future expansion. `prev_events` is required, and MUST have
|
||||
at least one event ID entry in its array.
|
||||
|
||||
The following errors may be returned:
|
||||
|
||||
* 403 / `M_FORBIDDEN` - The requesting server is not in the room, or is excluded from the room via
|
||||
`m.room.server_acl`.
|
||||
* 404 / `M_NOT_FOUND` - The server is not aware of the room.
|
||||
|
||||
Servers SHOULD NOT attempt to fully resolve the DAG before returning a response - the calling server
|
||||
is expected to handle the extremities as needed. For minimal/lightweight policy server implementations,
|
||||
this may mean requesting state at each event and merging the results for a good enough representation
|
||||
of current state - specific handling is left as an implementation detail.
|
||||
|
||||
## Potential issues
|
||||
|
||||
Lightweight server implementations may find it difficult to handle responses where `prev_events` has
|
||||
more than a single entry. They could attempt to run state resolution over the information they learn,
|
||||
or they could do a "simple" merge to get to somewhere close enough depending on their use case. They
|
||||
may also decide to just wait a little bit and hope that the remote server self-resolves the DAG or
|
||||
try another server.
|
||||
|
||||
## Alternatives
|
||||
|
||||
The major alternatives are discussed in the introduction for this proposal.
|
||||
|
||||
## Security considerations
|
||||
|
||||
**Author's note**: Specifics on how to exploit Matrix or this MSC are intentionally omitted from this
|
||||
proposal. Refer to the [Security Disclosure Policy](https://matrix.org/security-disclosure-policy/)
|
||||
to discuss such concerns and details.
|
||||
|
||||
Spammers can already use a few different tools to flood a room and this MSC makes it easier to do so.
|
||||
This MSC does not have mitigation for such spam and instead expects that other aspects of Matrix will
|
||||
take care of it. Features such as rate limits, policy servers, moderation tooling generally, and
|
||||
server-side (implementation-specific) DAG/room simplification may be of interest to server developers
|
||||
and communities on Matrix.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
While this proposal is not considered stable, implementations should use
|
||||
`/_matrix/federation/unstable/org.matrix.msc4370/extremities/{roomId}` in place of the stable endpoint.
|
||||
|
||||
## Dependencies
|
||||
|
||||
This MSC has no direct dependencies, but is primarily intended to be useful to [MSC4284: Policy Servers](https://github.com/matrix-org/matrix-spec-proposals/pull/4284).
|
||||
Loading…
Reference in New Issue