Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tendermint main fix byzzfuzz partitions #168

Merged
merged 82 commits into from
Mar 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
721ac20
Initial commit for tendermint
Nov 18, 2024
f9b955c
Work in progress: Another attempt at implementation. Needs to be test…
AFNowakowski Nov 18, 2024
7b3986d
Work in progress: Delete for merge of different implementation
AFNowakowski Nov 19, 2024
7f950d1
Merge branch 'tendermint-2' into Tendermint
AFNowakowski Nov 19, 2024
af86a7e
Allow for scrolling of the Schedule component when the specific detai…
AFNowakowski Nov 19, 2024
4a35cba
Some more comments, fixes
AFNowakowski Nov 19, 2024
00812c6
Commit to access on different device
Nov 25, 2024
7aed52f
Continue implementation. Has to finish
AFNowakowski Nov 25, 2024
41a9470
Further implemented following pseudocode. needs bugfixes
AFNowakowski Nov 27, 2024
1fd4f80
Implemented gossip messages
AFNowakowski Nov 29, 2024
f69e95f
Commit before refactor in case things go south
AFNowakowski Nov 29, 2024
17fa5c2
Accidentally commited this so reverted
AFNowakowski Nov 29, 2024
3f38f5f
Commit to transfer to other machine
AFNowakowski Dec 2, 2024
f1ced32
Commit to transfer to other machine
AFNowakowski Dec 2, 2024
a77aa3c
Commit to access on different device
Dec 2, 2024
492e6e7
Further fixes
AFNowakowski Dec 2, 2024
42c1e4e
Further implementation
AFNowakowski Dec 3, 2024
29933ae
Further implementation
AFNowakowski Dec 4, 2024
f89830a
Remove unnecessary logging, change some messages
Dec 4, 2024
6306bd2
Refactor, implement random selection.
Dec 6, 2024
36e0e20
Change random selection so it's random order
Dec 7, 2024
a23d847
Merge branch 'main' into Tendermint
Dec 8, 2024
f1df8b9
WIP
Dec 8, 2024
b59e2cc
WIP
Dec 8, 2024
0f558b0
WIP
Dec 8, 2024
a7b06ff
Merge branch 'main' into Tendermint
AFNowakowski Dec 9, 2024
52b31e8
Work in progress
AFNowakowski Dec 9, 2024
54d4499
Work in progress
AFNowakowski Dec 11, 2024
4b20a53
Merge branch 'main' into Tendermint
Dec 18, 2024
6982701
WIP - implement mempool
Dec 18, 2024
a31f0e0
First timeout checkpoint, broken
Dec 18, 2024
4a9104a
second timeout checkpoint, broken
Dec 18, 2024
f672b85
more timeout work, still doesn't schedule correctly
Dec 18, 2024
cf161af
Make timeouts function better
Dec 19, 2024
7712d25
Use the same round in order to fix nondeterminism when shuffling
Dec 30, 2024
47c5f68
Refactor Proposals to allow for random order execution
Dec 30, 2024
b245510
Refactor Prevotes and precommits
Dec 30, 2024
1ca9d94
First attempt at test doesn't work
Dec 30, 2024
b7e3029
copy and change mutations for proposal messages accordingly
Dec 30, 2024
d53f427
Checkpoint, it's WIP
Dec 30, 2024
280ef8a
agreement violation fixes
Dec 30, 2024
9072e18
Small fixes
Dec 30, 2024
9f35309
Small fixes
Dec 30, 2024
b6303fd
just application.yml changes
Dec 31, 2024
c49093d
Work in progress
AFNowakowski Jan 5, 2025
51c6a57
Work in progress
AFNowakowski Jan 6, 2025
9353a41
checkpoint
Jan 6, 2025
937be66
checkpoint, remove height and round from block
Jan 6, 2025
44bfe61
Removed unnecessary logging
AFNowakowski Jan 6, 2025
73a9089
Merge branch 'refs/heads/main' into Tendermint/refactor
AFNowakowski Jan 6, 2025
e0c52a1
Merged main, added some abstract methods
AFNowakowski Jan 6, 2025
1a3b53d
Merge branch 'main' into Tendermint/refactor
AFNowakowski Jan 8, 2025
b76bca8
Fixed the bug apparently, no errors
AFNowakowski Jan 8, 2025
5bc9b16
Add mutators for precommit and prevote messages
AFNowakowski Jan 8, 2025
550e1c0
Fix descriptions
AFNowakowski Jan 8, 2025
749b4b9
Added any scope mutations and fixed a bug
AFNowakowski Jan 13, 2025
0885274
Changed application.yml
AFNowakowski Jan 13, 2025
aec2617
Merge branch 'main' into Tendermint/main
AFNowakowski Jan 13, 2025
18cee92
Merge branch 'main' into Tendermint/main
AFNowakowski Jan 14, 2025
1beb91a
Fixed bug
AFNowakowski Jan 14, 2025
8cd969b
Fixed bug
AFNowakowski Jan 15, 2025
bdb4980
Merge branch 'refs/heads/main' into Tendermint/main
AFNowakowski Jan 22, 2025
73cdb16
no bug
AFNowakowski Jan 22, 2025
30d6dcc
introduce bug
AFNowakowski Jan 22, 2025
4e7afa6
Fixed a bug. Trying to make partitions heal
AFNowakowski Jan 22, 2025
7288025
Changed rounds to sequence numbers. Made rounds align with ByzzFuzz
Jan 23, 2025
95c1625
Changed rounds to sequence numbers. Made rounds align with ByzzFuzz
Jan 23, 2025
ed4f0f3
ui: scrollable dropped messages in reverse order
joaomlneto Jan 23, 2025
03dee8e
Router: function to get reverse mappings of partitions to nodes
joaomlneto Jan 23, 2025
645d297
ByzzFuzz network faults: drop messages instead of setting node partit…
joaomlneto Jan 23, 2025
ff4b5f9
More changes from round to seq
Jan 23, 2025
d72990c
Merge branch 'tendermint-main' into tendermint-main-fix-byzzfuzz-part…
Jan 23, 2025
dac415c
Fix messages dropping twice in partition
Jan 23, 2025
2e14273
Made the replicas track the total amount of sequences
Jan 23, 2025
9d61ae4
Commit current changes. Still have errors
Jan 23, 2025
e3315fa
Merge branch 'main' into tendermint-main-fix-byzzfuzz-partitions
Jan 23, 2025
a3d2683
Merge branch 'main' into tendermint-main-fix-byzzfuzz-partitions
joaomlneto Mar 3, 2025
2b657e9
Update TendermintReplica.java
joaomlneto Mar 3, 2025
2c4fd09
Update ByzzBenchConfig.java
joaomlneto Mar 3, 2025
748ec99
RandomScheduler: remove workaround for Tendermint gossip
joaomlneto Mar 3, 2025
944e5ce
Merge pull request #169 from joaomlneto/tendermint-20250303
joaomlneto Mar 3, 2025
fffdcd9
Update RandomScheduler.java
joaomlneto Mar 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions simulator/src/main/java/byzzbench/simulator/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import lombok.extern.java.Log;

