Memory-Exhaustion Attack on the Blocklace Byzantine-Repelling Conflict-Free Replicated Data Type


Abstract

The blocklace is a directed acyclic graph encoding the causal relationship between authenticated updates produced by participating nodes. Compared to previous approaches, it adds restrictions on what can be replicated: a new update and its causal history is replicated locally if and only if either 1) it reveals a new node behaving arbitrarily (byzantine), or 2) it was signed by a node that still appears to be correct and the new updates provide evidence incriminating at least the set of nodes locally known to have behaved arbitrarily. The restrictions purport to limit the replication of arbitrary updates, even in the presence of colluders that never produce incriminating evidence, so that only a finite number will eventually be replicated by correct nodes.

While the original description of the replication behaviour successfully achieve this aim, we show that this finite number can be made arbitrarily large, up to the size of the identifier space used to authenticate messages. This effectively enables malicious nodes to overwhelm correct nodes with arbitrary and useless updates. Practical deployments therefore require additional restrictions on the set of identifiers that will be accepted by correct nodes.

1 Introduction↩︎

This attack is best illustrated with a story.

Alice was a compulsive collector of evidence of misbehaviour about anyone, just in case. While this never gave her reassurance that someone she had no record about would remain trustworthy, this way, she nonetheless avoided interacting with anyone that had been publicly caught cheating. Given the evidence she had accumulated over the years and the number of times Alice later confirmed cheaters were typically repeat offenders, her habit had become entrenched and automatic, giving her a partial sense of control over a fundamentally uncertain world.

Noticing this rather peculiar habit, Eve decided to prank Alice. Eve created fictive online accounts of people and published incriminating evidence under their identity, making sure in the process that Alice came into contact with the posts. Visiting Alice on a week-end, Eve amusingly found every available surface of the apartment covered in paper copies of posts marked in red.

After a few more months of pranking, the initial entertainment had vanished and Eve decided Alice was irremediably crazy. Before leaving, Eve contemptuously stole pocket change from Alice, right in front of her. In a sadistic turn of events, Eve came back every morning to drop a new stack of records on Alice’s front door, that Alice couldn’t help but bring inside, just in case. The story goes that Alice died of a thousand paper cuts when the precarious piles of evidence eventually collapsed on her.

We now formally describe the attack.

2 Preliminaries↩︎

The original paper describes updates as blocks [1]: we use both interchangeably. The causal history of an update \(b\), \(\mathcal{H}(b)\), is the set of updates including \(b\) that is transitively reachable from \(b\).

Updates are authenticated, i.e. signed using the identity of the node that created it. Updates may be created by correct, byzantine, or colluder nodes. A correct node only creates valid and sequential updates. Byzantine nodes may create invalid updates or two updates that are concurrent. Colluders only create valid and sequential updates but selectively ignore incriminating updates from byzantine nodes. Given a set of updates \(B\), the set of byzantine nodes \(\textit{byz}(B)\) is the subset of identities with incriminating evidence in \(B\).

3 Byzantine Repellance↩︎

The original paper defines the byzantine-repellance property structurally, as a predicate over sets of updates. As a base case, an empty set of updates is said to be byzantine repelling. All possible byzantine repellant sets of updates can be obtained inductively, using the following invariant embedded in the original definition:

