A common problem in storage systems is guaranteeing that a remote party is storing the data it committed to, with the expected level of redundancy. There is a class of attacks characterized by the storing party pretending to store something $N$ number of times or hold $N$ number of copies, while in reality, storing much less than $N$ and downloading and reconstructing the required pieces on demand from a third party.
For example, a Sybil attacker would control a large number of identities in the network and pretend to store data with some level of redundancy, while in reality, only storing it once. A generation attack would store a subset of the data and only regenerate it on the fly. Both attacks compromise the redundancy of the data and for the purpose of this note, we will refer to them as outsourcing attacks.
The question then is, how do we ensure that the redundancy levels aren't compromised through some version of an outsourcing attack? Or more precisely, how do we ensure that each instance of erasure-coded data is stored in full?
Proofs of Replication
Proof of Replication (PoRep) is a type of proof of storage that combines Proofs of Space and Proofs of Retrievability. Fundamentally, PoRep attempts to demonstrate that there are $K$ unique instances of the exact same data, thereby preventing data deduplication.
However, PoRep is not always suited for erasure-coded systems and arguably has a number of other drawbacks. For example, it relies on complex and computationally heavy mechanisms to achieve its goals.