import java.io.Serializable;
import java.time.Duration;
Expand All @@ -22,6 +23,7 @@
@Getter
@SuperBuilder
@RequiredArgsConstructor
@Log
public class Client implements Serializable, Node {
/**
* The scenario object that this client belongs to.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
package byzzbench.simulator.protocols.tendermint;

import byzzbench.simulator.protocols.tendermint.message.*;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;

import java.util.*;
import java.util.stream.Collectors;

@Log
@RequiredArgsConstructor
public class MessageLog {
private final TendermintReplica node;

@Getter
private final SortedMap<String, SortedSet<GenericMessage>> receivedMessages = new TreeMap<>();

@Getter
private final SortedSet<GenericMessage> sentMessages = new TreeSet<>();

@Getter
private final SortedMap<Block, List<PrevoteMessage>> prevotes = new TreeMap<>();
@Getter
private final SortedMap<Block, List<PrecommitMessage>> precommits = new TreeMap<>();
@Getter
private final SortedMap<Block, List<ProposalMessage>> proposals = new TreeMap<>();

@Getter
private final Set<RequestMessage> requests = new HashSet<>();

public static final Block NULL_BLOCK = new Block(Long.MIN_VALUE, "NULL VALUE", null);

@Getter
private long proposalCount = 0;
@Getter
private long prevotesCount = 0;
@Getter
private long precommitCount = 0;

/**
* Adds a message to the message log, maintaining the appropriate mappings.
*
* @param voteMessage the message to add
* @return true if the message was added successfully (not seen before), false otherwise
*/
public boolean addMessage(GenericMessage voteMessage) {
// Get the set of received messages for the author
SortedSet<GenericMessage> authorMessages = receivedMessages
.computeIfAbsent(voteMessage.getAuthor(), k -> new TreeSet<>());

// Check if the message already exists
boolean isNewMessage = authorMessages.add(voteMessage);

if (!isNewMessage) {
// Message already exists, return false
return false;
}

// Process the message based on its type
Block block = voteMessage.getBlock() == null ? NULL_BLOCK : voteMessage.getBlock();

switch (voteMessage) {
case PrevoteMessage prevoteMessage -> {
prevotes.computeIfAbsent(block, k -> new ArrayList<>()).add(prevoteMessage);
prevotesCount++; // Increment prevote count
}
case PrecommitMessage precommitMessage -> {
precommits.computeIfAbsent(block, k -> new ArrayList<>()).add(precommitMessage);
precommitCount++; // Increment precommit count
}
case ProposalMessage proposalMessage -> {
proposals.computeIfAbsent(block, k -> new ArrayList<>()).add(proposalMessage);
proposalCount++; // Increment proposal count
}
default -> {
// No action needed for other message types
}
}

return true; // Successfully added a new message
}

/**
* Returns the total number of messages stored.
*/
public long getMessageCount() {
return receivedMessages.values().stream().mapToLong(Set::size).sum();
}

/**
* Checks if a block has enough prevotes.
*/
public boolean hasEnoughPreVotes(Block block) {
return prevotes.getOrDefault(block, Collections.emptyList()).size() >= 2 * node.getTolerance() + 1;
}

/**
* Checks if a block has enough precommits.
*/
public boolean hasEnoughPreCommits(Block block) {
return precommits.getOrDefault(block, Collections.emptyList()).size() >= 2 * node.getTolerance() + 1;
}

/**
* Gets the count of prevote messages for a specific block.
*/
public int getPrevoteCount(Block block) {
return prevotes.getOrDefault(block, Collections.emptyList()).size();
}

/**
* Checks if there are f+1 messages in a specific sequence after a given sequence.
*/
public boolean fPlus1MessagesInSequence(long height, long sequence) {
// Flatten the received messages map and filter by height and sequence > sequence
Map<Long, Long> sequenceMessageCounts = receivedMessages.values().stream()
.flatMap(Set::stream) // Flatten all sets of messages into a single stream
.filter(m -> m.getHeight() == height && m.getSequence() > sequence) // Apply filters
.collect(Collectors.groupingBy(GenericMessage::getSequence, Collectors.counting())); // Group by sequence and count

// Check if any sequence group has at least f + 1 messages
return sequenceMessageCounts.values().stream()
.anyMatch(count -> count >= node.getTolerance() + 1);
}

public void bufferRequest(RequestMessage request) {
requests.add(request);
}

public void removeRequest(Block block) {
Set<RequestMessage> toDelete = requests.stream().filter(r -> r.getOperation() == block.getRequestMessage().getOperation()).collect(Collectors.toSet());
for (RequestMessage d : toDelete){
requests.remove(d);
}
}

public void clear(Block block) {
// messages.clear();
prevotes.remove(block);
prevotes.remove(NULL_BLOCK);
precommits.remove(block);
precommits.remove(NULL_BLOCK);
proposals.remove(block);
precommitCount = 0;
prevotesCount = 0;
proposalCount = 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package byzzbench.simulator.protocols.tendermint;

public enum Step implements Comparable<Step> {
PROPOSE,
PREVOTE,
PRECOMMIT,
}
Loading