Skip to content

Commit 69afd31

Browse files
committed
fix dao check
1 parent fb401c7 commit 69afd31

File tree

4 files changed

+26
-39
lines changed

4 files changed

+26
-39
lines changed

p2p/peer.py

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import operator
88
import random
99
import struct
10-
import time
1110
from abc import (
1211
ABC,
1312
abstractmethod
@@ -776,8 +775,6 @@ async def ensure_same_side_on_dao_fork(
776775
wait for that we may receive other messages from the peer, which are returned so that they
777776
can be re-added to our subscribers' queues when the peer is finally added to the pool.
778777
"""
779-
from trinity.protocol.common.commands import BaseBlockHeaders
780-
msgs = []
781778
for start_block, vm_class in self.vm_configuration:
782779
if not issubclass(vm_class, HomesteadVM):
783780
continue
@@ -790,47 +787,40 @@ async def ensure_same_side_on_dao_fork(
790787
start_block = vm_class.dao_fork_block_number - 1
791788
# TODO: This can be either an `ETHPeer` or an `LESPeer`. Will be
792789
# fixed once full awaitable request API is completed.
793-
request = peer.request_block_headers( # type: ignore
794-
start_block,
795-
max_headers=2,
796-
reverse=False,
797-
)
798-
start = time.time()
799790
try:
800-
while True:
801-
elapsed = int(time.time() - start)
802-
remaining_timeout = max(0, CHAIN_SPLIT_CHECK_TIMEOUT - elapsed)
803-
cmd, msg = await self.wait(
804-
peer.read_msg(), timeout=remaining_timeout)
805-
if isinstance(cmd, BaseBlockHeaders):
806-
headers = cmd.extract_headers(msg)
807-
break
808-
else:
809-
msgs.append((cmd, msg))
810-
continue
791+
class MsgBuffer(PeerSubscriber):
792+
logger = logging.getLogger('p2p.peer.MsgBuffer')
793+
msg_queue_maxsize = 200
794+
subscription_msg_types = {protocol.Command}
795+
796+
msg_buffer = MsgBuffer()
797+
798+
with msg_buffer.subscribe_peer(peer):
799+
headers = await peer.handler.get_block_headers( # type: ignore
800+
start_block,
801+
max_headers=2,
802+
reverse=False,
803+
timeout=CHAIN_SPLIT_CHECK_TIMEOUT,
804+
)
805+
806+
msgs = [msg_buffer.msg_queue.get_nowait()[1:] for _ in range(msg_buffer.queue_size)]
807+
811808
except (TimeoutError, PeerConnectionLost) as err:
812809
raise DAOForkCheckFailure(
813-
"Timed out waiting for DAO fork header from {}: {}".format(peer, err))
810+
"Timed out waiting for DAO fork header from {}: {}".format(peer, err)
811+
) from err
814812
except MalformedMessage as err:
815813
raise DAOForkCheckFailure(
816814
"Malformed message while doing DAO fork check with {0}: {1}".format(
817815
peer, err,
818816
)
819817
) from err
820-
821-
try:
822-
request.validate_headers(headers)
823818
except ValidationError as err:
824819
raise DAOForkCheckFailure(
825820
"Invalid header response during DAO fork check: {}".format(err)
826-
)
821+
) from err
827822

828-
if len(headers) != 2:
829-
raise DAOForkCheckFailure(
830-
"Peer failed to return all requested headers for DAO fork check"
831-
)
832-
else:
833-
parent, header = headers
823+
parent, header = headers
834824

835825
try:
836826
vm_class.validate_header(header, parent, check_seal=True)

trinity/protocol/common/handlers.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
from abc import abstractmethod
22
from typing import (
3+
Any,
34
Dict,
45
Type,
56
)
67

78
from p2p.peer import BasePeer
8-
from p2p.protocol import _DecodedMsgType
99
from p2p.service import BaseService
1010

1111
from .managers import BaseRequestManager
12-
from .requests import BaseRequest
1312

1413

1514
class BaseRequestResponseHandler(BaseService):
1615
@property
1716
@abstractmethod
18-
def _managers(self) -> Dict[str, Type[BaseRequestManager[BasePeer, BaseRequest, _DecodedMsgType, _DecodedMsgType]]]:
17+
def _managers(self) -> Dict[str, Type[BaseRequestManager[Any, Any, Any, Any]]]:
1918
pass
2019

2120
def __init__(self, peer: BasePeer) -> None:

trinity/protocol/eth/managers.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
BaseRequestManager,
1717
)
1818

19-
from .commands import (
20-
BlockHeaders,
21-
)
19+
from .commands import BlockHeaders
2220
from .requests import HeaderRequest
2321

2422
if TYPE_CHECKING:
@@ -30,7 +28,7 @@ class GetBlockHeadersRequestManager(BaseRequestManager['ETHPeer', HeaderRequest,
3028

3129
_response_msg_type: Type[Command] = BlockHeaders
3230

33-
async def __call__(self,
31+
async def __call__(self, # type: ignore
3432
block_number_or_hash: BlockIdentifier,
3533
max_headers: int = None,
3634
skip: int = 0,

trinity/protocol/les/managers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class GetBlockHeadersRequestManager(BaseRequestManager['LESPeer', HeaderRequest,
3535

3636
_response_msg_type: Type[Command] = BlockHeaders
3737

38-
async def __call__(self,
38+
async def __call__(self, # type: ignore
3939
block_number_or_hash: BlockIdentifier,
4040
max_headers: int = None,
4141
skip: int = 0,

0 commit comments

Comments
 (0)