πŸ“– Protocol V4.0 - Split Architecture Live

How MumbleChat Protocol Works

Native decentralized messaging on Ramestta. V4 Split Architecture: Registry (Identity) + RelayManager (Nodes). Kademlia DHT, STUN/UDP hole punching, X25519+AES-256-GCM encryption.

Protocol Architecture


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   MUMBLECHAT PROTOCOL V4.0 STACK                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                          β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚   β”‚   RamaPay   β”‚     β”‚   Chrome    β”‚     β”‚   Desktop   β”‚   CLIENTS    β”‚
β”‚   β”‚   Android   β”‚     β”‚  Extension  β”‚     β”‚ Relay Node  β”‚               β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚          β”‚                   β”‚                   β”‚                       β”‚
β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β”‚
β”‚                              β–Ό                                           β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚   β”‚                    MumbleChat Core Layer                      β”‚      β”‚
β”‚   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚      β”‚
β”‚   β”‚  β”‚  Crypto    β”‚  β”‚ MessageCodecβ”‚ β”‚ ChatServiceβ”‚              β”‚      β”‚
β”‚   β”‚  β”‚X25519+GCM  β”‚  β”‚ Binary Wire β”‚  β”‚ Orchestratorβ”‚            β”‚      β”‚
β”‚   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚      β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚                              β”‚                                           β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚   β”‚                    P2P Transport Layer                        β”‚      β”‚
β”‚   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚      β”‚
β”‚   β”‚  β”‚ KademliaDHTβ”‚  β”‚ STUN/NAT   β”‚  β”‚ Rate       β”‚  SECURITY   β”‚      β”‚
β”‚   β”‚  β”‚ +Sybil Res.β”‚  β”‚ Traversal  β”‚  β”‚ Limiter    β”‚              β”‚      β”‚
β”‚   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚      β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚                              β”‚                                           β”‚
β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”‚
β”‚          β–Ό                   β–Ό                   β–Ό                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚   β”‚ UDP Direct  β”‚     β”‚   Relay     β”‚     β”‚  Ramestta   β”‚   NETWORK    β”‚
β”‚   β”‚ (Hole Punch)│◄───►│   Nodes     │◄───►│  Blockchain β”‚               β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                                                                          β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚   β”‚              V4 SMART CONTRACT ARCHITECTURE                    β”‚      β”‚
β”‚   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚      β”‚
β”‚   β”‚  β”‚    MCTToken     β”‚  β”‚  Registry V4    β”‚  β”‚ RelayManager β”‚  β”‚      β”‚
β”‚   β”‚  β”‚   (ERC-20)      β”‚  β”‚  (Identity)     β”‚  β”‚   (Nodes)    β”‚  β”‚      β”‚
β”‚   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚      β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚                                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                

πŸ”‘ On-Chain Identity

Your wallet address is your identity. Public keys stored immutably on blockchain.

Registration Flow

// 1. Generate X25519 keypair on device
val keyPair = X25519.generateKeyPair()

// 2. Store public key on-chain
registry.register(
    publicKeyX: keyPair.publicKey,
    displayName: "alice.rama"
)

// 3. Identity now discoverable
// Anyone can lookup your public key by wallet address
                    

Identity Struct (Solidity)

struct Identity {
    bytes32 publicKeyX;      // X25519 public key
    bytes32 publicKeyY;      // Reserved
    uint256 registeredAt;    // Timestamp
    uint256 lastUpdated;     // Key rotation
    bool isActive;           // Active status
    string displayName;      // Optional name
}
                    

Key Features

πŸ” Self-Sovereign

You own your identity. No platform can ban or censor you.

πŸ”„ Key Rotation

Update your public key anytime via updatePublicKey().

πŸ” Discoverable

Anyone can lookup your public key by wallet address.

πŸ” End-to-End Encryption

X25519 ECDH key exchange + AES-256-GCM encryption. Military-grade security.

