mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-03 00:31:50 +00:00
Migrate derivative to educe (#8125)
Fixes #7001. Mostly mechanical replacement of `derivative` attributes with `educe` ones. ### **Attribute Syntax Changes** ```rust // Bounds: = "..." → (...) #[derivative(Hash(bound = "E: EthSpec"))] #[educe(Hash(bound(E: EthSpec)))] // Ignore: = "ignore" → (ignore) #[derivative(PartialEq = "ignore")] #[educe(PartialEq(ignore))] // Default values: value = "..." → expression = ... #[derivative(Default(value = "ForkName::Base"))] #[educe(Default(expression = ForkName::Base))] // Methods: format_with/compare_with = "..." → method(...) #[derivative(Debug(format_with = "fmt_peer_set_as_len"))] #[educe(Debug(method(fmt_peer_set_as_len)))] // Empty bounds: removed entirely, educe can infer appropriate bounds #[derivative(Default(bound = ""))] #[educe(Default)] // Transparent debug: manual implementation (educe doesn't support it) #[derivative(Debug = "transparent")] // Replaced with manual Debug impl that delegates to inner field ``` **Note**: Some bounds use strings (`bound("E: EthSpec")`) for superstruct compatibility (`expected ','` errors). Co-Authored-By: Javier Chávarri <javier.chavarri@gmail.com> Co-Authored-By: Mac L <mjladson@pm.me>
This commit is contained in:
@@ -18,7 +18,7 @@ test_backfill = []
|
||||
alloy-primitives = { workspace = true }
|
||||
bitvec = { workspace = true }
|
||||
bls = { workspace = true }
|
||||
derivative = { workspace = true }
|
||||
educe = { workspace = true }
|
||||
eth2 = { workspace = true }
|
||||
eth2_network_config = { workspace = true }
|
||||
ethereum_hashing = { workspace = true }
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
//! reads when fork choice requires the validator balances of the justified state.
|
||||
|
||||
use crate::{BeaconSnapshot, metrics};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use fork_choice::ForkChoiceStore;
|
||||
use proto_array::JustifiedBalances;
|
||||
use safe_arith::ArithError;
|
||||
@@ -127,10 +127,10 @@ impl BalancesCache {
|
||||
|
||||
/// Implements `fork_choice::ForkChoiceStore` in order to provide a persistent backing to the
|
||||
/// `fork_choice::ForkChoice` struct.
|
||||
#[derive(Debug, Derivative)]
|
||||
#[derivative(PartialEq(bound = "E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>"))]
|
||||
#[derive(Debug, Educe)]
|
||||
#[educe(PartialEq(bound(E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>)))]
|
||||
pub struct BeaconForkChoiceStore<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> {
|
||||
#[derivative(PartialEq = "ignore")]
|
||||
#[educe(PartialEq(ignore))]
|
||||
store: Arc<HotColdDB<E, Hot, Cold>>,
|
||||
balances_cache: BalancesCache,
|
||||
time: Slot,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use slot_clock::SlotClock;
|
||||
use std::marker::PhantomData;
|
||||
use std::sync::Arc;
|
||||
@@ -245,8 +245,8 @@ impl<T: BeaconChainTypes, O: ObservationStrategy> GossipVerifiedBlob<T, O> {
|
||||
|
||||
/// Wrapper over a `BlobSidecar` for which we have completed kzg verification.
|
||||
/// i.e. `verify_blob_kzg_proof(blob, commitment, proof) == true`.
|
||||
#[derive(Debug, Derivative, Clone, Encode, Decode)]
|
||||
#[derivative(PartialEq, Eq)]
|
||||
#[derive(Debug, Educe, Clone, Encode, Decode)]
|
||||
#[educe(PartialEq, Eq)]
|
||||
#[ssz(struct_behaviour = "transparent")]
|
||||
pub struct KzgVerifiedBlob<E: EthSpec> {
|
||||
blob: Arc<BlobSidecar<E>>,
|
||||
|
||||
@@ -66,7 +66,7 @@ use crate::{
|
||||
beacon_chain::{BeaconForkChoice, ForkChoiceError},
|
||||
metrics,
|
||||
};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use eth2::types::{BlockGossip, EventKind};
|
||||
use execution_layer::PayloadStatus;
|
||||
pub use fork_choice::{AttestationFromBlock, PayloadVerificationStatus};
|
||||
@@ -689,8 +689,8 @@ pub fn signature_verify_chain_segment<T: BeaconChainTypes>(
|
||||
|
||||
/// A wrapper around a `SignedBeaconBlock` that indicates it has been approved for re-gossiping on
|
||||
/// the p2p network.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug(bound = "T: BeaconChainTypes"))]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug(bound(T: BeaconChainTypes)))]
|
||||
pub struct GossipVerifiedBlock<T: BeaconChainTypes> {
|
||||
pub block: Arc<SignedBeaconBlock<T::EthSpec>>,
|
||||
pub block_root: Hash256,
|
||||
|
||||
@@ -2,7 +2,7 @@ use crate::data_availability_checker::AvailabilityCheckError;
|
||||
pub use crate::data_availability_checker::{AvailableBlock, MaybeAvailableBlock};
|
||||
use crate::data_column_verification::{CustodyDataColumn, CustodyDataColumnList};
|
||||
use crate::{PayloadVerificationOutcome, get_block_root};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use ssz_types::VariableList;
|
||||
use state_processing::ConsensusContext;
|
||||
use std::fmt::{Debug, Formatter};
|
||||
@@ -26,8 +26,8 @@ use types::{
|
||||
/// Note: We make a distinction over blocks received over gossip because
|
||||
/// in a post-deneb world, the blobs corresponding to a given block that are received
|
||||
/// over rpc do not contain the proposer signature for dos resistance.
|
||||
#[derive(Clone, Derivative)]
|
||||
#[derivative(Hash(bound = "E: EthSpec"))]
|
||||
#[derive(Clone, Educe)]
|
||||
#[educe(Hash(bound(E: EthSpec)))]
|
||||
pub struct RpcBlock<E: EthSpec> {
|
||||
block_root: Hash256,
|
||||
block: RpcBlockInner<E>,
|
||||
@@ -80,8 +80,8 @@ impl<E: EthSpec> RpcBlock<E> {
|
||||
/// Note: This variant is intentionally private because we want to safely construct the
|
||||
/// internal variants after applying consistency checks to ensure that the block and blobs
|
||||
/// are consistent with respect to each other.
|
||||
#[derive(Debug, Clone, Derivative)]
|
||||
#[derivative(Hash(bound = "E: EthSpec"))]
|
||||
#[derive(Debug, Clone, Educe)]
|
||||
#[educe(Hash(bound(E: EthSpec)))]
|
||||
enum RpcBlockInner<E: EthSpec> {
|
||||
/// Single block lookup response. This should potentially hit the data availability cache.
|
||||
Block(Arc<SignedBeaconBlock<E>>),
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::block_verification::{
|
||||
use crate::kzg_utils::{reconstruct_data_columns, validate_data_columns};
|
||||
use crate::observed_data_sidecars::{ObservationStrategy, Observe};
|
||||
use crate::{BeaconChain, BeaconChainError, BeaconChainTypes, metrics};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use fork_choice::ProtoBlock;
|
||||
use kzg::{Error as KzgError, Kzg};
|
||||
use proto_array::Block;
|
||||
@@ -296,8 +296,8 @@ impl<T: BeaconChainTypes, O: ObservationStrategy> GossipVerifiedDataColumn<T, O>
|
||||
}
|
||||
|
||||
/// Wrapper over a `DataColumnSidecar` for which we have completed kzg verification.
|
||||
#[derive(Debug, Derivative, Clone, Encode, Decode)]
|
||||
#[derivative(PartialEq, Eq)]
|
||||
#[derive(Debug, Educe, Clone, Encode, Decode)]
|
||||
#[educe(PartialEq, Eq)]
|
||||
#[ssz(struct_behaviour = "transparent")]
|
||||
pub struct KzgVerifiedDataColumn<E: EthSpec> {
|
||||
data: Arc<DataColumnSidecar<E>>,
|
||||
@@ -353,8 +353,8 @@ pub type CustodyDataColumnList<E> =
|
||||
VariableList<CustodyDataColumn<E>, <E as EthSpec>::NumberOfColumns>;
|
||||
|
||||
/// Data column that we must custody
|
||||
#[derive(Debug, Derivative, Clone, Encode, Decode)]
|
||||
#[derivative(PartialEq, Eq, Hash(bound = "E: EthSpec"))]
|
||||
#[derive(Debug, Educe, Clone, Encode, Decode)]
|
||||
#[educe(PartialEq, Eq, Hash(bound(E: EthSpec)))]
|
||||
#[ssz(struct_behaviour = "transparent")]
|
||||
pub struct CustodyDataColumn<E: EthSpec> {
|
||||
data: Arc<DataColumnSidecar<E>>,
|
||||
@@ -383,8 +383,8 @@ impl<E: EthSpec> CustodyDataColumn<E> {
|
||||
}
|
||||
|
||||
/// Data column that we must custody and has completed kzg verification
|
||||
#[derive(Debug, Derivative, Clone, Encode, Decode)]
|
||||
#[derivative(PartialEq, Eq)]
|
||||
#[derive(Debug, Educe, Clone, Encode, Decode)]
|
||||
#[educe(PartialEq, Eq)]
|
||||
#[ssz(struct_behaviour = "transparent")]
|
||||
pub struct KzgVerifiedCustodyDataColumn<E: EthSpec> {
|
||||
data: Arc<DataColumnSidecar<E>>,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::{BeaconChain, BeaconChainTypes};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use slot_clock::SlotClock;
|
||||
use std::time::Duration;
|
||||
use strum::AsRefStr;
|
||||
@@ -55,8 +55,8 @@ pub enum Error {
|
||||
}
|
||||
|
||||
/// Wraps a `LightClientFinalityUpdate` that has been verified for propagation on the gossip network.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Clone(bound = "T: BeaconChainTypes"))]
|
||||
#[derive(Educe)]
|
||||
#[educe(Clone(bound(T: BeaconChainTypes)))]
|
||||
pub struct VerifiedLightClientFinalityUpdate<T: BeaconChainTypes> {
|
||||
light_client_finality_update: LightClientFinalityUpdate<T::EthSpec>,
|
||||
seen_timestamp: Duration,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::{BeaconChain, BeaconChainTypes};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use eth2::types::Hash256;
|
||||
use slot_clock::SlotClock;
|
||||
use std::time::Duration;
|
||||
@@ -49,8 +49,8 @@ pub enum Error {
|
||||
}
|
||||
|
||||
/// Wraps a `LightClientOptimisticUpdate` that has been verified for propagation on the gossip network.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Clone(bound = "T: BeaconChainTypes"))]
|
||||
#[derive(Educe)]
|
||||
#[educe(Clone(bound(T: BeaconChainTypes)))]
|
||||
pub struct VerifiedLightClientOptimisticUpdate<T: BeaconChainTypes> {
|
||||
light_client_optimistic_update: LightClientOptimisticUpdate<T::EthSpec>,
|
||||
pub parent_root: Hash256,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use smallvec::{SmallVec, smallvec};
|
||||
use state_processing::{SigVerifiedOp, TransformPersist, VerifyOperation, VerifyOperationAt};
|
||||
use std::collections::HashSet;
|
||||
@@ -14,8 +14,8 @@ pub const SMALL_VEC_SIZE: usize = 8;
|
||||
/// Stateful tracker for exit/slashing operations seen on the network.
|
||||
///
|
||||
/// Implements the conditions for gossip verification of exits and slashings from the P2P spec.
|
||||
#[derive(Debug, Derivative)]
|
||||
#[derivative(Default(bound = "T: ObservableOperation<E>, E: EthSpec"))]
|
||||
#[derive(Debug, Educe)]
|
||||
#[educe(Default(bound(T: ObservableOperation<E>, E: EthSpec)))]
|
||||
pub struct ObservedOperations<T: ObservableOperation<E>, E: EthSpec> {
|
||||
/// Indices of validators for whom we have already seen an instance of an operation `T`.
|
||||
///
|
||||
@@ -26,7 +26,7 @@ pub struct ObservedOperations<T: ObservableOperation<E>, E: EthSpec> {
|
||||
/// `attestation_1.attester_indices` and `attestation_2.attester_indices`.
|
||||
observed_validator_indices: HashSet<u64>,
|
||||
/// The name of the current fork. The default will be overwritten on first use.
|
||||
#[derivative(Default(value = "ForkName::Base"))]
|
||||
#[educe(Default(expression = ForkName::Base))]
|
||||
current_fork: ForkName,
|
||||
_phantom: PhantomData<(T, E)>,
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ use crate::{
|
||||
BeaconChain, BeaconChainError, BeaconChainTypes, metrics, observed_aggregates::ObserveOutcome,
|
||||
};
|
||||
use bls::{PublicKeyBytes, verify_signature_sets};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use safe_arith::ArithError;
|
||||
use slot_clock::SlotClock;
|
||||
use ssz_derive::{Decode, Encode};
|
||||
@@ -261,8 +261,8 @@ impl From<ContributionError> for Error {
|
||||
}
|
||||
|
||||
/// Wraps a `SignedContributionAndProof` that has been verified for propagation on the gossip network.\
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Clone(bound = "T: BeaconChainTypes"))]
|
||||
#[derive(Educe)]
|
||||
#[educe(Clone(bound(T: BeaconChainTypes)))]
|
||||
pub struct VerifiedSyncContribution<T: BeaconChainTypes> {
|
||||
signed_aggregate: SignedContributionAndProof<T::EthSpec>,
|
||||
participant_pubkeys: Vec<PublicKeyBytes>,
|
||||
|
||||
@@ -19,7 +19,7 @@ async-channel = { workspace = true }
|
||||
beacon_chain = { workspace = true }
|
||||
beacon_processor = { workspace = true }
|
||||
delay_map = { workspace = true }
|
||||
derivative = { workspace = true }
|
||||
educe = { workspace = true }
|
||||
ethereum_ssz = { workspace = true }
|
||||
execution_layer = { workspace = true }
|
||||
fnv = { workspace = true }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use beacon_chain::block_verification_types::RpcBlock;
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use lighthouse_network::PeerId;
|
||||
use lighthouse_network::rpc::methods::BlocksByRangeRequest;
|
||||
use lighthouse_network::rpc::methods::DataColumnsByRangeRequest;
|
||||
@@ -78,8 +78,8 @@ pub enum BatchProcessingResult {
|
||||
NonFaultyFailure,
|
||||
}
|
||||
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug)]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug)]
|
||||
/// A segment of a chain.
|
||||
pub struct BatchInfo<E: EthSpec, B: BatchConfig, D: Hash> {
|
||||
/// Start slot of the batch.
|
||||
@@ -97,7 +97,7 @@ pub struct BatchInfo<E: EthSpec, B: BatchConfig, D: Hash> {
|
||||
/// Whether this batch contains all blocks or all blocks and blobs.
|
||||
batch_type: ByRangeRequestType,
|
||||
/// Pin the generic
|
||||
#[derivative(Debug = "ignore")]
|
||||
#[educe(Debug(ignore))]
|
||||
marker: std::marker::PhantomData<(E, B)>,
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use crate::sync::network_context::{
|
||||
SyncNetworkContext,
|
||||
};
|
||||
use beacon_chain::{BeaconChainTypes, BlockProcessStatus};
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use lighthouse_network::service::api_types::Id;
|
||||
use lighthouse_tracing::SPAN_SINGLE_BLOCK_LOOKUP;
|
||||
use parking_lot::RwLock;
|
||||
@@ -57,8 +57,8 @@ pub enum LookupRequestError {
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug(bound = "T: BeaconChainTypes"))]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug(bound(T: BeaconChainTypes)))]
|
||||
pub struct SingleBlockLookup<T: BeaconChainTypes> {
|
||||
pub id: Id,
|
||||
pub block_request_state: BlockRequestState<T::EthSpec>,
|
||||
@@ -67,7 +67,7 @@ pub struct SingleBlockLookup<T: BeaconChainTypes> {
|
||||
/// the custody request to have an updated view of the peers that claim to have imported the
|
||||
/// block associated with this lookup. The peer set of a lookup can change rapidly, and faster
|
||||
/// than the lifetime of a custody request.
|
||||
#[derivative(Debug(format_with = "fmt_peer_set_as_len"))]
|
||||
#[educe(Debug(method(fmt_peer_set_as_len)))]
|
||||
peers: Arc<RwLock<HashSet<PeerId>>>,
|
||||
block_root: Hash256,
|
||||
awaiting_parent: Option<Hash256>,
|
||||
@@ -369,10 +369,10 @@ impl<T: BeaconChainTypes> SingleBlockLookup<T> {
|
||||
}
|
||||
|
||||
/// The state of the blob request component of a `SingleBlockLookup`.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug)]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug)]
|
||||
pub struct BlobRequestState<E: EthSpec> {
|
||||
#[derivative(Debug = "ignore")]
|
||||
#[educe(Debug(ignore))]
|
||||
pub block_root: Hash256,
|
||||
pub state: SingleLookupRequestState<FixedBlobSidecarList<E>>,
|
||||
}
|
||||
@@ -387,10 +387,10 @@ impl<E: EthSpec> BlobRequestState<E> {
|
||||
}
|
||||
|
||||
/// The state of the custody request component of a `SingleBlockLookup`.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug)]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug)]
|
||||
pub struct CustodyRequestState<E: EthSpec> {
|
||||
#[derivative(Debug = "ignore")]
|
||||
#[educe(Debug(ignore))]
|
||||
pub block_root: Hash256,
|
||||
pub state: SingleLookupRequestState<DataColumnSidecarList<E>>,
|
||||
}
|
||||
@@ -405,10 +405,10 @@ impl<E: EthSpec> CustodyRequestState<E> {
|
||||
}
|
||||
|
||||
/// The state of the block request component of a `SingleBlockLookup`.
|
||||
#[derive(Derivative)]
|
||||
#[derivative(Debug)]
|
||||
#[derive(Educe)]
|
||||
#[educe(Debug)]
|
||||
pub struct BlockRequestState<E: EthSpec> {
|
||||
#[derivative(Debug = "ignore")]
|
||||
#[educe(Debug(ignore))]
|
||||
pub requested_block_root: Hash256,
|
||||
pub state: SingleLookupRequestState<Arc<SignedBeaconBlock<E>>>,
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ portable = ["beacon_chain/portable"]
|
||||
|
||||
[dependencies]
|
||||
bitvec = { workspace = true }
|
||||
derivative = { workspace = true }
|
||||
educe = { workspace = true }
|
||||
ethereum_ssz = { workspace = true }
|
||||
ethereum_ssz_derive = { workspace = true }
|
||||
itertools = { workspace = true }
|
||||
|
||||
@@ -3,7 +3,7 @@ use crate::OperationPool;
|
||||
use crate::attestation_storage::AttestationMap;
|
||||
use crate::bls_to_execution_changes::{BlsToExecutionChanges, ReceivedPreCapella};
|
||||
use crate::sync_aggregate_id::SyncAggregateId;
|
||||
use derivative::Derivative;
|
||||
use educe::Educe;
|
||||
use parking_lot::RwLock;
|
||||
use ssz::{Decode, Encode};
|
||||
use ssz_derive::{Decode, Encode};
|
||||
@@ -22,10 +22,7 @@ type PersistedSyncContributions<E> = Vec<(SyncAggregateId, Vec<SyncCommitteeCont
|
||||
/// of this type (or its encoded form) for equality. Convert back to an `OperationPool` first.
|
||||
#[superstruct(
|
||||
variants(V15, V20),
|
||||
variant_attributes(
|
||||
derive(Derivative, PartialEq, Debug, Encode, Decode),
|
||||
derivative(Clone),
|
||||
),
|
||||
variant_attributes(derive(Educe, PartialEq, Debug, Encode, Decode), educe(Clone),),
|
||||
partial_getter_error(ty = "OpPoolError", expr = "OpPoolError::IncorrectOpPoolVariant")
|
||||
)]
|
||||
#[derive(PartialEq, Debug, Encode)]
|
||||
|
||||
Reference in New Issue
Block a user