Skip to content

Commit bf118a1

Browse files
Fix block v3 header decoding (#5366)
* Fix block v3 header decoding
1 parent 258eeb5 commit bf118a1

File tree

2 files changed

+69
-23
lines changed

2 files changed

+69
-23
lines changed

beacon_node/http_api/tests/tests.rs

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2721,6 +2721,31 @@ impl ApiTester {
27212721
self
27222722
}
27232723

2724+
/// Check that the metadata from the headers & JSON response body are consistent, and that the
2725+
/// consensus block value is non-zero.
2726+
fn check_block_v3_metadata(
2727+
metadata: &ProduceBlockV3Metadata,
2728+
response: &JsonProduceBlockV3Response<E>,
2729+
) {
2730+
// Compare fork name to ForkVersionedResponse rather than metadata consensus_version, which
2731+
// is deserialized to a dummy value.
2732+
assert_eq!(Some(metadata.consensus_version), response.version);
2733+
assert_eq!(ForkName::Base, response.metadata.consensus_version);
2734+
assert_eq!(
2735+
metadata.execution_payload_blinded,
2736+
response.metadata.execution_payload_blinded
2737+
);
2738+
assert_eq!(
2739+
metadata.execution_payload_value,
2740+
response.metadata.execution_payload_value
2741+
);
2742+
assert_eq!(
2743+
metadata.consensus_block_value,
2744+
response.metadata.consensus_block_value
2745+
);
2746+
assert!(!metadata.consensus_block_value.is_zero());
2747+
}
2748+
27242749
pub async fn test_block_production_v3_ssz(self) -> Self {
27252750
let fork = self.chain.canonical_head.cached_head().head_fork();
27262751
let genesis_validators_root = self.chain.genesis_validators_root;
@@ -3582,11 +3607,12 @@ impl ApiTester {
35823607

35833608
let (proposer_index, randao_reveal) = self.get_test_randao(slot, epoch).await;
35843609

3585-
let (payload_type, _) = self
3610+
let (payload_type, metadata) = self
35863611
.client
35873612
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
35883613
.await
35893614
.unwrap();
3615+
Self::check_block_v3_metadata(&metadata, &payload_type);
35903616

35913617
let payload: BlindedPayload<E> = match payload_type.data {
35923618
ProduceBlockV3Response::Blinded(payload) => {
@@ -3608,11 +3634,12 @@ impl ApiTester {
36083634

36093635
let (proposer_index, randao_reveal) = self.get_test_randao(slot, epoch).await;
36103636

3611-
let (payload_type, _) = self
3637+
let (payload_type, metadata) = self
36123638
.client
36133639
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, Some(0))
36143640
.await
36153641
.unwrap();
3642+
Self::check_block_v3_metadata(&metadata, &payload_type);
36163643

36173644
let payload: FullPayload<E> = match payload_type.data {
36183645
ProduceBlockV3Response::Full(payload) => {
@@ -3634,11 +3661,12 @@ impl ApiTester {
36343661

36353662
let (proposer_index, randao_reveal) = self.get_test_randao(slot, epoch).await;
36363663

3637-
let (payload_type, _) = self
3664+
let (payload_type, metadata) = self
36383665
.client
36393666
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, Some(u64::MAX))
36403667
.await
36413668
.unwrap();
3669+
Self::check_block_v3_metadata(&metadata, &payload_type);
36423670

36433671
let payload: BlindedPayload<E> = match payload_type.data {
36443672
ProduceBlockV3Response::Blinded(payload) => {
@@ -3738,11 +3766,12 @@ impl ApiTester {
37383766

37393767
let (proposer_index, randao_reveal) = self.get_test_randao(slot, epoch).await;
37403768

3741-
let (payload_type, _) = self
3769+
let (payload_type, metadata) = self
37423770
.client
37433771
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
37443772
.await
37453773
.unwrap();
3774+
Self::check_block_v3_metadata(&metadata, &payload_type);
37463775

37473776
let payload: BlindedPayload<E> = match payload_type.data {
37483777
ProduceBlockV3Response::Blinded(payload) => {
@@ -3814,11 +3843,12 @@ impl ApiTester {
38143843

38153844
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
38163845

3817-
let (payload_type, _) = self
3846+
let (payload_type, metadata) = self
38183847
.client
38193848
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
38203849
.await
38213850
.unwrap();
3851+
Self::check_block_v3_metadata(&metadata, &payload_type);
38223852

38233853
let payload: BlindedPayload<E> = match payload_type.data {
38243854
ProduceBlockV3Response::Blinded(payload) => {
@@ -3904,11 +3934,12 @@ impl ApiTester {
39043934

39053935
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
39063936

3907-
let (payload_type, _) = self
3937+
let (payload_type, metadata) = self
39083938
.client
39093939
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
39103940
.await
39113941
.unwrap();
3942+
Self::check_block_v3_metadata(&metadata, &payload_type);
39123943

39133944
let payload: FullPayload<E> = match payload_type.data {
39143945
ProduceBlockV3Response::Full(payload) => {
@@ -3990,11 +4021,12 @@ impl ApiTester {
39904021
.unwrap();
39914022
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
39924023

3993-
let (payload_type, _) = self
4024+
let (payload_type, metadata) = self
39944025
.client
39954026
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
39964027
.await
39974028
.unwrap();
4029+
Self::check_block_v3_metadata(&metadata, &payload_type);
39984030

39994031
let payload: FullPayload<E> = match payload_type.data {
40004032
ProduceBlockV3Response::Full(payload) => {
@@ -4076,11 +4108,12 @@ impl ApiTester {
40764108

40774109
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
40784110

4079-
let (payload_type, _) = self
4111+
let (payload_type, metadata) = self
40804112
.client
40814113
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
40824114
.await
40834115
.unwrap();
4116+
Self::check_block_v3_metadata(&metadata, &payload_type);
40844117

40854118
let payload: FullPayload<E> = match payload_type.data {
40864119
ProduceBlockV3Response::Full(payload) => {
@@ -4160,11 +4193,12 @@ impl ApiTester {
41604193

41614194
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
41624195

4163-
let (payload_type, _) = self
4196+
let (payload_type, metadata) = self
41644197
.client
41654198
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
41664199
.await
41674200
.unwrap();
4201+
Self::check_block_v3_metadata(&metadata, &payload_type);
41684202

41694203
let payload: FullPayload<E> = match payload_type.data {
41704204
ProduceBlockV3Response::Full(payload) => {
@@ -4216,11 +4250,12 @@ impl ApiTester {
42164250

42174251
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
42184252

4219-
let (payload_type, _) = self
4253+
let (payload_type, metadata) = self
42204254
.client
42214255
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
42224256
.await
42234257
.unwrap();
4258+
Self::check_block_v3_metadata(&metadata, &payload_type);
42244259

42254260
match payload_type.data {
42264261
ProduceBlockV3Response::Full(_) => (),
@@ -4282,11 +4317,12 @@ impl ApiTester {
42824317

42834318
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
42844319

4285-
let (payload_type, _) = self
4320+
let (payload_type, metadata) = self
42864321
.client
42874322
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
42884323
.await
42894324
.unwrap();
4325+
Self::check_block_v3_metadata(&metadata, &payload_type);
42904326

42914327
match payload_type.data {
42924328
ProduceBlockV3Response::Full(_) => (),
@@ -4390,11 +4426,12 @@ impl ApiTester {
43904426
.get_test_randao(next_slot, next_slot.epoch(E::slots_per_epoch()))
43914427
.await;
43924428

4393-
let (payload_type, _) = self
4429+
let (payload_type, metadata) = self
43944430
.client
43954431
.get_validator_blocks_v3::<E>(next_slot, &randao_reveal, None, None)
43964432
.await
43974433
.unwrap();
4434+
Self::check_block_v3_metadata(&metadata, &payload_type);
43984435

43994436
match payload_type.data {
44004437
ProduceBlockV3Response::Blinded(_) => (),
@@ -4410,11 +4447,12 @@ impl ApiTester {
44104447
.get_test_randao(next_slot, next_slot.epoch(E::slots_per_epoch()))
44114448
.await;
44124449

4413-
let (payload_type, _) = self
4450+
let (payload_type, metadata) = self
44144451
.client
44154452
.get_validator_blocks_v3::<E>(next_slot, &randao_reveal, None, None)
44164453
.await
44174454
.unwrap();
4455+
Self::check_block_v3_metadata(&metadata, &payload_type);
44184456

44194457
match payload_type.data {
44204458
ProduceBlockV3Response::Full(_) => (),
@@ -4538,11 +4576,12 @@ impl ApiTester {
45384576
.get_test_randao(next_slot, next_slot.epoch(E::slots_per_epoch()))
45394577
.await;
45404578

4541-
let (payload_type, _) = self
4579+
let (payload_type, metadata) = self
45424580
.client
45434581
.get_validator_blocks_v3::<E>(next_slot, &randao_reveal, None, None)
45444582
.await
45454583
.unwrap();
4584+
Self::check_block_v3_metadata(&metadata, &payload_type);
45464585

45474586
match payload_type.data {
45484587
ProduceBlockV3Response::Full(_) => (),
@@ -4568,11 +4607,12 @@ impl ApiTester {
45684607
.get_test_randao(next_slot, next_slot.epoch(E::slots_per_epoch()))
45694608
.await;
45704609

4571-
let (payload_type, _) = self
4610+
let (payload_type, metadata) = self
45724611
.client
45734612
.get_validator_blocks_v3::<E>(next_slot, &randao_reveal, None, None)
45744613
.await
45754614
.unwrap();
4615+
Self::check_block_v3_metadata(&metadata, &payload_type);
45764616

45774617
match payload_type.data {
45784618
ProduceBlockV3Response::Blinded(_) => (),
@@ -4648,11 +4688,12 @@ impl ApiTester {
46484688

46494689
let (proposer_index, randao_reveal) = self.get_test_randao(slot, epoch).await;
46504690

4651-
let (payload_type, _) = self
4691+
let (payload_type, metadata) = self
46524692
.client
46534693
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
46544694
.await
46554695
.unwrap();
4696+
Self::check_block_v3_metadata(&metadata, &payload_type);
46564697

46574698
let payload: FullPayload<E> = match payload_type.data {
46584699
ProduceBlockV3Response::Full(payload) => {
@@ -4717,11 +4758,12 @@ impl ApiTester {
47174758

47184759
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
47194760

4720-
let (payload_type, _) = self
4761+
let (payload_type, metadata) = self
47214762
.client
47224763
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
47234764
.await
47244765
.unwrap();
4766+
Self::check_block_v3_metadata(&metadata, &payload_type);
47254767

47264768
match payload_type.data {
47274769
ProduceBlockV3Response::Blinded(_) => (),
@@ -4781,11 +4823,12 @@ impl ApiTester {
47814823

47824824
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
47834825

4784-
let (payload_type, _) = self
4826+
let (payload_type, metadata) = self
47854827
.client
47864828
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
47874829
.await
47884830
.unwrap();
4831+
Self::check_block_v3_metadata(&metadata, &payload_type);
47894832

47904833
match payload_type.data {
47914834
ProduceBlockV3Response::Full(_) => (),
@@ -4845,11 +4888,12 @@ impl ApiTester {
48454888

48464889
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
48474890

4848-
let (payload_type, _) = self
4891+
let (payload_type, metadata) = self
48494892
.client
48504893
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
48514894
.await
48524895
.unwrap();
4896+
Self::check_block_v3_metadata(&metadata, &payload_type);
48534897

48544898
match payload_type.data {
48554899
ProduceBlockV3Response::Full(_) => (),
@@ -4907,11 +4951,12 @@ impl ApiTester {
49074951
let epoch = self.chain.epoch().unwrap();
49084952
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
49094953

4910-
let (payload_type, _) = self
4954+
let (payload_type, metadata) = self
49114955
.client
49124956
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
49134957
.await
49144958
.unwrap();
4959+
Self::check_block_v3_metadata(&metadata, &payload_type);
49154960

49164961
let _block_contents = match payload_type.data {
49174962
ProduceBlockV3Response::Blinded(payload) => payload,
@@ -4979,11 +5024,12 @@ impl ApiTester {
49795024
let epoch = self.chain.epoch().unwrap();
49805025
let (_, randao_reveal) = self.get_test_randao(slot, epoch).await;
49815026

4982-
let (payload_type, _) = self
5027+
let (payload_type, metadata) = self
49835028
.client
49845029
.get_validator_blocks_v3::<E>(slot, &randao_reveal, None, None)
49855030
.await
49865031
.unwrap();
5032+
Self::check_block_v3_metadata(&metadata, &payload_type);
49875033

49885034
match payload_type.data {
49895035
ProduceBlockV3Response::Full(_) => (),

common/eth2/src/types.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1710,12 +1710,12 @@ impl TryFrom<&HeaderMap> for ProduceBlockV3Metadata {
17101710
})?;
17111711
let execution_payload_value =
17121712
parse_required_header(headers, EXECUTION_PAYLOAD_VALUE_HEADER, |s| {
1713-
s.parse::<Uint256>()
1713+
Uint256::from_dec_str(s)
17141714
.map_err(|e| format!("invalid {EXECUTION_PAYLOAD_VALUE_HEADER}: {e:?}"))
17151715
})?;
17161716
let consensus_block_value =
17171717
parse_required_header(headers, CONSENSUS_BLOCK_VALUE_HEADER, |s| {
1718-
s.parse::<Uint256>()
1718+
Uint256::from_dec_str(s)
17191719
.map_err(|e| format!("invalid {CONSENSUS_BLOCK_VALUE_HEADER}: {e:?}"))
17201720
})?;
17211721

0 commit comments

Comments
 (0)