This room version builds off of version 1 with an improved state resolution algorithm.
Table of Contents
Warning
The information contained in this section is strictly for server implementors. Applications which use the Client-Server API are generally unaffected by the details contained here, and can safely ignore their presence.
Room version 2 uses the base components of room version 1, changing only the state resolution algorithm.
The room state S’(E) after an event E is defined in terms of the room state S(E) before E, and depends on whether E is a state event or a message event:
The room state S(E) before E is the resolution of the set of states {S’(E1), S’(E2), …} consisting of the states after each of E's prev_events {E1, E2, …}, where the resolution of a set of states is given in the algorithm below.
The state resolution algorithm for version 2 rooms uses the following definitions, given the set of room states {S1, S2, …}:
The reverse topological power ordering of a set of events is the lexicographically smallest topological ordering based on the DAG formed by auth events. The reverse topological power ordering is ordered from earliest event to latest. For comparing two topological orderings to determine which is the lexicographically smallest, the following comparison relation on events is used: for events x and y, x < y if
The reverse topological power ordering can be found by sorting the events using Kahn's algorithm for topological sorting, and at each step selecting, among all the candidate vertices, the smallest vertex using the above comparison relation.
Given an m.room.power_levels event P, the mainline of P is the list of events generated by starting with P and recursively taking the m.room.power_levels events from the auth_events, ordered such that P is last. Given another event e, the closest mainline event to e is the first event encountered in the mainline when iteratively descending through the m.room.power_levels events in the auth_events starting at e. If no mainline event is encountered when iteratively descending through the m.room.power_levels events, then the closest mainline event to e can be considered to be a dummy event that is before any other event in the mainline of P for the purposes of condition 1 below.
The mainline ordering based on P of a set of events is the ordering, from smallest to largest, using the following comparison relation on events: for events x and y, x < y if
The resolution of a set of states is obtained as follows:
Events that have been rejected due to failing auth based on the state at the event (rather than based on their auth chain) are handled as usual by the algorithm, unless otherwise specified.
Note that no events rejected due to failure to auth against their auth chain should appear in the process, as they should not appear in state (the algorithm only uses events that appear in either the state sets or in the auth chain of the events in the state sets).
Rationale
This helps ensure that different servers' view of state is more likely to converge, since rejection state of an event may be different. This can happen if a third server gives an incorrect version of the state when a server joins a room via it (either due to being faulty or malicious). Convergence of state is a desirable property as it ensures that all users in the room have a (mostly) consistent view of the state of the room. If the view of the state on different servers diverges it can lead to bifurcation of the room due to e.g. servers disagreeing on who is in the room.
Intuitively, using rejected events feels dangerous, however:
Rejected auth events are deliberately excluded from use in the iterative auth checks, as auth events aren't re-authed (although non-auth events are) during the iterative auth checks.