sequenceDiagram title Node Claim — Pair A publie son PeerRecord (claimInfo + publishPeerRecord) participant DBA as DB Pair A (oc-lib) participant NodeA as Node A participant IndexerA as Indexer (partagé) participant DHT as DHT Kademlia participant NATSA as NATS A NodeA->>DBA: NewRequestAdmin(PEER).Search(SELF) DBA-->>NodeA: existing peer (DID_A) ou nouveau UUID NodeA->>NodeA: LoadKeyFromFilePrivate() → priv A NodeA->>NodeA: LoadKeyFromFilePublic() → pub A NodeA->>NodeA: crypto.MarshalPublicKey(pub A) → pubBytes NodeA->>NodeA: Build PeerRecord A {
Name, DID, PubKey,
PeerID: PeerID_A,
APIUrl: hostname,
StreamAddress: /ip4/.../tcp/4001/p2p/PeerID_A,
NATSAddress, WalletAddress
} NodeA->>NodeA: sha256(json(rec)) → hash NodeA->>NodeA: priv.Sign(hash) → signature NodeA->>NodeA: rec.ExpiryDate = now + 150s loop Pour chaque StaticIndexer (Indexer A, B, …) NodeA->>IndexerA: TempStream /opencloud/record/publish/1.0 NodeA->>IndexerA: json.Encode(PeerRecord A signé) IndexerA->>IndexerA: Verify signature IndexerA->>IndexerA: Check heartbeat stream actif pour PeerID_A IndexerA->>DHT: PutValue("/node/"+DID_A, PeerRecord A) DHT-->>IndexerA: ok end NodeA->>NodeA: rec.ExtractPeer(DID_A, DID_A, pub A) NodeA->>NATSA: SetNATSPub(CREATE_RESOURCE, {PEER, Peer A JSON}) NATSA->>DBA: Upsert Peer A (SearchAttr: peer_id) DBA-->>NATSA: ok NodeA-->>NodeA: *peer.Peer A (SELF)