🗳️ 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
- Alice commits the add proposal
- MLS generates new group secret K₁
- MLS creates welcome message for Charlie
- Alice sends commit to Bob
- Alice sends welcome to Charlie
- Bob processes commit, gets K₁
- Charlie receives welcome, gets K₁
- 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