GDPR segregation plan

Executive summary

opsdb currently mixes high-sensitivity customer identity and authentication data with operational and pseudonymous validator and financial data in a single database boundary. This forces strict access control on all services and data in the database regardless of their sensitivity. To allow wider access to operational data, we need to segregate the database into two boundaries:

  • keep low-risk and pseudonymous operational data in coredb
  • keep direct identifiers, credentials, and high-risk free-text or file content in a sensitive database boundary
  • expose only minimal join-safe identifiers to most runtime services

Data classification definitions

  • Class A data can directly identify a user or customer, enable account access, or contain unbounded sensitive content.
  • Class B data is not directly identifying on its own, but is linked to customer IDs or pseudonymous data or commercially sensitive.
  • Class C data is public chain or reference data.

opsdb inventory and sensitivity

TablePrimary contentsClassificationNotesAccessing services and host boxSurfacing requirements
t_users (identity profile fields)f_name, f_email, f_email_verified, f_timezone, f_createdADirect customer identity and contact profileattestantd, reportd, acli
t_users (authentication/control fields)f_webauthn_credentials, f_allow_registration, f_acting_forAAuthentication and delegated-access controlsattestantd, acli
t_users (f_fee_rate JSONB)Fee/tax percentages by source/asset and validity windows (FeeRateConfig)A/BCommercial terms; not direct identity, but commercially sensitivereportd, acliBAM for accounting and revenue projections
t_users (f_invoice_configs JSONB)Invoice options (InvoiceConfig): tax title/number/description, contact addresses, payment preferencesACustomer billing metadataattestantd, reportd, acli
t_users (f_periodic_reports JSONB + comms flag)Report schedule and preferences (PeriodicReport): recipients/cc, subaccounts, assets/sources, timing/frequency/theme, plus email notification flagAContains contact emails for reporting preferencesattestantd, opsd/reports
t_users (f_mev_relay JSONB + UI/account metadata)Per-customer relay config (CustomerRelayConfig: relay ID, grace, min value) plus f_currency, f_ui_scope, f_theme, f_enc_pubkeyBMostly account and operational metadata; no direct identity in the relay JSON itselfattestantd, opsd, acli
t_user_tokensUser bearer/API tokens, scope, expiryASecret credential materialattestantd, acli
t_user_filesUser files and metadataAFile content can include PII and financial documentsopsd/reports (writes reports), attestantd (reads), acli
t_auditUser operation logs, IP, payload JSON, errorsAIP and payload content are privacy-sensitiveattestantd (write/read), acli (read)Attestant compliance team
t_customer_financialsCustomer financial ledgerBFinancial and operational accounting dataopsd, opsd/reports, attestantd, reportdC1 for reporting (subaccount grouping)
t_near_financialsNEAR financial ledger plus epoch metadataBSame model as financials with NEAR enrichmentsnearfinancialsd, reportd; reportd nearfinancialsd
t_customer_validatorsCustomer-validator assignments, states, balances, proposer config (JSON), rocketpool and EigenLayer validator metadata (JSON)BCustomer-linked pseudonymous dataopsd, opsd/reports, attestantd, feerd, lidod, summaryd, acliC1 for reporting (subaccount grouping, fee recipient addresses)
t_customer_epoch_metricsPer-customer epoch performance metricsBCommercially sensitive customer performanceopsd, attestantd, acli
t_proposer_config_historiesHistorical proposer config by customer/subaccountBContains customer-linked operational configopsd, opsd/reports, attestantd, feerd, acliC1 for reporting (historical fee recipient addresses)
t_rejected_validatorsRejected validator pubkeys by userBCustomer-to-validator linkageservices/eth2 flows via attestantd and opsd
t_customer_rocketpool_node_operatorsRocket Pool operators linked to customerBAddresses are public on-chain; the linkage is sensitiveopsd, attestantdTo be deprecated
t_customer_eigenpodsEigenpods linked to customerBSame patternattestantd, services/eigenlayer
t_customer_starknet_delegatorsStarknet delegators linked to customerBSame patternstarkd
t_customer_solana_delegatorsSolana delegators linked to customerBSame patternsolanad, summaryd
t_customer_near_delegatorsNEAR delegators and validator address linked to customerBSame patternnearfinancialsd, summaryd
t_unassigned_validatorsUnassigned validator pool metadataBMostly operational inventory dataopsd, opsd/reports, acliC1 for reporting (all validator keys in the pool)
t_eth_mev_relaysRelay catalog: name/url/pubkeyCPublic-facing reference setattestantd, acli
t_chainmetaChain constants, genesis data, and deposit contract metadataCPublic chain metadataattestantd, services/eth2
t_metadataInternal key/value JSON metadataN/AMostly operationalattestantd, opsd, and DB versions

