Skip to content

Commit 62164b7

Browse files
authored
Merge pull request ethereum#618 from carver/connect-to-syncing-peers
Connect to unsynced peers, and trinity peers
2 parents 159d24f + 7ac9344 commit 62164b7

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed

p2p/peer_pool.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,16 @@ def unsubscribe(self, subscriber: PeerSubscriber) -> None:
245245
async def start_peer(self, peer: BasePeer) -> None:
246246
self.run_child_service(peer)
247247
await self.wait(peer.events.started.wait(), timeout=1)
248+
if peer.is_operational:
249+
self._add_peer(peer, ())
250+
else:
251+
self.logger.debug("%s was cancelled immediately, not adding to pool", peer)
252+
248253
try:
249-
with peer.collect_sub_proto_messages() as buffer:
250-
await self.wait(
251-
peer.boot_manager.events.finished.wait(),
252-
timeout=self._peer_boot_timeout
253-
)
254+
await self.wait(
255+
peer.boot_manager.events.finished.wait(),
256+
timeout=self._peer_boot_timeout
257+
)
254258
except TimeoutError as err:
255259
self.logger.debug('Timout waiting for peer to boot: %s', err)
256260
await peer.disconnect(DisconnectReason.timeout)
@@ -259,10 +263,8 @@ async def start_peer(self, peer: BasePeer) -> None:
259263
await self.connection_tracker.record_failure(peer.remote, err)
260264
raise
261265
else:
262-
if peer.is_operational:
263-
self._add_peer(peer, buffer.get_messages())
264-
else:
265-
self.logger.debug('%s disconnected during boot-up, not adding to pool', peer)
266+
if not peer.is_operational:
267+
self.logger.debug('%s disconnected during boot-up, dropped from pool', peer)
266268

267269
def _add_peer(self,
268270
peer: BasePeer,

trinity/protocol/common/boot.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from eth_utils import ValidationError
44

5+
from eth.rlp.headers import BlockHeader
56
from eth.vm.forks import HomesteadVM
67

78
from p2p.exceptions import PeerConnectionLost
@@ -42,7 +43,8 @@ async def ensure_same_side_on_dao_fork(self) -> None:
4243
# VM comes after the fork, so stop checking
4344
break
4445

45-
start_block = vm_class.get_dao_fork_block_number() - 1
46+
dao_fork_num = vm_class.get_dao_fork_block_number()
47+
start_block = dao_fork_num - 1
4648

4749
try:
4850
headers = await self.peer.requests.get_block_headers( # type: ignore
@@ -62,13 +64,46 @@ async def ensure_same_side_on_dao_fork(self) -> None:
6264
) from err
6365

6466
if len(headers) != 2:
65-
raise DAOForkCheckFailure(
66-
f"{self.peer} failed to return DAO fork check headers"
67-
)
67+
tip_header = await self._get_tip_header()
68+
if tip_header.block_number < dao_fork_num:
69+
self.logger.debug(
70+
f"{self.peer} has tip {tip_header!r}, and returned {headers!r} "
71+
"at DAO fork #{dao_fork_num}. Peer seems to be syncing..."
72+
)
73+
return
74+
else:
75+
raise DAOForkCheckFailure(
76+
f"{self.peer} has tip {tip_header!r}, but only returned {headers!r} "
77+
"at DAO fork #{dao_fork_num}. Peer seems to be witholding DAO headers..."
78+
)
6879
else:
6980
parent, header = headers
7081

7182
try:
7283
vm_class.validate_header(header, parent, check_seal=True)
7384
except ValidationError as err:
7485
raise DAOForkCheckFailure(f"{self.peer} failed DAO fork check validation: {err}")
86+
87+
async def _get_tip_header(self) -> BlockHeader:
88+
try:
89+
headers = await self.peer.requests.get_block_headers( # type: ignore
90+
self.peer.head_hash,
91+
max_headers=1,
92+
timeout=CHAIN_SPLIT_CHECK_TIMEOUT,
93+
)
94+
95+
except (TimeoutError, PeerConnectionLost) as err:
96+
raise DAOForkCheckFailure(
97+
f"Timed out waiting for tip header from {self.peer}: {err}"
98+
) from err
99+
except ValidationError as err:
100+
raise DAOForkCheckFailure(
101+
f"Invalid header response for tip header during DAO fork check: {err}"
102+
) from err
103+
else:
104+
if len(headers) != 1:
105+
raise DAOForkCheckFailure(
106+
f"{self.peer} returned {headers!r} when asked for tip"
107+
)
108+
else:
109+
return headers[0]

0 commit comments

Comments
 (0)