Skip to main content

eth_state_diff/
attestations.rs

1//! Delta encoding for Phase0 pending attestations.
2//!
3//! `current_epoch_attestations` is an append-only log during an epoch.
4//! `previous_epoch_attestations` is completely replaced at epoch boundaries.
5
6use crate::types::{ArchivedAttestationsDiff, AttestationsDiff};
7
8/// Diffs an append-only attestation list (e.g., `current_epoch_attestations`).
9pub fn diff_attestations_append(base_ssz: &[u8], target_ssz: &[u8]) -> AttestationsDiff {
10    if base_ssz == target_ssz {
11        return AttestationsDiff::Unchanged;
12    }
13
14    if target_ssz.len() > base_ssz.len() {
15        AttestationsDiff::Append(target_ssz[base_ssz.len()..].to_vec())
16    } else {
17        // Fallback if it somehow shrank or resets
18        AttestationsDiff::FullReplacement(target_ssz.to_vec())
19    }
20}
21
22/// Diffs a replaced attestation list (e.g., `previous_epoch_attestations`).
23pub fn diff_attestations_replacement(base_ssz: &[u8], target_ssz: &[u8]) -> AttestationsDiff {
24    if base_ssz == target_ssz {
25        AttestationsDiff::Unchanged
26    } else {
27        AttestationsDiff::FullReplacement(target_ssz.to_vec())
28    }
29}
30
31/// Applies an attestation delta in place.
32pub fn apply_attestations(base: &mut Vec<u8>, delta: &ArchivedAttestationsDiff) {
33    match delta {
34        ArchivedAttestationsDiff::Unchanged => {}
35        ArchivedAttestationsDiff::Append(bytes) => {
36            base.extend_from_slice(bytes.as_slice());
37        }
38        ArchivedAttestationsDiff::FullReplacement(bytes) => {
39            base.clear();
40            base.extend_from_slice(bytes.as_slice());
41        }
42    }
43}