Encryption Flow


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        ENCRYPTION PROCESS                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                          β”‚
β”‚  SENDER (Alice)                              RECIPIENT (Bob)            β”‚
β”‚  ──────────────                              ──────────────             β”‚
β”‚                                                                          β”‚
β”‚  1. Lookup Bob's public key from blockchain                             β”‚
β”‚     bobPubKey = registry.getPublicKey(bobAddress)                       β”‚
β”‚                                                                          β”‚
β”‚  2. Generate ephemeral keypair                                          β”‚
β”‚     ephemeralKey = X25519.generateKeyPair()                             β”‚
β”‚                                                                          β”‚
β”‚  3. Derive shared secret (ECDH)                                         β”‚
β”‚     sharedSecret = X25519.agree(ephemeralKey.private, bobPubKey)        β”‚
β”‚                                                                          β”‚
β”‚  4. Derive AES key using HKDF                                           β”‚
β”‚     aesKey = HKDF(sharedSecret, salt, info)                             β”‚
β”‚                                                                          β”‚
β”‚  5. Encrypt message with AES-256-GCM                                    β”‚
β”‚     ciphertext = AES_GCM.encrypt(aesKey, nonce, plaintext)              β”‚
β”‚                                                                          β”‚
β”‚  6. Package: [ephemeralPubKey | nonce | ciphertext | authTag]           β”‚
β”‚                                                                          β”‚
β”‚  7. Send to relay node or directly to Bob                               β”‚
β”‚                                                                          β”‚
β”‚  ─────────────────────────────────────────────────────────────────────  β”‚
β”‚                                                                          β”‚
β”‚  Bob receives and:                                                       β”‚
β”‚  1. Uses his private key + ephemeral public key to derive same secret   β”‚
β”‚  2. Decrypts message with AES-256-GCM                                   β”‚
β”‚                                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                
πŸ”‘

X25519 ECDH

Elliptic-curve Diffie-Hellman for secure key exchange. Each message uses a unique ephemeral key for forward secrecy.

πŸ›‘οΈ

AES-256-GCM

Authenticated encryption with 256-bit key. Provides confidentiality AND integrity verification.

πŸ”’

Forward Secrecy

Ephemeral keys ensure past messages stay secure even if long-term keys are compromised.

πŸ“¨ Message Protocol

How messages are structured, routed, and delivered in the MumbleChat network.

Message Structure

data class MumbleChatMessage(
    val version: Int = 1,                    // Protocol version
    val type: MessageType,                   // TEXT, FILE, PAYMENT
    val senderKeyHash: ByteArray,            // keccak256(sender)[:8]
    val recipientKeyHash: ByteArray,         // keccak256(recipient)[:8]
    val ephemeralPubKey: ByteArray,          // 32 bytes
    val nonce: ByteArray,                    // 12 bytes
    val ciphertext: ByteArray,               // Encrypted content
    val authTag: ByteArray,                  // 16 bytes
    val timestamp: Long,                     // Unix millis
    val signature: ByteArray                 // ECDSA signature
)
                

Direct Delivery (P2P)

When recipient is online, messages go directly peer-to-peer.

// 1. Discover peer via DHT
peerInfo = dht.findPeer(recipientAddress)

// 2. Establish libp2p connection
conn = network.dial(peerInfo.multiaddr)

// 3. Send encrypted message
conn.send(encryptedMessage)

// 4. Receive ACK
ack = conn.receive()
                    

Relay Delivery (Offline)

When recipient is offline, relay nodes store messages.

// 1. Peer not found online
if (dht.findPeer(recipient) == null) {

    // 2. Find relay nodes for recipient
    relays = dht.findRelays(recipientKeyHash)
    
    // 3. Send to multiple relays
    relays.forEach { relay ->
        relay.store(encryptedMessage, ttl = 7.days)
    }
}
                    

🌐 Relay Network

Decentralized nodes that store encrypted messages for offline users and earn MCT rewards.


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     RELAY NODE ARCHITECTURE                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                          β”‚
β”‚   SENDER                  RELAY NETWORK                   RECIPIENT     β”‚
β”‚   ──────                  ─────────────                   ─────────     β”‚
β”‚                                                                          β”‚
β”‚   [Alice] ─────────────►  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                               β”‚
β”‚      β”‚    Encrypted       β”‚   Relay A   β”‚  Store for Bob                β”‚
β”‚      β”‚    Message         β”‚  (Gold Tier)│◄──────────────►  [Bob]        β”‚
β”‚      β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚         (offline)     β”‚
β”‚      β”‚                                          β”‚                        β”‚
β”‚      β”‚                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚                        β”‚
β”‚      └──────────────────► β”‚   Relay B   β”‚       β”‚                        β”‚
β”‚           Redundancy      β”‚(Silver Tier)β”‚β—„β”€β”€β”€β”€β”€β”€β”˜         [Bob]         β”‚
β”‚                           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 (online)      β”‚
β”‚                                  β”‚                           β–²          β”‚
β”‚                                  β”‚      Deliver when         β”‚          β”‚
β”‚                                  └───────Bob onlineβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”‚                                                                          β”‚
β”‚   RELAY STORAGE:                                                        β”‚
β”‚   ───────────────                                                       β”‚
β”‚   β€’ recipientKeyHash: First 8 bytes of keccak256(address)               β”‚
β”‚   β€’ encryptedBlob: Opaque to relay (can't read content)                 β”‚
β”‚   β€’ expiresAt: TTL (default 7 days)                                     β”‚
β”‚   β€’ size: For storage tracking                                          β”‚
β”‚                                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