Access flow diagram

The following Sankey diagram shows the service-to-table access flow represented by the table above.

If the embedded diagram does not render, open opsdb_sankey_access_flow.html directly.

Target architecture overview

  • The current opsdb serves two concerns at once: high-sensitivity customer and account workflows, and lower-sensitivity operational workflows.
  • The target architecture separates those concerns into two database boundaries and places services according to the highest-sensitivity data they require.
  • coredb becomes the new operational database, holding mainly Class B and Class C data, together with only the minimum internal identifiers needed to join operational records.
  • core box hosts that lower-sensitivity operational boundary. Services moved there should not need direct access to names, emails, authentication material, audit logs, reporting-recipient data, or file contents.
  • The existing high-sensitivity boundary remains the home for direct identity, authentication, account-control, audit, reporting-contact, and file-content workflows.
  • Initially, that sensitive boundary can remain in the current opsdb, and later be reduced into a dedicated sensitive database as the migration progresses.

Data exposure on core box

  • core box should expose only coredb and the services that need that data.
  • The exposed dataset should be limited to Class B and Class C information, plus minimal join-safe internal identifiers such as customer IDs where operational linking is still required.
  • This includes customer-linked operational data such as Customer IDs, subaccounts, validator assignments, proposer config history, performance metrics, customer financial ledger data, unassigned validator pool data, and customer-to-on-chain linkages such as eigenpods, and delegated addresses.
  • It also includes public or low-confidentiality reference data such as MEV relay metadata, chain metadata, and other internal service metadata.
  • core box will not expose direct identity or account-control data such as names, emails, auth credentials, audit/IP logs, invoice contact details, periodic report recipient lists, or user file contents.
  • Report generation, account management, authentication, and other workflows that require direct identifiers should remain outside core box and continue to use the sensitive boundary (in client box).

Migration phases

Phase 0: move non-sensitive tables and dependent flows to coredb

  • Stand up coredb on a separate core box.
  • Run coredb in parallel with the existing opsdb.
  • Migrate whole tables that are already non-sensitive or acceptable to expose on core box, together with the read and write paths that depend on them.
  • Ensure all services on core box that need these datasets can read coredb before any cutover.

Phase 1: move sensitive tables into a dedicated sensitive boundary

  • Create a separate sensitive database boundary for Class A tables and other high-risk content.
  • Move services that rely only on coredb to the core box.
  • Remove duplicated non-sensitive data from the legacy opsdb once the new paths are live.
  • Leave account management, reporting-contact, authentication, audit, and file workflows on the sensitive side.

Phase 2: split t_users by data class

  • Split the current t_users table into purpose-specific tables aligned to sensitivity.
  • t_users keeps identity profile fields and authentication/control fields.
  • t_users_reporting stores invoice configuration and periodic report data.
  • t_users_config stores non-sensitive account and runtime configuration data.
  • Expose only the minimum identifiers and configuration needed by services running on core box.

Phase 3: move services according to final data requirements

  • Move the opsd/reports service, which is responsible for periodic reports, into reportd.
  • Move the remaining opsd services to the core box once they depend only on coredb and t_users_config.
  • Keep any service that still requires Class A identity, authentication, audit, reporting-contact, or file data on the sensitive side until it is split or redesigned.