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

Speed up JSON load in slashing protection import #2347

Closed

Conversation

michaelsproul
Copy link
Member

Issue Addressed

One of our users had trouble exporting slashing protection data from Prysm to Lighthouse, and it turns out that Lighthouse was very slow at loading the JSON (for the related Prysm issue see prysmaticlabs/prysm#8893).

Proposed Changes

The reason for the slowness is that serde_json::from_reader isn't as heavily optimised as other deserialisation methods, as described here: serde-rs/json#160. Instead of from_reader, the import function now reads the entire JSON object into memory and deserialises that. I think this is a reasonable tradeoff, as import JSON files should be reasonably sized (less than system memory 🤞) due to pruning.

Marking this as WIP while I run the import on a modified version of the failing 1.2GB file (it's still taking a long time...).

@michaelsproul michaelsproul added work-in-progress PR is a work-in-progress low-hanging-fruit Easy to resolve, get it before someone else does! labels May 18, 2021
@michaelsproul
Copy link
Member Author

Damn, I ran this for an hour and it didn't complete.

I think our processing is also too slow. I'm going to switch back to Altair for now, but will come back to this and try to add a mode than minifies the file upon import (shrinks it to just one relevant entry per validator).

@michaelsproul michaelsproul removed the low-hanging-fruit Easy to resolve, get it before someone else does! label May 18, 2021
@michaelsproul
Copy link
Member Author

Closing for now in favour of #2354

bors bot pushed a commit that referenced this pull request Jun 21, 2021
## Issue Addressed

Closes #2354

## Proposed Changes

Add a `minify` method to `slashing_protection::Interchange` that keeps only the maximum-epoch attestation and maximum-slot block for each validator. Specifically, `minify` constructs "synthetic" attestations (with no `signing_root`) containing the maximum source epoch _and_ the maximum target epoch from the input. This is equivalent to the `minify_synth` algorithm that I've formally verified in this repository:

https://github.com/michaelsproul/slashing-proofs

## Additional Info

Includes the JSON loading optimisation from #2347
@michaelsproul michaelsproul deleted the slashing-interchange-import branch September 21, 2021 05:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
work-in-progress PR is a work-in-progress
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant