Stuart meets Satoshi: data
Data movement
Section titled βData movementβEach message names the data that moves. An icon marks each data type (see the table). The diagram uses an SMT Beacon. With the other Beacon Types, only the announcement is different (key rotation).
---
title: Data movement with an SMT Beacon
config:
sequence:
actorMargin: 20
width: 110
---
%% Each message names the data that moves. An icon marks each data type. The page has the legend:
%% π public key Β· π§Ύ BTCR2 Signed Update Β· π 32-byte hash Β· π² SMT Proof Β· π Unsigned Beacon Signal
%% β signature Β· β Beacon Signal Β· π· Beacon Address Β· π did Β· π¬ channel message Β· π§³ Sidecar Data Β· π DID document
sequenceDiagram
autonumber
actor Stu as Stuart
participant AS as Aggregation<br/>Service π€
participant BTC as Bitcoin β
actor Sat as Satoshi
Stu->>Stu: π new key β π§Ύ update<br/>β π hash of the update
Stu->>AS: π leaf value
AS->>Stu: π² SMT Proof,<br/>π Unsigned Beacon Signal
Stu->>AS: β signature
AS->>BTC: β Beacon Signal<br/>with the π² SMT root
Stu->>Sat: π¬ message, π did, π§³ Sidecar Data<br/>(π§Ύ update, π² SMT Proof)
Sat->>BTC: Find the Beacon Signals<br/>of the π· Beacon Addresses
BTC-->>Sat: β Beacon Signals
Sat->>Sat: π DID document<br/>with the π new key
| Icon | Data | Icon | Data |
|---|---|---|---|
| π | public key | β | Beacon Signal (on-chain) |
| π§Ύ | BTCR2 Signed Update | π· | Beacon Address |
| π | 32-byte hash | π | did |
| π² | SMT Proof | π¬ | channel message |
| πΊ | CAS Announcement | π§³ | Sidecar Data |
| π | Unsigned Beacon Signal | π | resolved DID document |
| β | signature | π€ | Aggregation Service |
| π¦ | CAS |
Data sources
Section titled βData sourcesβEach color is one data source. Only the cohort gets data from the Aggregation Service. Satoshi gets the SMT Proofs only from the Sidecar Data, because CAS never stores them.
---
title: Data sources
---
%% Each color is one data source. The icons are the same as in data-movement.mmd.
flowchart TD
classDef chain fill:#fff1dd,stroke:#f7931a,stroke-width:2px,color:#4a2a00
classDef agg fill:#efe7fb,stroke:#7e57c2,stroke-width:2px,color:#2e1a4f
classDef sidecar fill:#e3f4e6,stroke:#2e7d32,stroke-width:2px,color:#123d17
classDef cas fill:#e2eefb,stroke:#1565c0,stroke-width:2px,color:#0b2d55
classDef actor fill:#f4f4f4,stroke:#555555,color:#111111
Agg["π€ Aggregation Service<br/>cohort only<br/><br/>π Unsigned Beacon Signals<br/>πΊ CAS Announcements<br/>π² SMT Proofs"]:::agg
Stu(["Stuart"]):::actor
Sidecar["π§³ Sidecar Data<br/>private<br/><br/>π§Ύ updates<br/>πΊ CAS Announcements<br/>π² SMT Proofs"]:::sidecar
CAS["π¦ CAS / IPFS<br/>public<br/><br/>π§Ύ updates<br/>πΊ CAS Announcements"]:::cas
Chain["β Bitcoin<br/>public<br/><br/>β Beacon Signals"]:::chain
Res(["Satoshi's resolver"]):::actor
Agg --> Stu
Stu --> Sidecar
Stu -.-> CAS
Sidecar --> Res
CAS -.-> Res
Chain --> Res
linkStyle 0 stroke:#7e57c2,stroke-width:2px
linkStyle 1,3 stroke:#2e7d32,stroke-width:2px
linkStyle 2,4 stroke:#1565c0,stroke-width:2px
linkStyle 5 stroke:#f7931a,stroke-width:2px
Data flow
Section titled βData flowβStuart rotates a key with an SMT Beacon. For each Beacon Signal, the leaf of Stuart in the SMT has one of three states:
- β inclusion: the leaf is
hash(hash(nonce) + updateId). Satoshi applies the update. - β non-inclusion: the leaf is
hash(hash(nonce)). There is no update. - β gibberish: no SMT Proof of Stuart gives the SMT root. The DID is invalid (
INVALID_SIGNAL_DATAorMISSING_UPDATE_DATA). With ak-of-nfallback, this can occur if Stuart did not sign.
---
title: Data flow - SMT Beacon, one leaf for each Beacon Signal
config:
flowchart:
nodeSpacing: 20
rankSpacing: 30
---
%% Technical version of the hand sketch "btcr2 data flow visualization".
%% Sketch element β diagram element:
%% smiley at the left β Stuart; smiley with a top hat at the right β Satoshi
%% "Agg" with three small faces β Aggregation Service
%% cloud with a tree, "search by did", "Map" β SMT: the leaf index of a DID is hash(did)
%% "k/n", "signed? yes" β the cohort signs: all n (n-of-n), or k of n (k-of-n fallback)
%% tower β SMT Beacon
%% "Sidecar" stack β Sidecar Data
%% bar with cells and dots β Bitcoin blocks with Beacon Signals
%% "Q", "inclusion, non-inclusion, gibberish", tall box with 3 parts β the 3 states of the leaf of Stuart
%% faces under the bar β the leaf state for each Beacon Signal
%% stars, papers, "K1" β the update of Stuart (detail on the key rotation page)
%% crossed-out figure β not used
flowchart TD
classDef chain fill:#fff1dd,stroke:#f7931a,stroke-width:2px,color:#4a2a00
classDef agg fill:#efe7fb,stroke:#7e57c2,stroke-width:2px,color:#2e1a4f
classDef sidecar fill:#e3f4e6,stroke:#2e7d32,stroke-width:2px,color:#123d17
classDef ok fill:#e3f4e6,stroke:#2e7d32,color:#123d17
classDef none fill:#f4f4f4,stroke:#777777,color:#333333
classDef bad fill:#fdecea,stroke:#b3261e,color:#7a1d15
Stuart(["Stuart<br/>π§Ύ update: new key"])
Agg["π€ Aggregation Service"]:::agg
SMT@{ shape: cloud, label: "π² SMT<br/>leaf at hash(did)" }
class SMT agg
Beacon["π· SMT Beacon"]:::chain
Sidecar[("π§³ Sidecar Data")]:::sidecar
Satoshi(["Satoshi's resolver"])
subgraph Chain["β Bitcoin blocks"]
direction LR
B1["β"]:::ok --- B2["β"]:::none --- B3["β new key"]:::ok --- B4["β"]:::none --- B5["β"]:::bad
end
subgraph Q["Q: the leaf of Stuart"]
direction TB
Inclusion["β inclusion: apply the update"]:::ok
NonInclusion["β non-inclusion: no update"]:::none
Gibberish["β gibberish: DID invalid"]:::bad
Inclusion ~~~ NonInclusion ~~~ Gibberish
end
Stuart -->|"π leaf value"| Agg
Agg --> SMT
SMT -->|"signed? yes<br/>n of n, or k of n"| Beacon
Beacon -->|"β SMT root"| Chain
Stuart -.->|"π§Ύ update,<br/>π² SMT Proofs"| Sidecar
Sidecar -.-> Satoshi
Chain --> Satoshi
Satoshi --> Q