Provers listen for these `ProofSigned` messages from the validators, and once
they accumulated enough *signature*s from validators to represent > 2/3 stake,
they create a *combined signature* and broadcast `ProofValidated(slot id,
period, inputs, combined signature)`:
ProofValidated
prover ------------------.
|
|
v watcher
watcher
watcher
### Missing proofs ###
Watchers monitor the on-chain marketplace to check which slots require a storage
proof to be submitted and what the public *inputs* for the proof are. For each
required proof they then monitor the gossipsub network for `ProofValidated`
messages. If they do not observe a `ProofValidated` message that is signed by >
2/3 stake before the end of the period with the expected *slot id*, *period* and
*inputs* parameters, then they will broadcast a `SubmitMissed(slot id, period,
inputs)` message.
validator
.--------------------> validator
|
| validator
|
SubmitMissed |
|
watcher
Upon receiving a `SubmitMissed(slot id, period, inputs)` message a validator
checks that the *period* has ended and that it hasn't already sent out a
`ProofSigned` message for the *slot id*, *period* and *inputs*. If it indeed
did not, then it will sign and broadcast a `MissedSigned(slot id, period,
inputs, signature)`.
validator
MissedSigned
.--------------------- validator
|
| validator
|
|
v
watcher
When the watcher receives enough *signature*s to represent > 2/3 stake it can
combine these signatures into a single *combined signature*. The watcher can
then submit *slot id*, *period*, *inputs* and *combined signature* to the
marketplace.
The marketplace will then verify the correctness of *inputs* for the *slot id*
and *period*, and checks that the *combined signature* is representative for >
2/3 stake. If these conditions are met, it will then slash the storage provider
collateral and reward the watcher.
### Faulty proofs ###
The storage proofs that a prover submits can be faulty for a number of reasons:
1. The zero knowledge *proof* is incorrect
2. The submitted *period* is not the current time period
3. The public *inputs* to the proof do not match the values from the on-chain
marketplace
Faults 1 and 2 are caught by the validators. Correct validators will not sign
off on invalid zero-knowledge *proofs*, or on a *period* that is not the current
time period. This means that it is not possible to construct a `ProofValidated`
message with a *combined signature* representing > 2/3 stake. Watchers and
Validators are now free to treat the proof as missing, and go through the same
flow that we described in the previous section.
Fault 3 is caught by the watchers and the on-chain marketplace. Watchers will
look for a `ProofValidated` that has the same *inputs* as specified by the
marketplace. If it doesn't find it because the prover broadcast a
`ProofValidated` with a different value for *inputs*, then it will treat the proof as missing, and go through the same flow as in the previous section.
Consensus
---------
The core of our design consists of the fact that correct validators either sign