Skip to content

Commit e9006ef

Browse files
committed
[FIX] blacklist for longer in case of header validation failure
1 parent 15a797c commit e9006ef

File tree

4 files changed

+17
-5
lines changed

4 files changed

+17
-5
lines changed

src/main/resources/application.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,9 @@ mantis {
328328
# are controlled by a single party, eg. private networks)
329329
blacklist-duration = 200.seconds
330330

331+
# Duration for high offense blacklisting of a peer. Blacklisting reason include: header validation failure.
332+
critical-blacklist-duration = 240.minutes
333+
331334
# Retry interval when not having enough peers to start fast-sync
332335
start-retry-interval = 5.seconds
333336

src/main/scala/io/iohk/ethereum/blockchain/sync/fast/FastSync.scala

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,8 @@ class FastSync(
408408
blockchain.getChainWeightByHash(header.parentHash).toRight(ParentChainWeightNotFound(header))
409409
}
410410

411-
private def handleRewind(header: BlockHeader, peer: Peer, N: Int): Unit = {
412-
blacklist(peer.id, blacklistDuration, "block header validation failed")
411+
private def handleRewind(header: BlockHeader, peer: Peer, N: Int, duration: FiniteDuration): Unit = {
412+
blacklist(peer.id, duration, "block header validation failed")
413413
if (header.number <= syncState.safeDownloadTarget) {
414414
discardLastBlocks(header.number, N)
415415
syncState = syncState.updateDiscardedBlocks(header, N)
@@ -431,14 +431,20 @@ class FastSync(
431431
// we blacklist peer just in case we got malicious peer which would send us bad blocks, forcing us to rollback
432432
// to genesis
433433
log.warning("Parent chain weight not found for block {}, not processing rest of headers", header.idTag)
434-
handleRewind(header, peer, syncConfig.fastSyncBlockValidationN)
434+
handleRewind(header, peer, syncConfig.fastSyncBlockValidationN, syncConfig.blacklistDuration)
435435
case HeadersProcessingFinished =>
436436
processSyncing()
437437
case ImportedPivotBlock =>
438438
updatePivotBlock(ImportedLastBlock)
439439
case ValidationFailed(header, peerToBlackList) =>
440-
log.warning(s"validation fo header ${header.idTag} failed")
441-
handleRewind(header, peerToBlackList, syncConfig.fastSyncBlockValidationN)
440+
log.warning(s"validation of header ${header.idTag} failed")
441+
// pow validation failure indicate that either peer is malicious or it is on wrong fork
442+
handleRewind(
443+
header,
444+
peerToBlackList,
445+
syncConfig.fastSyncBlockValidationN,
446+
syncConfig.criticalBlacklistDuration
447+
)
442448
}
443449
} else {
444450
blacklist(peer.id, blacklistDuration, "error in block headers response")

src/main/scala/io/iohk/ethereum/utils/Config.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ object Config {
9595
doFastSync: Boolean,
9696
peersScanInterval: FiniteDuration,
9797
blacklistDuration: FiniteDuration,
98+
criticalBlacklistDuration: FiniteDuration,
9899
startRetryInterval: FiniteDuration,
99100
syncRetryInterval: FiniteDuration,
100101
peerResponseTimeout: FiniteDuration,
@@ -137,6 +138,7 @@ object Config {
137138
doFastSync = syncConfig.getBoolean("do-fast-sync"),
138139
peersScanInterval = syncConfig.getDuration("peers-scan-interval").toMillis.millis,
139140
blacklistDuration = syncConfig.getDuration("blacklist-duration").toMillis.millis,
141+
criticalBlacklistDuration = syncConfig.getDuration("critical-blacklist-duration").toMillis.millis,
140142
startRetryInterval = syncConfig.getDuration("start-retry-interval").toMillis.millis,
141143
syncRetryInterval = syncConfig.getDuration("sync-retry-interval").toMillis.millis,
142144
peerResponseTimeout = syncConfig.getDuration("peer-response-timeout").toMillis.millis,

src/test/scala/io/iohk/ethereum/blockchain/sync/TestSyncConfig.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ trait TestSyncConfig extends SyncConfigBuilder {
1212
pivotBlockOffset = 500,
1313
branchResolutionRequestSize = 2,
1414
blacklistDuration = 5.seconds,
15+
criticalBlacklistDuration = 10.seconds,
1516
syncRetryInterval = 1.second,
1617
checkForNewBlockInterval = 1.milli,
1718
startRetryInterval = 500.milliseconds,

0 commit comments

Comments
 (0)