Skip to content

Commit 680b5e5

Browse files
committed
Support light client header validation during sync
1 parent 6922d9b commit 680b5e5

File tree

2 files changed

+25
-41
lines changed

2 files changed

+25
-41
lines changed

eth/chains/base.py

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,31 @@ def validate_gaslimit(self, header: BlockHeader) -> None:
315315
def validate_uncles(self, block: BaseBlock) -> None:
316316
raise NotImplementedError("Chain classes must implement this method")
317317

318-
@abstractmethod
318+
@classmethod
319319
def validate_chain(
320-
self,
320+
cls,
321321
parent: BlockHeader,
322322
chain: Tuple[BlockHeader, ...],
323323
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
325343

326344

327345
class Chain(BaseChain):
@@ -820,31 +838,6 @@ def validate_uncles(self, block: BaseBlock) -> None:
820838
uncle_vm_class = self.get_vm_class_for_block_number(uncle.block_number)
821839
uncle_vm_class.validate_uncle(block, uncle, uncle_parent)
822840

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-
848841

849842
@to_set
850843
def _extract_uncle_hashes(blocks: Iterable[BaseBlock]) -> Iterable[Hash32]:

trinity/chains/light.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
from trinity.sync.light.service import (
5757
BaseLightPeerChain,
5858
)
59+
from trinity.utils.async_dispatch import (
60+
async_method,
61+
)
5962

6063
from .base import BaseAsyncChain
6164

@@ -250,16 +253,4 @@ def validate_seal(self, header: BlockHeader) -> None:
250253
def validate_uncles(self, block: BaseBlock) -> None:
251254
raise NotImplementedError("Chain classes must implement " + inspect.stack()[0][3])
252255

253-
def validate_chain(
254-
self,
255-
parent: BlockHeader,
256-
chain: Tuple[BlockHeader, ...],
257-
seal_check_random_sample_rate: int = 1) -> None:
258-
raise NotImplementedError("Chain classes must implement " + inspect.stack()[0][3])
259-
260-
async def coro_validate_chain(
261-
self,
262-
parent: BlockHeader,
263-
chain: Tuple[BlockHeader, ...],
264-
seal_check_random_sample_rate: int = 1) -> None:
265-
raise NotImplementedError("Chain classes must implement " + inspect.stack()[0][3])
256+
coro_validate_chain = async_method('validate_chain')

0 commit comments

Comments
 (0)