Skip to content

Commit 81ee77d

Browse files
authored
Merge of #6224
2 parents f2fdbe7 + 815599c commit 81ee77d

File tree

15 files changed

+624
-34
lines changed

15 files changed

+624
-34
lines changed

beacon_node/beacon_processor/src/lib.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ pub struct BeaconProcessorQueueLengths {
119119
bbroots_queue: usize,
120120
blbroots_queue: usize,
121121
blbrange_queue: usize,
122+
dcbroots_queue: usize,
123+
dcbrange_queue: usize,
122124
gossip_bls_to_execution_change_queue: usize,
123125
lc_bootstrap_queue: usize,
124126
lc_optimistic_update_queue: usize,
@@ -172,6 +174,9 @@ impl BeaconProcessorQueueLengths {
172174
bbroots_queue: 1024,
173175
blbroots_queue: 1024,
174176
blbrange_queue: 1024,
177+
// TODO(das): pick proper values
178+
dcbroots_queue: 1024,
179+
dcbrange_queue: 1024,
175180
gossip_bls_to_execution_change_queue: 16384,
176181
lc_bootstrap_queue: 1024,
177182
lc_optimistic_update_queue: 512,
@@ -230,6 +235,8 @@ pub const BLOCKS_BY_RANGE_REQUEST: &str = "blocks_by_range_request";
230235
pub const BLOCKS_BY_ROOTS_REQUEST: &str = "blocks_by_roots_request";
231236
pub const BLOBS_BY_RANGE_REQUEST: &str = "blobs_by_range_request";
232237
pub const BLOBS_BY_ROOTS_REQUEST: &str = "blobs_by_roots_request";
238+
pub const DATA_COLUMNS_BY_ROOTS_REQUEST: &str = "data_columns_by_roots_request";
239+
pub const DATA_COLUMNS_BY_RANGE_REQUEST: &str = "data_columns_by_range_request";
233240
pub const LIGHT_CLIENT_BOOTSTRAP_REQUEST: &str = "light_client_bootstrap";
234241
pub const LIGHT_CLIENT_FINALITY_UPDATE_REQUEST: &str = "light_client_finality_update_request";
235242
pub const LIGHT_CLIENT_OPTIMISTIC_UPDATE_REQUEST: &str = "light_client_optimistic_update_request";
@@ -609,6 +616,8 @@ pub enum Work<E: EthSpec> {
609616
BlocksByRootsRequest(AsyncFn),
610617
BlobsByRangeRequest(BlockingFn),
611618
BlobsByRootsRequest(BlockingFn),
619+
DataColumnsByRootsRequest(BlockingFn),
620+
DataColumnsByRangeRequest(BlockingFn),
612621
GossipBlsToExecutionChange(BlockingFn),
613622
LightClientBootstrapRequest(BlockingFn),
614623
LightClientOptimisticUpdateRequest(BlockingFn),
@@ -652,6 +661,8 @@ impl<E: EthSpec> Work<E> {
652661
Work::BlocksByRootsRequest(_) => BLOCKS_BY_ROOTS_REQUEST,
653662
Work::BlobsByRangeRequest(_) => BLOBS_BY_RANGE_REQUEST,
654663
Work::BlobsByRootsRequest(_) => BLOBS_BY_ROOTS_REQUEST,
664+
Work::DataColumnsByRootsRequest(_) => DATA_COLUMNS_BY_ROOTS_REQUEST,
665+
Work::DataColumnsByRangeRequest(_) => DATA_COLUMNS_BY_RANGE_REQUEST,
655666
Work::LightClientBootstrapRequest(_) => LIGHT_CLIENT_BOOTSTRAP_REQUEST,
656667
Work::LightClientOptimisticUpdateRequest(_) => LIGHT_CLIENT_OPTIMISTIC_UPDATE_REQUEST,
657668
Work::LightClientFinalityUpdateRequest(_) => LIGHT_CLIENT_FINALITY_UPDATE_REQUEST,
@@ -816,6 +827,8 @@ impl<E: EthSpec> BeaconProcessor<E> {
816827
let mut bbroots_queue = FifoQueue::new(queue_lengths.bbroots_queue);
817828
let mut blbroots_queue = FifoQueue::new(queue_lengths.blbroots_queue);
818829
let mut blbrange_queue = FifoQueue::new(queue_lengths.blbrange_queue);
830+
let mut dcbroots_queue = FifoQueue::new(queue_lengths.dcbroots_queue);
831+
let mut dcbrange_queue = FifoQueue::new(queue_lengths.dcbrange_queue);
819832

820833
let mut gossip_bls_to_execution_change_queue =
821834
FifoQueue::new(queue_lengths.gossip_bls_to_execution_change_queue);
@@ -1118,6 +1131,10 @@ impl<E: EthSpec> BeaconProcessor<E> {
11181131
self.spawn_worker(item, idle_tx);
11191132
} else if let Some(item) = blbroots_queue.pop() {
11201133
self.spawn_worker(item, idle_tx);
1134+
} else if let Some(item) = dcbroots_queue.pop() {
1135+
self.spawn_worker(item, idle_tx);
1136+
} else if let Some(item) = dcbrange_queue.pop() {
1137+
self.spawn_worker(item, idle_tx);
11211138
// Check slashings after all other consensus messages so we prioritize
11221139
// following head.
11231140
//
@@ -1282,6 +1299,12 @@ impl<E: EthSpec> BeaconProcessor<E> {
12821299
Work::BlobsByRootsRequest { .. } => {
12831300
blbroots_queue.push(work, work_id, &self.log)
12841301
}
1302+
Work::DataColumnsByRootsRequest { .. } => {
1303+
dcbroots_queue.push(work, work_id, &self.log)
1304+
}
1305+
Work::DataColumnsByRangeRequest { .. } => {
1306+
dcbrange_queue.push(work, work_id, &self.log)
1307+
}
12851308
Work::UnknownLightClientOptimisticUpdate { .. } => {
12861309
unknown_light_client_update_queue.push(work, work_id, &self.log)
12871310
}
@@ -1483,7 +1506,10 @@ impl<E: EthSpec> BeaconProcessor<E> {
14831506
| Work::GossipDataColumnSidecar(work) => task_spawner.spawn_async(async move {
14841507
work.await;
14851508
}),
1486-
Work::BlobsByRangeRequest(process_fn) | Work::BlobsByRootsRequest(process_fn) => {
1509+
Work::BlobsByRangeRequest(process_fn)
1510+
| Work::BlobsByRootsRequest(process_fn)
1511+
| Work::DataColumnsByRootsRequest(process_fn)
1512+
| Work::DataColumnsByRangeRequest(process_fn) => {
14871513
task_spawner.spawn_blocking(process_fn)
14881514
}
14891515
Work::BlocksByRangeRequest(work) | Work::BlocksByRootsRequest(work) => {

beacon_node/lighthouse_network/src/peer_manager/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,8 @@ impl<E: EthSpec> PeerManager<E> {
569569
Protocol::LightClientOptimisticUpdate => return,
570570
Protocol::LightClientFinalityUpdate => return,
571571
Protocol::BlobsByRoot => PeerAction::MidToleranceError,
572+
Protocol::DataColumnsByRoot => PeerAction::MidToleranceError,
573+
Protocol::DataColumnsByRange => PeerAction::MidToleranceError,
572574
Protocol::Goodbye => PeerAction::LowToleranceError,
573575
Protocol::MetaData => PeerAction::LowToleranceError,
574576
Protocol::Status => PeerAction::LowToleranceError,
@@ -587,6 +589,8 @@ impl<E: EthSpec> PeerManager<E> {
587589
Protocol::BlocksByRoot => return,
588590
Protocol::BlobsByRange => return,
589591
Protocol::BlobsByRoot => return,
592+
Protocol::DataColumnsByRoot => return,
593+
Protocol::DataColumnsByRange => return,
590594
Protocol::Goodbye => return,
591595
Protocol::LightClientBootstrap => return,
592596
Protocol::LightClientOptimisticUpdate => return,
@@ -607,6 +611,8 @@ impl<E: EthSpec> PeerManager<E> {
607611
Protocol::BlocksByRoot => PeerAction::MidToleranceError,
608612
Protocol::BlobsByRange => PeerAction::MidToleranceError,
609613
Protocol::BlobsByRoot => PeerAction::MidToleranceError,
614+
Protocol::DataColumnsByRoot => PeerAction::MidToleranceError,
615+
Protocol::DataColumnsByRange => PeerAction::MidToleranceError,
610616
Protocol::LightClientBootstrap => return,
611617
Protocol::LightClientOptimisticUpdate => return,
612618
Protocol::LightClientFinalityUpdate => return,

beacon_node/lighthouse_network/src/rpc/codec/ssz_snappy.rs

+134-6
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ use std::marker::PhantomData;
1616
use std::sync::Arc;
1717
use tokio_util::codec::{Decoder, Encoder};
1818
use types::{
19-
BlobSidecar, ChainSpec, EthSpec, ForkContext, ForkName, Hash256, LightClientBootstrap,
20-
LightClientFinalityUpdate, LightClientOptimisticUpdate, RuntimeVariableList, SignedBeaconBlock,
21-
SignedBeaconBlockAltair, SignedBeaconBlockBase, SignedBeaconBlockBellatrix,
22-
SignedBeaconBlockCapella, SignedBeaconBlockDeneb, SignedBeaconBlockElectra,
19+
BlobSidecar, ChainSpec, DataColumnSidecar, EthSpec, ForkContext, ForkName, Hash256,
20+
LightClientBootstrap, LightClientFinalityUpdate, LightClientOptimisticUpdate,
21+
RuntimeVariableList, SignedBeaconBlock, SignedBeaconBlockAltair, SignedBeaconBlockBase,
22+
SignedBeaconBlockBellatrix, SignedBeaconBlockCapella, SignedBeaconBlockDeneb,
23+
SignedBeaconBlockElectra,
2324
};
2425
use unsigned_varint::codec::Uvi;
2526

@@ -70,6 +71,8 @@ impl<E: EthSpec> Encoder<RPCCodedResponse<E>> for SSZSnappyInboundCodec<E> {
7071
RPCResponse::BlocksByRoot(res) => res.as_ssz_bytes(),
7172
RPCResponse::BlobsByRange(res) => res.as_ssz_bytes(),
7273
RPCResponse::BlobsByRoot(res) => res.as_ssz_bytes(),
74+
RPCResponse::DataColumnsByRoot(res) => res.as_ssz_bytes(),
75+
RPCResponse::DataColumnsByRange(res) => res.as_ssz_bytes(),
7376
RPCResponse::LightClientBootstrap(res) => res.as_ssz_bytes(),
7477
RPCResponse::LightClientOptimisticUpdate(res) => res.as_ssz_bytes(),
7578
RPCResponse::LightClientFinalityUpdate(res) => res.as_ssz_bytes(),
@@ -224,6 +227,8 @@ impl<E: EthSpec> Encoder<OutboundRequest<E>> for SSZSnappyOutboundCodec<E> {
224227
},
225228
OutboundRequest::BlobsByRange(req) => req.as_ssz_bytes(),
226229
OutboundRequest::BlobsByRoot(req) => req.blob_ids.as_ssz_bytes(),
230+
OutboundRequest::DataColumnsByRange(req) => req.as_ssz_bytes(),
231+
OutboundRequest::DataColumnsByRoot(req) => req.data_column_ids.as_ssz_bytes(),
227232
OutboundRequest::Ping(req) => req.as_ssz_bytes(),
228233
OutboundRequest::MetaData(_) => return Ok(()), // no metadata to encode
229234
};
@@ -414,7 +419,12 @@ fn context_bytes<E: EthSpec>(
414419
}
415420
};
416421
}
417-
RPCResponse::BlobsByRange(_) | RPCResponse::BlobsByRoot(_) => {
422+
RPCResponse::BlobsByRange(_)
423+
| RPCResponse::BlobsByRoot(_)
424+
| RPCResponse::DataColumnsByRoot(_)
425+
| RPCResponse::DataColumnsByRange(_) => {
426+
// TODO(das): If DataColumnSidecar is defined as an Electra type, update the
427+
// context bytes to point to ForkName::Electra
418428
return fork_context.to_context_bytes(ForkName::Deneb);
419429
}
420430
RPCResponse::LightClientBootstrap(lc_bootstrap) => {
@@ -512,6 +522,17 @@ fn handle_rpc_request<E: EthSpec>(
512522
)?,
513523
})))
514524
}
525+
SupportedProtocol::DataColumnsByRootV1 => Ok(Some(InboundRequest::DataColumnsByRoot(
526+
DataColumnsByRootRequest {
527+
data_column_ids: RuntimeVariableList::from_ssz_bytes(
528+
decoded_buffer,
529+
spec.max_request_data_column_sidecars as usize,
530+
)?,
531+
},
532+
))),
533+
SupportedProtocol::DataColumnsByRangeV1 => Ok(Some(InboundRequest::DataColumnsByRange(
534+
DataColumnsByRangeRequest::from_ssz_bytes(decoded_buffer)?,
535+
))),
515536
SupportedProtocol::PingV1 => Ok(Some(InboundRequest::Ping(Ping {
516537
data: u64::from_ssz_bytes(decoded_buffer)?,
517538
}))),
@@ -604,6 +625,51 @@ fn handle_rpc_response<E: EthSpec>(
604625
),
605626
)),
606627
},
628+
SupportedProtocol::DataColumnsByRootV1 => match fork_name {
629+
Some(fork_name) => {
630+
// TODO(das): PeerDAS is currently supported for both deneb and electra. This check
631+
// does not advertise the topic on deneb, simply allows it to decode it. Advertise
632+
// logic is in `SupportedTopic::currently_supported`.
633+
if fork_name.deneb_enabled() {
634+
Ok(Some(RPCResponse::DataColumnsByRoot(Arc::new(
635+
DataColumnSidecar::from_ssz_bytes(decoded_buffer)?,
636+
))))
637+
} else {
638+
Err(RPCError::ErrorResponse(
639+
RPCResponseErrorCode::InvalidRequest,
640+
"Invalid fork name for data columns by root".to_string(),
641+
))
642+
}
643+
}
644+
None => Err(RPCError::ErrorResponse(
645+
RPCResponseErrorCode::InvalidRequest,
646+
format!(
647+
"No context bytes provided for {:?} response",
648+
versioned_protocol
649+
),
650+
)),
651+
},
652+
SupportedProtocol::DataColumnsByRangeV1 => match fork_name {
653+
Some(fork_name) => {
654+
if fork_name.deneb_enabled() {
655+
Ok(Some(RPCResponse::DataColumnsByRange(Arc::new(
656+
DataColumnSidecar::from_ssz_bytes(decoded_buffer)?,
657+
))))
658+
} else {
659+
Err(RPCError::ErrorResponse(
660+
RPCResponseErrorCode::InvalidRequest,
661+
"Invalid fork name for data columns by range".to_string(),
662+
))
663+
}
664+
}
665+
None => Err(RPCError::ErrorResponse(
666+
RPCResponseErrorCode::InvalidRequest,
667+
format!(
668+
"No context bytes provided for {:?} response",
669+
versioned_protocol
670+
),
671+
)),
672+
},
607673
SupportedProtocol::PingV1 => Ok(Some(RPCResponse::Pong(Ping {
608674
data: u64::from_ssz_bytes(decoded_buffer)?,
609675
}))),
@@ -747,7 +813,8 @@ mod tests {
747813
use crate::types::{EnrAttestationBitfield, EnrSyncCommitteeBitfield};
748814
use types::{
749815
blob_sidecar::BlobIdentifier, BeaconBlock, BeaconBlockAltair, BeaconBlockBase,
750-
BeaconBlockBellatrix, EmptyBlock, Epoch, FullPayload, Signature, Slot,
816+
BeaconBlockBellatrix, DataColumnIdentifier, EmptyBlock, Epoch, FullPayload, Signature,
817+
Slot,
751818
};
752819

753820
type Spec = types::MainnetEthSpec;
@@ -794,6 +861,10 @@ mod tests {
794861
Arc::new(BlobSidecar::empty())
795862
}
796863

864+
fn empty_data_column_sidecar() -> Arc<DataColumnSidecar<Spec>> {
865+
Arc::new(DataColumnSidecar::empty())
866+
}
867+
797868
/// Bellatrix block with length < max_rpc_size.
798869
fn bellatrix_block_small(
799870
fork_context: &ForkContext,
@@ -855,6 +926,27 @@ mod tests {
855926
}
856927
}
857928

929+
fn dcbrange_request() -> DataColumnsByRangeRequest {
930+
DataColumnsByRangeRequest {
931+
start_slot: 0,
932+
count: 10,
933+
columns: vec![1, 2, 3],
934+
}
935+
}
936+
937+
fn dcbroot_request(spec: &ChainSpec) -> DataColumnsByRootRequest {
938+
DataColumnsByRootRequest {
939+
data_column_ids: RuntimeVariableList::new(
940+
vec![DataColumnIdentifier {
941+
block_root: Hash256::zero(),
942+
index: 0,
943+
}],
944+
spec.max_request_data_column_sidecars as usize,
945+
)
946+
.unwrap(),
947+
}
948+
}
949+
858950
fn bbroot_request_v1(spec: &ChainSpec) -> BlocksByRootRequest {
859951
BlocksByRootRequest::new_v1(vec![Hash256::zero()], spec)
860952
}
@@ -1012,6 +1104,12 @@ mod tests {
10121104
OutboundRequest::BlobsByRoot(bbroot) => {
10131105
assert_eq!(decoded, InboundRequest::BlobsByRoot(bbroot))
10141106
}
1107+
OutboundRequest::DataColumnsByRoot(dcbroot) => {
1108+
assert_eq!(decoded, InboundRequest::DataColumnsByRoot(dcbroot))
1109+
}
1110+
OutboundRequest::DataColumnsByRange(dcbrange) => {
1111+
assert_eq!(decoded, InboundRequest::DataColumnsByRange(dcbrange))
1112+
}
10151113
OutboundRequest::Ping(ping) => {
10161114
assert_eq!(decoded, InboundRequest::Ping(ping))
10171115
}
@@ -1138,6 +1236,34 @@ mod tests {
11381236
),
11391237
Ok(Some(RPCResponse::BlobsByRoot(empty_blob_sidecar()))),
11401238
);
1239+
1240+
assert_eq!(
1241+
encode_then_decode_response(
1242+
SupportedProtocol::DataColumnsByRangeV1,
1243+
RPCCodedResponse::Success(RPCResponse::DataColumnsByRange(
1244+
empty_data_column_sidecar()
1245+
)),
1246+
ForkName::Deneb,
1247+
&chain_spec
1248+
),
1249+
Ok(Some(RPCResponse::DataColumnsByRange(
1250+
empty_data_column_sidecar()
1251+
))),
1252+
);
1253+
1254+
assert_eq!(
1255+
encode_then_decode_response(
1256+
SupportedProtocol::DataColumnsByRootV1,
1257+
RPCCodedResponse::Success(RPCResponse::DataColumnsByRoot(
1258+
empty_data_column_sidecar()
1259+
)),
1260+
ForkName::Deneb,
1261+
&chain_spec
1262+
),
1263+
Ok(Some(RPCResponse::DataColumnsByRoot(
1264+
empty_data_column_sidecar()
1265+
))),
1266+
);
11411267
}
11421268

11431269
// Test RPCResponse encoding/decoding for V1 messages
@@ -1491,6 +1617,8 @@ mod tests {
14911617
OutboundRequest::MetaData(MetadataRequest::new_v1()),
14921618
OutboundRequest::BlobsByRange(blbrange_request()),
14931619
OutboundRequest::BlobsByRoot(blbroot_request(&chain_spec)),
1620+
OutboundRequest::DataColumnsByRange(dcbrange_request()),
1621+
OutboundRequest::DataColumnsByRoot(dcbroot_request(&chain_spec)),
14941622
OutboundRequest::MetaData(MetadataRequest::new_v2()),
14951623
];
14961624

0 commit comments

Comments
 (0)