Member Storage in BrightChain
Overview
Member data is split across two CBLs to separate public and private information, with an index system for efficient lookups.
sequenceDiagram
participant Member as Member
participant MCS as MemberCblService
participant Store as DiskBlockAsyncStore
Member->>MCS: Provide member data for CBL creation
MCS->>MCS: Convert member data to JSON
MCS->>MCS: Split JSON into blocks and generate random blocks
MCS->>Store: Store block data via setData
Store-->>MCS: Acknowledge block storage
MCS->>MCS: Compute metadata and assemble Constituent Block List
MCS-->>Member: Return CBL for member document
Storage Structure
1. Public Member CBL
interface PublicMemberData {
// Identity
id: GuidV4;
type: MemberType;
name: string;
dateCreated: Date;
dateUpdated: Date;
// Public Keys
publicKey: Buffer;
votingPublicKey: PublicKey;
// Network Status
status: MemberStatusType;
lastSeen: Date;
reputation: number;
// Storage Metrics
storageContributed: number;
storageUsed: number;
// Geographic
region?: string;
geographicSpread?: number;
}
2. Private Member CBL
interface PrivateMemberData {
// Identity
id: GuidV4;
contactEmail: EmailString;
// Security
recoveryData?: Buffer;
// Network
trustedPeers: GuidV4[];
blockedPeers: GuidV4[];
// Preferences
settings: {
autoReplication: boolean;
minRedundancy: number;
preferredRegions: string[];
};
// History
activityLog: {
timestamp: Date;
action: string;
details: any;
}[];
}
3. Member Index
interface MemberIndex {
entries: Map<
GuidV4,
{
publicCBL: ChecksumBuffer;
privateCBL: ChecksumBuffer;
status: 'ACTIVE' | 'INACTIVE' | 'SUSPENDED';
lastUpdate: Date;
}
>;
// Lookup indices
byRegion: Map<string, Set<GuidV4>>;
byStatus: Map<string, Set<GuidV4>>;
byReputation: SortedSet<{
memberId: GuidV4;
reputation: number;
}>;
}
Member References
When referring to members in documents, use a lightweight reference:
interface MemberReference {
id: GuidV4;
type: MemberType;
dateVerified: Date;
publicCBL?: ChecksumBuffer; // Optional cached reference
}
Storage Operations
1. Member Creation
- Generate member keys and data
- Create public CBL with basic info
- Create private CBL with sensitive data
- Add entry to member index
- Return member reference
2. Member Lookup
- Check local cache for member data
- If not found, query member index
- Fetch public CBL
- Fetch private CBL if authorized
- Return hydrated member object
3. Member Update
- Load existing CBLs
- Create new CBLs with updated data
- Update index with new CBL references
- Propagate changes to network
Index Distribution
The member index is distributed across the network:
-
Sharding
- Primary shard by region
- Secondary shard by member ID range
- Each node maintains complete shard for its region
-
Replication
- Each shard replicated across multiple nodes
- Minimum 3 copies per shard
- Geographic distribution of replicas
-
Updates
- Changes propagated through gossip protocol
- Version vector for conflict resolution
- Periodic full sync between nodes
Implementation
1. Member Store
interface MemberStore {
// Basic operations
createMember(data: NewMemberData): Promise<MemberReference>;
getMember(id: GuidV4): Promise<Member>;
updateMember(id: GuidV4, changes: Partial<MemberData>): Promise<void>;
// Index operations
updateIndex(entry: MemberIndexEntry): Promise<void>;
queryIndex(criteria: QueryCriteria): Promise<MemberReference[]>;
// Sync operations
syncShard(region: string): Promise<void>;
propagateChanges(changes: MemberChanges[]): Promise<void>;
}
2. Hydration
interface MemberHydrator {
// Convert between formats
referenceToMember(ref: MemberReference): Promise<Member>;
memberToReference(member: Member): MemberReference;
// Cache management
cachePublicData(id: GuidV4, data: PublicMemberData): void;
invalidateCache(id: GuidV4): void;
}
Benefits
-
Security
- Sensitive data separated from public data
- Granular access control
- Encrypted private data
-
Performance
- Efficient lookups via index
- Minimal data transfer for references
- Local caching of public data
-
Scalability
- Distributed index
- Regional sharding
- Efficient updates
-
Flexibility
- Easy to add new member attributes
- Support for different member types
- Extensible index structure
Would you like to proceed with implementing this design?