@@ -11,13 +11,31 @@ use ethportal_api::{
11
11
} ;
12
12
use ssz:: Decode ;
13
13
use tokio:: sync:: RwLock ;
14
+ use tracing:: info;
15
+ use tree_hash:: TreeHash ;
14
16
use trin_validation:: {
17
+ header_validator:: { HeaderValidator , HistoricalSummariesProvider } ,
15
18
oracle:: HeaderOracle ,
16
19
validator:: { ValidationResult , Validator } ,
17
20
} ;
18
21
19
22
pub struct ChainHistoryValidator {
20
23
pub header_oracle : Arc < RwLock < HeaderOracle > > ,
24
+ pub header_validator : HeaderValidator ,
25
+ }
26
+
27
+ impl ChainHistoryValidator {
28
+ pub fn new ( header_oracle : Arc < RwLock < HeaderOracle > > ) -> Self {
29
+ let header_validator = HeaderValidator :: default ( ) ;
30
+ info ! (
31
+ hash_tree_root = %hex_encode( header_validator. pre_merge_acc. tree_hash_root( ) . 0 ) ,
32
+ "Loaded pre-merge accumulator."
33
+ ) ;
34
+ Self {
35
+ header_oracle,
36
+ header_validator,
37
+ }
38
+ }
21
39
}
22
40
23
41
impl Validator < HistoryContentKey > for ChainHistoryValidator {
@@ -38,11 +56,12 @@ impl Validator<HistoryContentKey> for ChainHistoryValidator {
38
56
"Content validation failed: Invalid header hash. Found: {header_hash:?} - Expected: {:?}" ,
39
57
hex_encode( header_hash)
40
58
) ;
41
- self . header_oracle
42
- . read ( )
43
- . await
44
- . header_validator
45
- . validate_header_with_proof ( & header_with_proof) ?;
59
+ self . header_validator
60
+ . validate_header_with_proof (
61
+ & header_with_proof,
62
+ HistoricalSummariesProvider :: HeaderOracle ( self . header_oracle . clone ( ) ) ,
63
+ )
64
+ . await ?;
46
65
47
66
Ok ( ValidationResult :: new ( true ) )
48
67
}
@@ -57,11 +76,12 @@ impl Validator<HistoryContentKey> for ChainHistoryValidator {
57
76
"Content validation failed: Invalid header number. Found: {header_number} - Expected: {}" ,
58
77
key. block_number
59
78
) ;
60
- self . header_oracle
61
- . read ( )
62
- . await
63
- . header_validator
64
- . validate_header_with_proof ( & header_with_proof) ?;
79
+ self . header_validator
80
+ . validate_header_with_proof (
81
+ & header_with_proof,
82
+ HistoricalSummariesProvider :: HeaderOracle ( self . header_oracle . clone ( ) ) ,
83
+ )
84
+ . await ?;
65
85
66
86
Ok ( ValidationResult :: new ( true ) )
67
87
}
@@ -152,7 +172,7 @@ mod tests {
152
172
let header_with_proof =
153
173
HeaderWithProof :: from_ssz_bytes ( & header_with_proof_ssz) . expect ( "error decoding header" ) ;
154
174
let header_oracle = default_header_oracle ( ) ;
155
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
175
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
156
176
let content_key =
157
177
HistoryContentKey :: new_block_header_by_hash ( header_with_proof. header . hash_slow ( ) ) ;
158
178
chain_history_validator
@@ -173,7 +193,7 @@ mod tests {
173
193
174
194
let content_value = header. as_ssz_bytes ( ) ;
175
195
let header_oracle = default_header_oracle ( ) ;
176
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
196
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
177
197
let content_key = HistoryContentKey :: new_block_header_by_hash ( header. header . hash_slow ( ) ) ;
178
198
chain_history_validator
179
199
. validate_content ( & content_key, & content_value)
@@ -194,7 +214,7 @@ mod tests {
194
214
195
215
let content_value = header. as_ssz_bytes ( ) ;
196
216
let header_oracle = default_header_oracle ( ) ;
197
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
217
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
198
218
let content_key = HistoryContentKey :: new_block_header_by_hash ( header. header . hash_slow ( ) ) ;
199
219
chain_history_validator
200
220
. validate_content ( & content_key, & content_value)
@@ -208,7 +228,7 @@ mod tests {
208
228
let header_with_proof =
209
229
HeaderWithProof :: from_ssz_bytes ( & header_with_proof_ssz) . expect ( "error decoding header" ) ;
210
230
let header_oracle = default_header_oracle ( ) ;
211
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
231
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
212
232
let content_key =
213
233
HistoryContentKey :: new_block_header_by_number ( header_with_proof. header . number ) ;
214
234
chain_history_validator
@@ -229,7 +249,7 @@ mod tests {
229
249
230
250
let content_value = header. as_ssz_bytes ( ) ;
231
251
let header_oracle = default_header_oracle ( ) ;
232
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
252
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
233
253
let content_key = HistoryContentKey :: new_block_header_by_number ( header. header . number ) ;
234
254
chain_history_validator
235
255
. validate_content ( & content_key, & content_value)
@@ -250,7 +270,7 @@ mod tests {
250
270
251
271
let content_value = header. as_ssz_bytes ( ) ;
252
272
let header_oracle = default_header_oracle ( ) ;
253
- let chain_history_validator = ChainHistoryValidator { header_oracle } ;
273
+ let chain_history_validator = ChainHistoryValidator :: new ( header_oracle) ;
254
274
let content_key = HistoryContentKey :: new_block_header_by_number ( header. header . number ) ;
255
275
chain_history_validator
256
276
. validate_content ( & content_key, & content_value)
0 commit comments