From 3f7b0e80a3c5de7d1e142a080a11f2f56f4b21f4 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Mon, 30 May 2022 14:13:55 +0100 Subject: [PATCH] Minor drive-by state res clarifications (#1042) * Opinionated rewrite of unconflicted state map * Define auth chain --- .../newsfragments/1042.clarification | 1 + content/rooms/fragments/v2-state-res.md | 27 +++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 changelogs/server_server/newsfragments/1042.clarification diff --git a/changelogs/server_server/newsfragments/1042.clarification b/changelogs/server_server/newsfragments/1042.clarification new file mode 100644 index 00000000..2f3fad6f --- /dev/null +++ b/changelogs/server_server/newsfragments/1042.clarification @@ -0,0 +1 @@ +Clarify the meaning of "unconflicted state map" and "auth chain" in state res v2. diff --git a/content/rooms/fragments/v2-state-res.md b/content/rooms/fragments/v2-state-res.md index d12f45c3..e666d7f8 100644 --- a/content/rooms/fragments/v2-state-res.md +++ b/content/rooms/fragments/v2-state-res.md @@ -30,11 +30,22 @@ the `membership` is `leave` or `ban` and the `sender` does not match the might remove someone's ability to do something in the room. **Unconflicted state map and conflicted state set.** -The *unconflicted state map* is the state where the value of each key -exists and is the same in each state *S**i*. The *conflicted -state set* is the set of all other state events. Note that the -unconflicted state map only has one event per `(event_type, state_key)`, -whereas the conflicted state set may have multiple events. +The keys of the state maps *Si* are 2-tuples of strings of the form +*K* = `(event_type, state_key)`. The values *V* are state events. +The key-value pairs (*K*, *V*) across all state maps *Si* can be +divided into two collections. +If a given key *K* is present in every *Si* with the same value *V* +in each state map, then the pair (*K*, *V*) belongs to the *unconflicted state map*. +Otherwise (*K*, *V*) belongs to the *conflicted state set*. + +Note that the unconflicted state map only has one event for each key *K*, +whereas the conflicted state set may associate multiple events to the same key. + +**Auth chain.** +The *auth chain* of an event *E* is the set containing all of *E*'s auth events, +all of *their* auth events, and so on recursively, stretching back to the +start of the room. Put differently, these are the events reachable by walking +the graph induced by an event's `auth_events` links. **Auth difference.** The *auth difference* is calculated by first calculating the full auth @@ -111,9 +122,9 @@ the auth event is not rejected. The *resolution* of a set of states is obtained as follows: -1. Take all *power events* and any events in their auth chains, - recursively, that appear in the *full conflicted set* and order them - by the *reverse topological power ordering*. +1. Select all *power events* that appear in the *full conflicted set*. Compute + the union of their auth chains, including the power events themselves. + Sort the union using the *reverse topological power ordering*. 2. Apply the *iterative auth checks algorithm*, starting from the *unconflicted state map*, to the list of events from the previous step to get a partially resolved state.