Indexed att on disk (#35)

* indexed att on disk

* fix lints

* Update slasher/src/migrate.rs

Co-authored-by: ethDreamer <37123614+ethDreamer@users.noreply.github.com>

---------

Co-authored-by: Lion - dapplion <35266934+dapplion@users.noreply.github.com>
Co-authored-by: ethDreamer <37123614+ethDreamer@users.noreply.github.com>
This commit is contained in:
realbigsean
2024-06-18 11:10:32 -04:00
committed by dapplion
parent 45d007a71f
commit 9e84779522
4 changed files with 46 additions and 10 deletions

View File

@@ -239,6 +239,38 @@ mod quoted_variable_list_u64 {
} }
} }
#[derive(Debug, Clone, Encode, Decode, PartialEq)]
#[ssz(enum_behaviour = "union")]
pub enum IndexedAttestationOnDisk<E: EthSpec> {
Base(IndexedAttestationBase<E>),
Electra(IndexedAttestationElectra<E>),
}
#[derive(Debug, Clone, Encode, PartialEq)]
#[ssz(enum_behaviour = "union")]
pub enum IndexedAttestationRefOnDisk<'a, E: EthSpec> {
Base(&'a IndexedAttestationBase<E>),
Electra(&'a IndexedAttestationElectra<E>),
}
impl<'a, E: EthSpec> From<&'a IndexedAttestation<E>> for IndexedAttestationRefOnDisk<'a, E> {
fn from(attestation: &'a IndexedAttestation<E>) -> Self {
match attestation {
IndexedAttestation::Base(attestation) => Self::Base(attestation),
IndexedAttestation::Electra(attestation) => Self::Electra(attestation),
}
}
}
impl<E: EthSpec> From<IndexedAttestationOnDisk<E>> for IndexedAttestation<E> {
fn from(attestation: IndexedAttestationOnDisk<E>) -> Self {
match attestation {
IndexedAttestationOnDisk::Base(attestation) => Self::Base(attestation),
IndexedAttestationOnDisk::Electra(attestation) => Self::Electra(attestation),
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@@ -176,7 +176,8 @@ pub use crate::fork_versioned_response::{ForkVersionDeserialize, ForkVersionedRe
pub use crate::graffiti::{Graffiti, GRAFFITI_BYTES_LEN}; pub use crate::graffiti::{Graffiti, GRAFFITI_BYTES_LEN};
pub use crate::historical_batch::HistoricalBatch; pub use crate::historical_batch::HistoricalBatch;
pub use crate::indexed_attestation::{ pub use crate::indexed_attestation::{
IndexedAttestation, IndexedAttestationBase, IndexedAttestationElectra, IndexedAttestationRef, IndexedAttestation, IndexedAttestationBase, IndexedAttestationElectra,
IndexedAttestationOnDisk, IndexedAttestationRef, IndexedAttestationRefOnDisk,
}; };
pub use crate::light_client_bootstrap::{ pub use crate::light_client_bootstrap::{
LightClientBootstrap, LightClientBootstrapAltair, LightClientBootstrapCapella, LightClientBootstrap, LightClientBootstrapAltair, LightClientBootstrapCapella,

View File

@@ -18,12 +18,12 @@ use std::marker::PhantomData;
use std::sync::Arc; use std::sync::Arc;
use tree_hash::TreeHash; use tree_hash::TreeHash;
use types::{ use types::{
Epoch, EthSpec, Hash256, IndexedAttestation, IndexedAttestationBase, ProposerSlashing, Epoch, EthSpec, Hash256, IndexedAttestation, IndexedAttestationOnDisk,
SignedBeaconBlockHeader, Slot, IndexedAttestationRefOnDisk, ProposerSlashing, SignedBeaconBlockHeader, Slot,
}; };
/// Current database schema version, to check compatibility of on-disk DB with software. /// Current database schema version, to check compatibility of on-disk DB with software.
pub const CURRENT_SCHEMA_VERSION: u64 = 3; pub const CURRENT_SCHEMA_VERSION: u64 = 4;
/// Metadata about the slashing database itself. /// Metadata about the slashing database itself.
const METADATA_DB: &str = "metadata"; const METADATA_DB: &str = "metadata";
@@ -458,7 +458,9 @@ impl<E: EthSpec> SlasherDB<E> {
}; };
let attestation_key = IndexedAttestationId::new(indexed_att_id); let attestation_key = IndexedAttestationId::new(indexed_att_id);
let data = indexed_attestation.as_ssz_bytes(); let indexed_attestation_on_disk: IndexedAttestationRefOnDisk<E> =
indexed_attestation.into();
let data = indexed_attestation_on_disk.as_ssz_bytes();
cursor.put(attestation_key.as_ref(), &data)?; cursor.put(attestation_key.as_ref(), &data)?;
drop(cursor); drop(cursor);
@@ -482,11 +484,8 @@ impl<E: EthSpec> SlasherDB<E> {
.ok_or(Error::MissingIndexedAttestation { .ok_or(Error::MissingIndexedAttestation {
id: indexed_attestation_id.as_u64(), id: indexed_attestation_id.as_u64(),
})?; })?;
// TODO(electra): make slasher fork-aware and return correct variant of attestation. Both let indexed_attestation: IndexedAttestationOnDisk<E> = ssz_decode(bytes)?;
// Base and Electra variant can the same SSZ encoding, however the smaller list maximum of Ok(indexed_attestation.into())
// Base can error with an Electra attestation with heavy participation.
let indexed_attestation: IndexedAttestationBase<E> = ssz_decode(bytes)?;
Ok(IndexedAttestation::Base(indexed_attestation))
} }
fn get_attestation_data_root( fn get_attestation_data_root(

View File

@@ -17,6 +17,10 @@ impl<E: EthSpec> SlasherDB<E> {
software_schema_version: CURRENT_SCHEMA_VERSION, software_schema_version: CURRENT_SCHEMA_VERSION,
}), }),
(x, y) if x == y => Ok(self), (x, y) if x == y => Ok(self),
(3, 4) => {
// TODO(electra): db migration due to `IndexedAttestationOnDisk`
Ok(self)
}
(_, _) => Err(Error::IncompatibleSchemaVersion { (_, _) => Err(Error::IncompatibleSchemaVersion {
database_schema_version: schema_version, database_schema_version: schema_version,
software_schema_version: CURRENT_SCHEMA_VERSION, software_schema_version: CURRENT_SCHEMA_VERSION,