Definition 1 (Byzantine Repellance – Acceptance Invariant). Assume \(B\) is a byzantine-repellant blocklace. The causal history \(\mathcal{H}(b)\) of a new update \(b\) will be merged locally, forming a new byzantine repellant blocklace \(B' = B \cup \mathcal{H}(b)\), if and only if either:

  1. \(\text{byz}(B' \backslash \{ b \}) \subset \text{byz}(B')\)

  2. \(\text{node}(b) \notin \text{byz}(B') \wedge \text{byz}(B) \subseteq \text{byz}(\mathcal{H}(b))\)

In plain English: either the update \(b\) itself provides evidence for incriminating a new node as byzantine,1 or there no known evidence (in \(B'\)) that the author of \(b\) is byzantine and the causal history of \(b\) includes incriminating evidence for at least the byzantine nodes previously known from \(B\).

The first disjunct allows gathering any evidence of byzantine behaviour from any node. This is analogous to Alice continuing to collect misbehaviour reports from Eve, even after Eve demonstrably cheated Alice. Restricting the collection of equivocation evidence from correct nodes would still guarantee eventual repellence. However, other kinds of evidence, such as invalid updates, may never be replicated.

The second disjunct enforces the repellance of updates from byzantine nodes and colluders. An update from any known byzantine node \(q\) will be rejected because of the first conjunct. An update from a colluder, which purposefully avoids causally linking to updates that might incriminate \(q\), will be rejected because the set of byzantine nodes locally known, i.e. \(\text{byz}(B)\), is strictly larger than the one that can be obtained from the colluder’s update, i.e. \(\text{byz}(\mathcal{H}(b))\).

We now show how byzantine nodes or colluders may overwhelm correct nodes, even with these restrictions in place.

4 Memory Exhaustion Attack↩︎

The attack works by providing incriminating evidence for new nodes that were not known before by correct nodes. An attacker generates a new identity and has that identity incriminate itself by producing an invalid or equivocating update.

The attacker now simply provides this update as new incriminating evidence to a correct node. Because disjunct (1) in Def. 1 is true, the correct node will accept the update and grow the set of replicated updates. The attacker keeps repeating with new identities. A set of attackers may even parallelize the attack. Given a sufficiently large identifier space, the memory used by the invalid updates will completely fill the available local storage, preventing a correct node from storing any new updates from correct nodes.

The attacker may also include some of their own updates during replication by having the evidence being only transitively reachable. The updates may also include large files to lower the number of required interactions.

The attack works whether a known byzantine node or colluder performs it, since disjunct (1) does not verify the author. The attack would still work even if disjunct (1) was not used and only disjunct (2) was used to define the byzantine-repellance property: it would however require colluders to participate in disseminating evidence transitively through their own updates.

This attack can be seen as a variation of a Sybil attack [2]. The reason it works is that correct nodes eagerly keep any incriminating evidence about any valid identity.

5 Discussion↩︎

While making the original definition of a blocklace impractical, this attack does not invalidate any of the results previously obtained. The main result still holds:

Theorem 1 (Finite Harm [1]). If \(p\) is correct and there is public evidence that \(q\) is Byzantine then \(p\) will eventually stop including \(q\)-blocks in its blocklace.

However, this is eventually true only once an attacker stops using new identifiers, either willfully or because none are left in the identifier space.

6 Mitigation↩︎

The obvious solution to mitigate the problem is to limit the set of identifiers correct nodes will consider replicating updates from. In the previous story, Alice would simply have had to care only about collecting evidence on her immediate social circle and ignore people she does not interact with. When considering interacting with a new person, she could seek evidence from her existing social network before choosing to interact directly. Such a solution is a generalization of the interest-driven replication approach initially adopted by Secure-Scuttlebutt to curtail spam [3]. We leave the design of a complete complementary mechanism for future work.

7 Related Work↩︎

Signed hash graphs encoding the causal relationship of updates from nodes that are potentially byzantine appear in many designs [4][8]. 2P-BFT-Log first proposed byzantine fault-tolerant logs that converge to the longest sequential prefix of updates from a single author in the presence of equivocation [7], but conservatively reject any updates after and did not handle collusion. The blocklace [1] followed and first proposed a byzantine repelling criteria to bound the number of updates following a proven equivocation, including those submitted by colluders.

Bounded Byzantine CRDT [9] limit the rate at which updates may be produced by a computationally bounded adversary, by requiring solving a computationally expensive cryptographic task to produce an update, a so called proof-of-work. Combining this approach with a blocklace may limit the rate at which memory may be consumed on correct nodes but does not limit the total amount.

We thank Prof. Christian Tschudin for providing significant freedom in choosing research problems and allowing us to claim sole authorship of the paper. We also thank Swiss tax payers for funding the position.

References↩︎

[1]
Paulo Sérgio Almeida Ehud Shapiro.2025. The Blocklace: A Byzantine-repelling and Universal Conflict-free Replicated Data Type (v4).  [cs.DC].
[2]
John R. Douceur.2002. . In Peer-to-Peer Systems, Peter Druschel, Frans Kaashoek, and Antony Rowstron(Eds.). Springer Berlin Heidelberg, Berlin, Heidelberg, 251–260.
[3]
Anne-Marie Kermarrec, Erick Lavoie, and Christian Tschudin.2021. . In Proceedings of the 1st International Workshop on Distributed Infrastructure for Common Good(Delft, Netherlands) (DICG’20). ACM, New York, NY, USA, 19–24. https://doi.org/10.1145/3428662.3428794.
[4]
Martin Kleppmann Heidi Howard.2020. Byzantine Eventual Consistency and the Fundamental Limits of Peer-to-Peer Databases.  [cs.DC].
[5]
Florian Jacob, Luca Becker, Jan Grashöfer, and Hannes Hartenstein.2020. . In Proceedings of the 25th ACM Symposium on Access Control Models and Technologies(Barcelona, Spain) (SACMAT ’20). ACM, New York, NY, USA, 81–92. https://doi.org/10.1145/3381991.3395399.
[6]
Hector Sanjuan, Samuli Poyhtari, Pedro Teixeira, and Ioannis Psaras.2020. Merkle-CRDTs: Merkle-DAGs meet CRDTs.  [cs.NI].
[7]
Erick Lavoie.2023. 2P-BFT-Log: 2-Phase Single-Author Append-Only Log for Adversarial Environments.  [cs.DC].
[8]
Florian Jacob Hannes Hartenstein.2024. . In Proceedings of the 11th Workshop on Principles and Practice of Consistency for Distributed Data(Athens, Greece) (PaPoC ’24). ACM, New York, NY, USA, 37–43. https://doi.org/10.1145/3642976.3653034.
[9]
Carlos Baquero, Francisco Maia, Abel Dantas, Antonio Fernández Anta, Davide Frey, César Sánchez, and Timothé Albouy.2026. . In Proceedings of the 13th International Workshop on Principles and Practice of Consistency for Distributed Data(PaPoC ’26). ACM, New York, NY, USA, 17–24. https://doi.org/10.1145/3806077.3806698.

  1. This may include the author of \(b\), possibly because of a moment of hubris.↩︎