Skip to main content

🗳️ Voting on Changes

Proposals and Commits Explained

In 10 minutes: How MLS makes group decisions democratically
Prerequisite: Epochs, Key rotation


🎯 The Simple Story

Imagine a group of friends deciding on dinner:

Alice says: "Pizza?" Bob says: "Sushi?" Charlie says: "Tacos?"

Everyone votes, then they make a decision and go eat

MLS works the same way with proposals and commits.


🧠 Mental Model

Hold this picture in your head:

Proposals and Commits:

PROPOSALS (Suggestions):
┌──────────────────────────────────┐
│ Alice: Let's add David to group│
│ Bob: Let's update our keys │
│ Charlie: Let's remove Eve │
│ (Everyone hears suggestions) │
└──────────────────────────────────┘

COMMIT (Decision):
┌──────────────────────────────────┐
│ Group decision: │
│ ✓ Add David │
│ ✓ Bob gets David's key package │
│ ✓ Send welcome to David │
│ (Everyone executes the same thing) │
└──────────────────────────────────┘

📊 See It Happen


🎭 Types of Proposals

MLS has 3 main proposal types:

1. Add Proposal

Alice: Let's add Charlie to the group

Proposal:
├─ Proposer: Alice
├─ Type: add
└─ Include: Charlie's key package

Commit:
├─ Alice executes the add
├─ MLS generates new group secret
├─ MLS creates welcome message
├─ Welcome sent to Charlie
└─ Epoch increments (new version)

2. Remove Proposal

Alice: Let's remove Charlie (he left the company)

Proposal:
├─ Proposer: Alice
├─ Type: remove
└─ Remove: Charlie's leaf index

Commit:
├─ Alice executes the remove
├─ MLS generates new group secret
├─ MLS updates ratchet tree
├─ Charlie removed from tree
└─ Epoch increments

3. Update Proposal

Alice: I think my phone was hacked, let's update keys

Proposal:
├─ Proposer: Alice
├─ Type: update (internal)
└─ No external info needed

Commit:
├─ Alice executes internal update
├─ MLS generates new group secret
├─ MLS updates ratchet tree secrets
└─ Epoch increments

🔄 The Proposal → Commit Flow

Step-by-Step


🎮 Try It Yourself

Question 1: Alice creates a proposal to add Charlie. She commits it. What happens? (Choose all that apply)

Show Answer
  1. Alice commits the add proposal
  2. MLS generates new group secret K₁
  3. MLS creates welcome message for Charlie
  4. Alice sends commit to Bob
  5. Alice sends welcome to Charlie
  6. Bob processes commit, gets K₁
  7. Charlie receives welcome, gets K₁
  8. Everyone in sync

Answer: All of the above


Question 2: Bob creates a remove proposal to remove Charlie (who left). Alice commits it. What's Charlie's state after the commit?

Show Answer This

Before commit:

  • Group: Alice, Bob, Charlie
  • Group secret: K₀
  • Charlie has K₀

Commit:

  • Remove proposal executed
  • Charlie removed from ratchet tree
  • New group secret K₁ generated
  • Alice, Bob update to K₁
  • Commit sent to existing members (Alice, Bob)

Charlie's state:

  • Has old key K₀
  • Can't get new key K₁ (removed from tree)
  • Tries K₀ on new messages → Fails
  • Can't read any new messages

Answer: Charlie cannot read any new messages after removal


Question 3: What's the difference between a proposal and a commit?

Show Answer

Proposal:

  • Suggestion from a member
  • "Let's add Charlie"
  • "Let's remove David"
  • "Let's update keys"
  • Not executed yet

Commit:

  • Execution of the proposal
  • Changes actually made
  • Ratchet tree updated
  • New group secret generated
  • Welcome message created (if adding)

Answer: Proposal = suggestion, Commit = execution


💡 Why Proposals and Commits?

Problem: Multiple Simultaneous Changes

Without proposals/commits:

Alice, Bob, Charlie all try to add new members at the same time

Alice: Adds David
Bob: Adds Eve
Charlie: Adds Frank

Result: CHAOS
- Who executes first?
- What order?
- What group state?

→ Conflicts, inconsistency, security issues

With proposals/commits:

Alice, Bob, Charlie all propose adding members

Proposals sent:
- Alice: Add David
- Bob: Add Eve
- Charlie: Add Frank

ONE commit created (by Alice):
- Execute all proposals
- Generate one new group secret
- Welcome messages for all
- Epoch increment once
- Consistent state

→ No conflicts, everyone in sync

✅ Quick Check

Can you explain proposals and commits to a 5-year-old?

Try saying this out loud:

"A proposal is like suggesting we get pizza for dinner. A commit is when everyone agrees and orders the pizza. The proposal is the idea, the commit is doing it"


🎓 Key Takeaways

Proposal = Suggestion from member
Commit = Execution of proposals
Add proposal = Add new member
Remove proposal = Remove member
Update proposal = Key rotation
Commit executes new group secret, welcome, epoch increment
Consistency = Everyone executes same commit


Now you understand proposals and commits. Next: Welcome messages - the VIP ticket for new members