@@ -315,13 +315,31 @@ def validate_gaslimit(self, header: BlockHeader) -> None:
315
315
def validate_uncles (self , block : BaseBlock ) -> None :
316
316
raise NotImplementedError ("Chain classes must implement this method" )
317
317
318
- @abstractmethod
318
+ @classmethod
319
319
def validate_chain (
320
- self ,
320
+ cls ,
321
321
parent : BlockHeader ,
322
322
chain : Tuple [BlockHeader , ...],
323
323
seal_check_random_sample_rate : int = 1 ) -> None :
324
- raise NotImplementedError ("Chain classes must implement this method" )
324
+
325
+ all_indices = list (range (len (chain )))
326
+ if seal_check_random_sample_rate == 1 :
327
+ headers_to_check_seal = set (all_indices )
328
+ else :
329
+ sample_size = len (all_indices ) // seal_check_random_sample_rate
330
+ headers_to_check_seal = set (random .sample (all_indices , sample_size ))
331
+
332
+ for i , header in enumerate (chain ):
333
+ if header .parent_hash != parent .hash :
334
+ raise ValidationError (
335
+ "Invalid header chain; {} has parent {}, but expected {}" .format (
336
+ header , header .parent_hash , parent .hash ))
337
+ vm_class = cls .get_vm_class_for_block_number (header .block_number )
338
+ if i in headers_to_check_seal :
339
+ vm_class .validate_header (header , parent , check_seal = True )
340
+ else :
341
+ vm_class .validate_header (header , parent , check_seal = False )
342
+ parent = header
325
343
326
344
327
345
class Chain (BaseChain ):
@@ -820,31 +838,6 @@ def validate_uncles(self, block: BaseBlock) -> None:
820
838
uncle_vm_class = self .get_vm_class_for_block_number (uncle .block_number )
821
839
uncle_vm_class .validate_uncle (block , uncle , uncle_parent )
822
840
823
- def validate_chain (
824
- self ,
825
- parent : BlockHeader ,
826
- chain : Tuple [BlockHeader , ...],
827
- seal_check_random_sample_rate : int = 1 ) -> None :
828
-
829
- all_indices = list (range (len (chain )))
830
- if seal_check_random_sample_rate == 1 :
831
- headers_to_check_seal = set (all_indices )
832
- else :
833
- sample_size = len (all_indices ) // seal_check_random_sample_rate
834
- headers_to_check_seal = set (random .sample (all_indices , sample_size ))
835
-
836
- for i , header in enumerate (chain ):
837
- if header .parent_hash != parent .hash :
838
- raise ValidationError (
839
- "Invalid header chain; {} has parent {}, but expected {}" .format (
840
- header , header .parent_hash , parent .hash ))
841
- vm_class = self .get_vm_class_for_block_number (header .block_number )
842
- if i in headers_to_check_seal :
843
- vm_class .validate_header (header , parent , check_seal = True )
844
- else :
845
- vm_class .validate_header (header , parent , check_seal = False )
846
- parent = header
847
-
848
841
849
842
@to_set
850
843
def _extract_uncle_hashes (blocks : Iterable [BaseBlock ]) -> Iterable [Hash32 ]:
0 commit comments