mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-08 17:26:04 +00:00
Fix aggregate attestation v2 response (#6926)
This commit is contained in:
65
beacon_node/http_api/src/aggregate_attestation.rs
Normal file
65
beacon_node/http_api/src/aggregate_attestation.rs
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
use crate::api_types::GenericResponse;
|
||||||
|
use crate::unsupported_version_rejection;
|
||||||
|
use crate::version::{add_consensus_version_header, V1, V2};
|
||||||
|
use beacon_chain::{BeaconChain, BeaconChainTypes};
|
||||||
|
use eth2::types::{self, EndpointVersion, Hash256, Slot};
|
||||||
|
use std::sync::Arc;
|
||||||
|
use types::fork_versioned_response::EmptyMetadata;
|
||||||
|
use types::{CommitteeIndex, ForkVersionedResponse};
|
||||||
|
use warp::{
|
||||||
|
hyper::{Body, Response},
|
||||||
|
reply::Reply,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn get_aggregate_attestation<T: BeaconChainTypes>(
|
||||||
|
slot: Slot,
|
||||||
|
attestation_data_root: &Hash256,
|
||||||
|
committee_index: Option<CommitteeIndex>,
|
||||||
|
endpoint_version: EndpointVersion,
|
||||||
|
chain: Arc<BeaconChain<T>>,
|
||||||
|
) -> Result<Response<Body>, warp::reject::Rejection> {
|
||||||
|
if endpoint_version == V2 {
|
||||||
|
let Some(committee_index) = committee_index else {
|
||||||
|
return Err(warp_utils::reject::custom_bad_request(
|
||||||
|
"missing committee index".to_string(),
|
||||||
|
));
|
||||||
|
};
|
||||||
|
let aggregate_attestation = chain
|
||||||
|
.get_aggregated_attestation_electra(slot, attestation_data_root, committee_index)
|
||||||
|
.map_err(|e| {
|
||||||
|
warp_utils::reject::custom_bad_request(format!(
|
||||||
|
"unable to fetch aggregate: {:?}",
|
||||||
|
e
|
||||||
|
))
|
||||||
|
})?
|
||||||
|
.ok_or_else(|| {
|
||||||
|
warp_utils::reject::custom_not_found("no matching aggregate found".to_string())
|
||||||
|
})?;
|
||||||
|
let fork_name = chain.spec.fork_name_at_slot::<T::EthSpec>(slot);
|
||||||
|
let fork_versioned_response = ForkVersionedResponse {
|
||||||
|
version: Some(fork_name),
|
||||||
|
metadata: EmptyMetadata {},
|
||||||
|
data: aggregate_attestation,
|
||||||
|
};
|
||||||
|
Ok(add_consensus_version_header(
|
||||||
|
warp::reply::json(&fork_versioned_response).into_response(),
|
||||||
|
fork_name,
|
||||||
|
))
|
||||||
|
} else if endpoint_version == V1 {
|
||||||
|
let aggregate_attestation = chain
|
||||||
|
.get_pre_electra_aggregated_attestation_by_slot_and_root(slot, attestation_data_root)
|
||||||
|
.map_err(|e| {
|
||||||
|
warp_utils::reject::custom_bad_request(format!(
|
||||||
|
"unable to fetch aggregate: {:?}",
|
||||||
|
e
|
||||||
|
))
|
||||||
|
})?
|
||||||
|
.map(GenericResponse::from)
|
||||||
|
.ok_or_else(|| {
|
||||||
|
warp_utils::reject::custom_not_found("no matching aggregate found".to_string())
|
||||||
|
})?;
|
||||||
|
Ok(warp::reply::json(&aggregate_attestation).into_response())
|
||||||
|
} else {
|
||||||
|
return Err(unsupported_version_rejection(endpoint_version));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
//! There are also some additional, non-standard endpoints behind the `/lighthouse/` path which are
|
//! There are also some additional, non-standard endpoints behind the `/lighthouse/` path which are
|
||||||
//! used for development.
|
//! used for development.
|
||||||
|
|
||||||
|
mod aggregate_attestation;
|
||||||
mod attestation_performance;
|
mod attestation_performance;
|
||||||
mod attester_duties;
|
mod attester_duties;
|
||||||
mod block_id;
|
mod block_id;
|
||||||
@@ -3384,40 +3385,15 @@ pub fn serve<T: BeaconChainTypes>(
|
|||||||
not_synced_filter: Result<(), Rejection>,
|
not_synced_filter: Result<(), Rejection>,
|
||||||
task_spawner: TaskSpawner<T::EthSpec>,
|
task_spawner: TaskSpawner<T::EthSpec>,
|
||||||
chain: Arc<BeaconChain<T>>| {
|
chain: Arc<BeaconChain<T>>| {
|
||||||
task_spawner.blocking_json_task(Priority::P0, move || {
|
task_spawner.blocking_response_task(Priority::P0, move || {
|
||||||
not_synced_filter?;
|
not_synced_filter?;
|
||||||
let res = if endpoint_version == V2 {
|
crate::aggregate_attestation::get_aggregate_attestation(
|
||||||
let Some(committee_index) = query.committee_index else {
|
query.slot,
|
||||||
return Err(warp_utils::reject::custom_bad_request(
|
&query.attestation_data_root,
|
||||||
"missing committee index".to_string(),
|
query.committee_index,
|
||||||
));
|
endpoint_version,
|
||||||
};
|
chain,
|
||||||
chain.get_aggregated_attestation_electra(
|
)
|
||||||
query.slot,
|
|
||||||
&query.attestation_data_root,
|
|
||||||
committee_index,
|
|
||||||
)
|
|
||||||
} else if endpoint_version == V1 {
|
|
||||||
// Do nothing
|
|
||||||
chain.get_pre_electra_aggregated_attestation_by_slot_and_root(
|
|
||||||
query.slot,
|
|
||||||
&query.attestation_data_root,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return Err(unsupported_version_rejection(endpoint_version));
|
|
||||||
};
|
|
||||||
res.map_err(|e| {
|
|
||||||
warp_utils::reject::custom_bad_request(format!(
|
|
||||||
"unable to fetch aggregate: {:?}",
|
|
||||||
e
|
|
||||||
))
|
|
||||||
})?
|
|
||||||
.map(api_types::GenericResponse::from)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
warp_utils::reject::custom_not_found(
|
|
||||||
"no matching aggregate found".to_string(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user