de-mls 2.1.0

Decentralized MLS — end-to-end encrypted group messaging with consensus-based membership management over gossipsub-like networks
Documentation
// src/protos/messages/v1/application.proto

syntax = "proto3";

package de_mls.messages.v1;

import "hashgraph-like-consensus/v1/consensus.proto";

message AppMessage {
  oneof payload {
    ConversationMessage conversation_message = 1;
    BatchProposalsMessage batch_proposals_message = 2;
    BanRequest ban_request = 3;
    consensus.v1.Proposal proposal = 4;
    consensus.v1.Vote vote = 5;
    VotePayload vote_payload = 6;
    UserVote user_vote = 7;
    ProposalAdded proposal_added = 8;
  }
}

message BanRequest {
  string user_to_ban = 1;
  string group_name = 2;
}

message ConversationMessage {
  bytes message = 1;
  string sender = 2;
  string group_name = 3;
}

message BatchProposalsMessage {
  bytes group_name = 1;
  repeated bytes mls_proposals = 2;  // Individual MLS proposal messages
  bytes commit_message = 3;          // MLS commit message
  repeated uint32 proposal_ids = 4;  // Consensus proposal IDs included in this batch
  bytes proposals_digest = 5;        // SHA-256 over canonical (id, payload) pairs
}

// Yes/No vote for a given proposal. Based on the result, the `Vote` will be created.
message UserVote {
  uint32 proposal_id = 1;
  bool vote = 2;
  string group_name = 3;
}

// Proposal added message is sent to the UI when a new proposal is added to the group.
message ProposalAdded {
  string group_id = 1;
  GroupUpdateRequest request = 2;
}

message GroupUpdateRequest {
  oneof payload {
    InviteMember invite_member = 1;
    RemoveMember remove_member = 2;
  }
}

message InviteMember {
  bytes key_package_bytes = 1;
  bytes identity = 2;
}

message RemoveMember {
  bytes identity = 1;
}

enum Outcome {
  OUTCOME_UNSPECIFIED = 0;
  OUTCOME_ACCEPTED = 1;
  OUTCOME_REJECTED = 2;
}

message VotePayload {
  string group_id = 41;
  uint32 proposal_id = 42;
  bytes payload = 43; 
  uint64 timestamp = 44;
}