Skip to content

Commit 6e30ab6

Browse files
author
Michał Mrożek
authored
Merge pull request #711 from input-output-hk/ectm-104-target-block-selection
[ECTM-104] Pivot block selection algorithm
2 parents 8e45269 + ee6fd9c commit 6e30ab6

File tree

13 files changed

+1431
-636
lines changed

13 files changed

+1431
-636
lines changed

src/it/scala/io/iohk/ethereum/sync/FastSyncItSpec.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfter {
6464
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
6565
_ <- peer1.waitForFastSyncFinish()
6666
} yield {
67-
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.targetBlockOffset)
68-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.targetBlockOffset)
67+
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset)
68+
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
6969
}
7070
}
7171

@@ -81,13 +81,13 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfter {
8181
val trie = peer1.getBestBlockTrie()
8282
// due to the fact that function generating state is deterministic both peer2 and peer3 ends up with exactly same
8383
// state, so peer1 can get whole trie from both of them.
84-
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.targetBlockOffset)
85-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.targetBlockOffset)
84+
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset)
85+
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
8686
assert(trie.isDefined)
8787
}
8888
}
8989

90-
it should "should update target block" in customTestCaseResourceM(FakePeer.start2FakePeersRes()) {
90+
it should "should update pivot block" in customTestCaseResourceM(FakePeer.start2FakePeersRes()) {
9191
case (peer1, peer2) =>
9292
for {
9393
_ <- peer2.importBlocksUntil(1000)(IdentityUpdate)
@@ -96,7 +96,7 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfter {
9696
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
9797
_ <- peer1.waitForFastSyncFinish()
9898
} yield {
99-
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.targetBlockOffset)
99+
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset)
100100
}
101101
}
102102
}
@@ -308,7 +308,7 @@ object FastSyncItSpec {
308308
lazy val validators = new MockValidatorsAlwaysSucceed
309309

310310
val testSyncConfig = syncConfig.copy(
311-
minPeersToChooseTargetBlock = 1,
311+
minPeersToChoosePivotBlock = 1,
312312
peersScanInterval = 5.milliseconds,
313313
blockHeadersPerRequest = 200,
314314
blockBodiesPerRequest = 50,

src/main/resources/application.conf

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,16 @@ mantis {
320320
# Requested number of MPT nodes when syncing from other peers
321321
nodes-per-request = 384
322322

323-
# Minimum number of peers required to start fast-sync (by determining the target block)
324-
min-peers-to-choose-target-block = 2
323+
# Minimum number of peers required to start fast-sync (by determining the pivot block)
324+
min-peers-to-choose-pivot-block = 3
325+
326+
# Number of additional peers used to determine pivot block during fast-sync
327+
# Number of peers used to reach consensus = min-peers-to-choose-pivot-block + peers-to-choose-pivot-block-margin
328+
peers-to-choose-pivot-block-margin = 1
325329

326330
# During fast-sync when most up to date block is determined from peers, the actual target block number
327331
# will be decreased by this value
328-
target-block-offset = 128
332+
pivot-block-offset = 128
329333

330334
# How often to query peers for new blocks after the top of the chain has been reached
331335
check-for-new-block-interval = 10.seconds

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

Lines changed: 251 additions & 163 deletions
Large diffs are not rendered by default.

src/main/scala/io/iohk/ethereum/blockchain/sync/FastSyncTargetBlockSelector.scala

Lines changed: 0 additions & 147 deletions
This file was deleted.

src/main/scala/io/iohk/ethereum/blockchain/sync/PeerListSupport.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ trait PeerListSupport {
2222

2323
var handshakedPeers: PeersMap = Map.empty
2424

25-
scheduler.scheduleWithFixedDelay(0.seconds, syncConfig.peersScanInterval, etcPeerManager, EtcPeerManagerActor.GetHandshakedPeers)(global, context.self)
25+
scheduler.scheduleWithFixedDelay(
26+
0.seconds,
27+
syncConfig.peersScanInterval,
28+
etcPeerManager,
29+
EtcPeerManagerActor.GetHandshakedPeers
30+
)(global, context.self)
2631

2732
def removePeer(peerId: PeerId): Unit = {
2833
peerEventBus ! Unsubscribe(PeerDisconnectedClassifier(PeerSelector.WithId(peerId)))

0 commit comments

Comments
 (0)