From 0b36bd9fd5b8dc9431e1e2e4f6b6c4029bf9d541 Mon Sep 17 00:00:00 2001 From: Emil Lundberg Date: Thu, 4 Dec 2025 18:39:31 +0100 Subject: [PATCH 1/2] Add ADR 0002: Wallet state model --- .../0002-wallet-state/conflict-resolution.png | Bin 0 -> 126157 bytes .../0002-wallet-state/data-model.md | 166 ++++++++++++++++++ .../0002-wallet-state/index.md | 111 ++++++++++++ .../0002-wallet-state/state-container.png | Bin 0 -> 74858 bytes 4 files changed, 277 insertions(+) create mode 100644 docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/conflict-resolution.png create mode 100644 docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/data-model.md create mode 100644 docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/index.md create mode 100644 docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/state-container.png diff --git a/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/conflict-resolution.png b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/conflict-resolution.png new file mode 100644 index 0000000000000000000000000000000000000000..630ab540af52361b5e5f3939ffb10ec0d7a1463b GIT binary patch literal 126157 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 z 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

Fq&KO@| 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 jdB;`+`P>nCwacp?%Bi$Y;6Kl` (E1, E2, ..., En) +- Describes a change to S (`WalletBaseState`) +- `parentHash`: hash of previous event +- ...other metadata + + + +Current state is S + E1 + E2 + ... + En, recomputed each time the encrypted container is opened (on each page load) + +Events older then some threshold, get folded into the S (`WalletBaseState`) + +``` +S' = apply(S, events[0]) +events = events[1:] +``` + + +![Diagram: Conflict resolution by linearizing event history](./conflict-resolution.png) + + + +### Conflict detection + +Utilize `ETag` header for conflict detection + +On fetch: save `ETag` header in frontend state +- Backend sets response header `ETag: Hash(encrypted blob)` +- Frontend saves `ETag` in app state + + ``` + latestEtag = response.headers['ETag'] + ``` + +On push: send request header `X-Private-Data-ETag: ` +- Backend compares: + ``` + Hash(currentPrivateData) == X-Private-Data-ETag + ``` +- if match: success +- if not matched: conflict +- Frontend must re-fetch and resolve conflict (on later PR) + + +### Conflict resolution + +The above diagram provides an illustrative example. +The resolution steps as numbered in the diagram are: + + 1. Use `parentHash` to determine the point of divergence + + In the example case, `Hash(E3)` is the latest `parentHash` that appears in both event lists + + 2. Resolve conflicts between E4...E5 and E6...E8 + + 1. New Credential Event: keep both if `credentialId` differ + 2. Delete Credential Event: keep both if `credentialId` differ. Discard if duplicate `credentialid` + 3. New Keypair Event: keep both + 4. Delete Keypair Event: Discard if duplicate `kid` + 5. Alter Settings Event: Keep the one with the latest timestamp + 6. New Credential Issuance Session: Keep both + 7. New Presentation Event: keep both + + 3. De-duplicate events: E7 duplicates E5 + + 4. After conflict resolution, replay E6, E8 after E5 + + +>Note: The implementation at this point did not handle the cases of offline scenarios where merging of divergent states can occur. This functionality will be introduced later. + + +### Code versioning + +_This section is new since [wallet-frontend PR #740][fe-pr-e2ee]._ + +The data model is implemented in [`WalletStateSchema.ts`][schema-ts] and related files. +Each version of the data model has a concrete versioned module, for example `WalletStateSchemaVersion1.ts`, +which defines data types and functions for operating on events for that schema version. +Concretely, these consist of: + +- Type definitions of `WalletStateContainer`, `WalletState` and `WalletSessionEvent`, + and any required member types. + + `WalletStateContainer` is always on the form: + ```ts + export type WalletStateContainer = { + events: WalletSessionEvent[]; + S: WalletState; + lastEventHash: string; + }; + ``` + + In schema version 1, `WalletSessionEvent` and `WalletState` are both concrete singular types. + In later schema versions these are "version X or later" union types, + since `events` may contain events of earlier schema versions not yet folded into `S`, + and the last event folded into `S` may also have been of an earlier schema version. + Therefore, both `S` and `events` may be of the current or any earlier schema version. + +- Reducer functions for applying events to states. + These functions have signatures on the form `(S, E) => S`, where `S` is the state type and `E` is the event type. + + The `(WalletState, WalletSessionEvent) => WalletState` reducer + should always set `WalletState.schemaVersion` to the value of `WalletSessionEvent.schemaVersion`. + +- Merge strategies for de-duplicating events during conflict resolution. + These are functions that take two lists of events of a particular type, + and return a new list that is the de-duplication result. +- A hash function for hashing events. + This is used to set the `parentHash` of child events, and the `latestEventHash` of the `WalletStateContainer`. +- Utility functions for initializing a new wallet state, + and moving events to new parents during conflict resolution. + +Whenever hashing an event, or applying an event to a state, +the function suite defined in that event's schema version must be used. +These `WalletStateSchemaVersionX.ts` files therefore cannot be deleted or edited +(except pure refactorizations) without breaking backwards compatibility. + +Subsequent versions can reuse code from previous versions by importing their types and functions, +and re-exporting them from the new module with any necessary extensions. +Inherited functions can be "modified" by wrapping the existing function with any necessary adapter logic, +or "overwritten" by re-exporting a new function of the same name. + +To ease code reuse between schema versions, +part of the `WalletStateSchemaVersion1` function suite is constructed using a `createOperations` factory function. +This way the event reducer, hash function and merge strategies +can be easily adapted to accept events from a later schema version +if the relevant logic did not change between those schema versions. + +Functions for creating events are in [`WalletStateSchema.ts`][schema-ts], +and always target the most recent schema version. +This ensures that the schema version of the state and event log is a non-decreasing sequence. + + +[fe-pr-e2ee]: https://github.com/wwWallet/wallet-frontend/pull/740 +[schema-ts]: https://github.com/wwWallet/wallet-frontend/tree/13c7f1eb2507c1c7210c49ce74a965de2ef88893/src/services diff --git a/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/index.md b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/index.md new file mode 100644 index 0000000..f77fa1a --- /dev/null +++ b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/index.md @@ -0,0 +1,111 @@ +# 2. Wallet state model + +Date: 2025-12-04 (implemented 2025-08-04) + +## Status + +Accepted. + +This ADR was written retroactively after the decision and implementation had already been made. + + +## Context + +wwWallet plans to keep all user data (wherever possible) end-to-end encrypted on the client side +under encryption keys associated with the user's passkeys, under the user's sole control. +wwWallet also provides a hosted backend server which stores users' encrypted contents +so that accounts can be accessed on multiple client devices. + +Whenever a user makes changes to their account in the frontend app, +the frontend automatically re-encrypts the new wallet contents and uploads the new encrypted data to the server. +Whenever the frontend fetches encrypted user data, it records a hash of that version of the data. +That previous version hash is then advertised whenever new data is uploaded, +and the server refuses the upload if the advertised hash does not match the encrypted data currently stored on the server. +This prevents data loss in case concurrent changes were made in different sessions. + +However, prior to wallet-frontend commit [85b6d614f][fe-commit-e2ee] +there was no strategy for resolving such a conflict. +Since the data is encrypted, conflict resolution cannot be done on the server, +it must be done on the client side. +[wallet-frontend pull request #740][fe-pr-e2ee] added a data model to support conflict resolution. + + +## Decision + +To enable automated conflict resolution between concurrent user sessions, +we will implement a wallet state data model as described in the [Data model](./data-model) subpage. + +The data model is heavily inspired by the [Redux state architecture][redux-concepts], +the ["map-reduce" programming model][map-reduce] +and the [data model of the Git version control system][git-btmup], +and has the following main characteristics: + +- State is modeled as a _base state_ and an array of _events_. +- The base state is never modified directly. +- The _current state_ can be computed by "applying" the events one at a time to the base state. +- Events have a creation timestamp. + Events older than a set threshold (initially 30 days) are "folded into" the base state, + meaning the event is applied to the base state and the resulting state becomes the new base state. +- Events are tagged with an identifier of the previous event. + Whenever an event is "folded into" the base state, + the new base state is tagged with an identifier of the folded event. +- Each base state and event has a _schema version_. + Events can be applied to states of lower or equal schema version, + and the resulting new state has the schema version of the event. + Attempting to apply a lower-version event to a higher-version state is an error. + + Changes to the state data model require defining a new schema version, + including new functions for creating and applying new event types. + Once defined, an existing schema version must not be changed + other than by pure refactorizations. + This is to ensure that wallets containing events of older schema versions + continue to work as intended at the time that wallet state was created. + + New events are always created using the latest schema version in the running frontend version. + +This "tail" of events enables the frontend to resolve conflicts between concurrent sessions, +by attempting to linearize and de-duplicate diverged event histories. +This requires a shared point in both histories; +the event identifiers on events and base states enable locating that point +even if one history branch has more events folded into its base state. +This is also why events are "folded into" the base state only after 30 days have passed; +this leaves a window of 30 days where conflicts can be automatically detected and resolved. +At the same time, the 30-day threshold ensures that the event log does not continue growing forever, +consuming more storage space and taking longer to recompute the current state for every change. +We believe this is a good balance between performance and data safety. + + +## Consequences + +### Positive + +wallet-frontend can automatically detect and resolve state conflicts between concurrent user sessions, +preventing data loss in such cases. + +wallet-frontend can ensure backwards compatibility with states from earlier app versions +in a structured and explicit way. + + +### Negative + +This makes the wallet state data model significantly more complex. +Future changes to the data model will be much more cumbersome to make. + +The 30-day threshold for "folding" events ensures a reasonable window for detecting and resolving conflicts, +but also means that the event log can grow without bound within that 30-day window. +This may degrade storage and processing performance for very long event chains, +as the whole event chain needs to be re-evaluated whenever the wallet is opened. + + +## See also + +- [Redux: Core Concepts][redux-concepts] +- [MapReduce][map-reduce] +- [Git from the Bottom Up][git-btmup] + + +[fe-commit-e2ee]: https://github.com/wwWallet/wallet-frontend/commit/85b6d614fb163d76529f2b4736cf91743f26f3ea +[fe-pr-e2ee]: https://github.com/wwWallet/wallet-frontend/pull/740 +[git-btmup]: https://jwiegley.github.io/git-from-the-bottom-up/ +[map-reduce]: https://en.wikipedia.org/wiki/MapReduce +[redux-concepts]: https://redux.js.org/introduction/core-concepts diff --git a/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/state-container.png b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/state-container.png new file mode 100644 index 0000000000000000000000000000000000000000..89a0ef377df1b5988bd27dc6d38fb30e76a80b47 GIT binary patch literal 74858 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 a|LhOn^_y*<$GMsT2s~Z=T-G@yGywpE&KPX~ literal 0 HcmV?d00001 From f0f72600fc70157aee1abe222b2826d2fd01defa Mon Sep 17 00:00:00 2001 From: Emil Lundberg Date: Fri, 5 Dec 2025 12:44:50 +0100 Subject: [PATCH 2/2] Fix "later" that should be "earlier" in ADR-0002 --- .../0002-wallet-state/data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/data-model.md b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/data-model.md index bf0ae7b..74722cf 100644 --- a/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/data-model.md +++ b/docs/wallet-architecture/09-architecture-decision-records-archive/0002-wallet-state/data-model.md @@ -122,7 +122,7 @@ Concretely, these consist of: ``` In schema version 1, `WalletSessionEvent` and `WalletState` are both concrete singular types. - In later schema versions these are "version X or later" union types, + In later schema versions these are "version X or earlier" union types, since `events` may contain events of earlier schema versions not yet folded into `S`, and the last event folded into `S` may also have been of an earlier schema version. Therefore, both `S` and `events` may be of the current or any earlier schema version.