Skip to content

Commit 41d2442

Browse files
author
Aurélien Richez
authored
[ETCM-969] move best block and genesis functions to blockchain reader (#1036)
* extract bestKnownBlockAndLatestCheckpoint in BlockchainMetadata * move getBestBlockNumber and getBestBlock to blockchainReader * remove TestBlockchainBuilder as it does not have any specific behaviour now * move genesisHeader and genesisBlock to BlockchainReader
1 parent e7ff983 commit 41d2442

File tree

68 files changed

+358
-350
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+358
-350
lines changed

src/it/scala/io/iohk/ethereum/ledger/BlockImporterItSpec.scala

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class BlockImporterItSpec
5555
testScheduler.awaitTermination(60.second)
5656
}
5757

58-
override lazy val blockQueue: BlockQueue = BlockQueue(blockchain, SyncConfig(Config.config))
58+
override lazy val blockQueue: BlockQueue = BlockQueue(blockchain, blockchainReader, SyncConfig(Config.config))
5959

6060
val genesis: Block = Block(
6161
Fixtures.Blocks.Genesis.header.copy(stateRoot = ByteString(MerklePatriciaTrie.EmptyRootHash)),
@@ -122,6 +122,7 @@ class BlockImporterItSpec
122122
fetcherProbe.ref,
123123
blockImport,
124124
blockchain,
125+
blockchainReader,
125126
new BranchResolution(blockchain, blockchainReader),
126127
syncConfig,
127128
ommersPoolProbe.ref,
@@ -131,7 +132,7 @@ class BlockImporterItSpec
131132
)
132133
)
133134

134-
val genesisBlock = blockchain.genesisBlock
135+
val genesisBlock = blockchainReader.genesisBlock
135136
val block1: Block = getBlock(genesisBlock.number + 1, parent = genesisBlock.header.hash)
136137
// new chain is shorter but has a higher weight
137138
val newBlock2: Block = getBlock(genesisBlock.number + 2, difficulty = 108, parent = block1.header.hash)
@@ -165,6 +166,7 @@ class BlockImporterItSpec
165166
fetcherProbe.ref,
166167
mkBlockImport(validators = successValidators),
167168
blockchain,
169+
blockchainReader,
168170
new BranchResolution(blockchain, blockchainReader),
169171
syncConfig,
170172
ommersPoolProbe.ref,
@@ -178,7 +180,7 @@ class BlockImporterItSpec
178180
blockImporter ! BlockFetcher.PickedBlocks(NonEmptyList.fromListUnsafe(newBranch))
179181

180182
//because the blocks are not valid, we shouldn't reorganise, but at least stay with a current chain, and the best block of the current chain is oldBlock4
181-
eventually(blockchain.getBestBlock().get shouldEqual oldBlock4)
183+
eventually(blockchainReader.getBestBlock().get shouldEqual oldBlock4)
182184
}
183185

184186
it should "return a correct new best block after reorganising longer chain to a shorter one if its weight is bigger" in {
@@ -190,7 +192,7 @@ class BlockImporterItSpec
190192

191193
blockImporter ! BlockFetcher.PickedBlocks(NonEmptyList.fromListUnsafe(newBranch))
192194

193-
eventually(blockchain.getBestBlock().get shouldEqual newBlock3)
195+
eventually(blockchainReader.getBestBlock().get shouldEqual newBlock3)
194196
}
195197

196198
it should "return Unknown branch, in case of PickedBlocks with block that has a parent that's not in the chain" in {
@@ -211,13 +213,13 @@ class BlockImporterItSpec
211213
blockchainWriter.save(oldBlock3, Nil, oldWeight3, saveAsBestBlock = true)
212214
blockchainWriter.save(oldBlock4, Nil, oldWeight4, saveAsBestBlock = true)
213215
// simulation of node restart
214-
blockchain.saveBestKnownBlocks(blockchain.getBestBlockNumber() - 1)
216+
blockchain.saveBestKnownBlocks(blockchainReader.getBestBlockNumber() - 1)
215217
blockchainWriter.save(newBlock4ParentOldBlock3, Nil, newBlock4WeightParentOldBlock3, saveAsBestBlock = true)
216218

217219
//not reorganising anymore until oldBlock4(not part of the chain anymore), no block/ommer validation when not part of the chain, resolveBranch is returning UnknownBranch
218220
blockImporter ! BlockFetcher.PickedBlocks(NonEmptyList.fromListUnsafe(List(newBlock5ParentOldBlock4)))
219221

220-
eventually(blockchain.getBestBlock().get shouldEqual newBlock4ParentOldBlock3)
222+
eventually(blockchainReader.getBestBlock().get shouldEqual newBlock4ParentOldBlock3)
221223
}
222224

223225
it should "switch to a branch with a checkpoint" in {
@@ -230,7 +232,7 @@ class BlockImporterItSpec
230232

231233
blockImporter ! BlockFetcher.PickedBlocks(NonEmptyList.fromListUnsafe(newBranch))
232234

233-
eventually(blockchain.getBestBlock().get shouldEqual oldBlock5WithCheckpoint)
235+
eventually(blockchainReader.getBestBlock().get shouldEqual oldBlock5WithCheckpoint)
234236
eventually(blockchain.getLatestCheckpointBlockNumber() shouldEqual oldBlock5WithCheckpoint.header.number)
235237
}
236238

@@ -244,13 +246,13 @@ class BlockImporterItSpec
244246

245247
blockImporter ! BlockFetcher.PickedBlocks(NonEmptyList.fromListUnsafe(newBranch))
246248

247-
eventually(blockchain.getBestBlock().get shouldEqual newBlock4WithCheckpoint)
249+
eventually(blockchainReader.getBestBlock().get shouldEqual newBlock4WithCheckpoint)
248250
eventually(blockchain.getLatestCheckpointBlockNumber() shouldEqual newBlock4WithCheckpoint.header.number)
249251
}
250252

251253
it should "return a correct checkpointed block after receiving a request for generating a new checkpoint" in {
252254

253-
val parent = blockchain.getBestBlock().get
255+
val parent = blockchainReader.getBestBlock().get
254256
val newBlock5: Block = getBlock(genesisBlock.number + 5, difficulty = 104, parent = parent.header.hash)
255257
val newWeight5 = newWeight3.increase(newBlock5.header)
256258

@@ -263,12 +265,12 @@ class BlockImporterItSpec
263265
val checkpointBlock = checkpointBlockGenerator.generate(newBlock5, Checkpoint(signatures))
264266
blockImporter ! NewCheckpoint(checkpointBlock)
265267

266-
eventually(blockchain.getBestBlock().get shouldEqual checkpointBlock)
268+
eventually(blockchainReader.getBestBlock().get shouldEqual checkpointBlock)
267269
eventually(blockchain.getLatestCheckpointBlockNumber() shouldEqual newBlock5.header.number + 1)
268270
}
269271

270272
it should "ask BlockFetcher to resolve missing node" in {
271-
val parent = blockchain.getBestBlock().get
273+
val parent = blockchainReader.getBestBlock().get
272274
val newBlock: Block = getBlock(genesisBlock.number + 5, difficulty = 104, parent = parent.header.hash)
273275
val invalidBlock = newBlock.copy(header = newBlock.header.copy(beneficiary = Address(111).bytes))
274276

@@ -277,6 +279,7 @@ class BlockImporterItSpec
277279
fetcherProbe.ref,
278280
mkBlockImport(validators = successValidators),
279281
blockchain,
282+
blockchainReader,
280283
new BranchResolution(blockchain, blockchainReader),
281284
syncConfig,
282285
ommersPoolProbe.ref,

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

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
3838
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
3939
_ <- peer1.waitForFastSyncFinish()
4040
} yield {
41-
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset)
42-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
41+
assert(
42+
peer1.blockchainReader
43+
.getBestBlockNumber() == peer2.blockchainReader.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
44+
)
45+
assert(
46+
peer1.blockchainReader
47+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
48+
)
4349
}
4450
}
4551

@@ -56,8 +62,14 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
5662
val synchronizingPeerHaveAllData = peer1.containsExpectedDataUpToAccountAtBlock(1000, 500)
5763
// due to the fact that function generating state is deterministic both peer2 and peer3 ends up with exactly same
5864
// state, so peer1 can get whole trie from both of them.
59-
assert(peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset)
60-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
65+
assert(
66+
peer1.blockchainReader
67+
.getBestBlockNumber() == peer2.blockchainReader.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
68+
)
69+
assert(
70+
peer1.blockchainReader
71+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
72+
)
6173
assert(trie.isDefined)
6274
assert(synchronizingPeerHaveAllData)
6375
}
@@ -83,8 +95,14 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
8395
val synchronizingPeerHaveAllData = peer1.containsExpectedDataUpToAccountAtBlock(1000, 500)
8496
// due to the fact that function generating state is deterministic both peer3 and peer4 ends up with exactly same
8597
// state, so peer1 can get whole trie from both of them.
86-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
87-
assert(peer1.bl.getBestBlockNumber() == peer4.bl.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset)
98+
assert(
99+
peer1.blockchainReader
100+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
101+
)
102+
assert(
103+
peer1.blockchainReader
104+
.getBestBlockNumber() == peer4.blockchainReader.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset
105+
)
88106
assert(trie.isDefined)
89107
assert(synchronizingPeerHaveAllData)
90108
}
@@ -110,8 +128,14 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
110128
val synchronizingPeerHaveAllData = peer1.containsExpectedDataUpToAccountAtBlock(1000, 500)
111129
// due to the fact that function generating state is deterministic both peer3 and peer4 ends up with exactly same
112130
// state, so peer1 can get whole trie from both of them.
113-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
114-
assert(peer1.bl.getBestBlockNumber() == peer4.bl.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset)
131+
assert(
132+
peer1.blockchainReader
133+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
134+
)
135+
assert(
136+
peer1.blockchainReader
137+
.getBestBlockNumber() == peer4.blockchainReader.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset
138+
)
115139
assert(trie.isDefined)
116140
assert(synchronizingPeerHaveAllData)
117141
}
@@ -125,7 +149,8 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
125149
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
126150
_ <- peer1.waitForFastSyncFinish()
127151
} yield assert(
128-
peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
152+
peer1.blockchainReader
153+
.getBestBlockNumber() == peer2.blockchainReader.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
129154
)
130155
}
131156

@@ -139,7 +164,8 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
139164
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
140165
_ <- peer1.waitForFastSyncFinish()
141166
} yield assert(
142-
peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
167+
peer1.blockchainReader
168+
.getBestBlockNumber() == peer2.blockchainReader.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
143169
)
144170
}
145171

@@ -155,7 +181,8 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
155181
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
156182
_ <- peer1.waitForFastSyncFinish()
157183
} yield assert(
158-
peer1.bl.getBestBlockNumber() == peer2.bl.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
184+
peer1.blockchainReader
185+
.getBestBlockNumber() == peer2.blockchainReader.getBestBlockNumber() - peer2.testSyncConfig.pivotBlockOffset
159186
)
160187
}
161188

@@ -179,8 +206,14 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
179206
val synchronizingPeerHaveAllData = peer1.containsExpectedDataUpToAccountAtBlock(3000, 1001)
180207
// due to the fact that function generating state is deterministic both peer3 and peer4 ends up with exactly same
181208
// state, so peer1 can get whole trie from both of them.
182-
assert(peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset)
183-
assert(peer1.bl.getBestBlockNumber() == peer4.bl.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset)
209+
assert(
210+
peer1.blockchainReader
211+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
212+
)
213+
assert(
214+
peer1.blockchainReader
215+
.getBestBlockNumber() == peer4.blockchainReader.getBestBlockNumber() - peer4.testSyncConfig.pivotBlockOffset
216+
)
184217
assert(trie.isDefined)
185218
assert(synchronizingPeerHaveAllData)
186219
}
@@ -196,7 +229,8 @@ class FastSyncItSpec extends FlatSpecBase with Matchers with BeforeAndAfterAll {
196229
_ <- peer1.startFastSync().delayExecution(50.milliseconds)
197230
_ <- peer1.waitForFastSyncFinish()
198231
} yield assert(
199-
peer1.bl.getBestBlockNumber() == peer3.bl.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
232+
peer1.blockchainReader
233+
.getBestBlockNumber() == peer3.blockchainReader.getBestBlockNumber() - peer3.testSyncConfig.pivotBlockOffset
200234
)
201235
}
202236

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

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
3939
_ <- peer2.startRegularSync()
4040
_ <- peer2.connectToPeers(Set(peer1.node))
4141
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber)
42-
} yield assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
42+
} yield assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
4343
}
4444

4545
"given a previously mined blockchain" in customTestCaseResourceM(FakePeer.start2FakePeersRes()) {
@@ -52,7 +52,7 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
5252
_ <- peer2.startRegularSync()
5353
_ <- peer2.connectToPeers(Set(peer1.node))
5454
_ <- peer2.waitForRegularSyncLoadLastBlock(blockHeadersPerRequest + 1)
55-
} yield assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
55+
} yield assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
5656
}
5757
}
5858

@@ -70,7 +70,7 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
7070
_ <- peer1.waitForRegularSyncLoadLastBlock(blockNumer + 2)
7171
_ <- peer1.mineNewBlocks(100.milliseconds, 2)(IdentityUpdate)
7272
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumer + 4)
73-
} yield assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
73+
} yield assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
7474
}
7575

7676
"peers should keep being synced on checkpoints" in customTestCaseResourceM(
@@ -83,10 +83,10 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
8383
_ <- peer2.startRegularSync()
8484
_ <- peer2.connectToPeers(Set(peer1.node))
8585
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber)
86-
_ <- peer2.addCheckpointedBlock(peer2.bl.getBestBlock().get)
86+
_ <- peer2.addCheckpointedBlock(peer2.blockchainReader.getBestBlock().get)
8787
_ <- peer1.waitForRegularSyncLoadLastBlock(blockNumber + 1)
8888
} yield {
89-
assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
89+
assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
9090
assert(peer1.bl.getLatestCheckpointBlockNumber() == peer2.bl.getLatestCheckpointBlockNumber())
9191
}
9292
}
@@ -103,14 +103,14 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
103103
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber)
104104
_ <- peer2.mineNewBlocks(100.milliseconds, 2)(IdentityUpdate)
105105
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber + 2)
106-
_ <- peer2.addCheckpointedBlock(peer2.bl.getBestBlock().get)
106+
_ <- peer2.addCheckpointedBlock(peer2.blockchainReader.getBestBlock().get)
107107
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber + 3)
108-
_ <- peer1.addCheckpointedBlock(peer1.bl.getBestBlock().get)
108+
_ <- peer1.addCheckpointedBlock(peer1.blockchainReader.getBestBlock().get)
109109
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber + 4)
110110
_ <- peer1.mineNewBlocks(100.milliseconds, 1)(IdentityUpdate)
111111
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumber + 5)
112112
} yield {
113-
assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
113+
assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
114114
assert(peer1.bl.getLatestCheckpointBlockNumber() == peer2.bl.getLatestCheckpointBlockNumber())
115115
}
116116
}
@@ -129,13 +129,10 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
129129
_ <- peer1.connectToPeers(Set(peer2.node))
130130
_ <- peer1.waitForRegularSyncLoadLastBlock(length)
131131
} yield {
132-
assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash)
133-
assert(
134-
peer1.bl.getBestBlock().get.number == peer2.bl.getBestBlock().get.number && peer1.bl
135-
.getBestBlock()
136-
.get
137-
.number == length
138-
)
132+
assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash)
133+
val peer1BestBlockNumber = peer1.blockchainReader.getBestBlock().get.number
134+
val peer2BestBlockNumber = peer2.blockchainReader.getBestBlock().get.number
135+
assert(peer1BestBlockNumber == peer2BestBlockNumber && peer1BestBlockNumber == length)
139136
assert(peer1.bl.getLatestCheckpointBlockNumber() == peer2.bl.getLatestCheckpointBlockNumber())
140137
}
141138
}
@@ -147,7 +144,7 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
147144
for {
148145
_ <- peer1.importBlocksUntil(8)(IdentityUpdate)
149146
_ <- peer1.startRegularSync()
150-
_ <- peer1.addCheckpointedBlock(peer1.bl.getBestBlock().get)
147+
_ <- peer1.addCheckpointedBlock(peer1.blockchainReader.getBestBlock().get)
151148
_ <- peer1.waitForRegularSyncLoadLastBlock(9)
152149
_ <- peer2.importBlocksUntil(20)(IdentityUpdate)
153150
_ <- peer2.startRegularSync()
@@ -157,7 +154,7 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
157154
_ <- peer1.waitForRegularSyncLoadLastBlock(19)
158155
} yield assert(true)
159156
//these should pass
160-
// assert(peer1.bl.getBestBlock().get.hash == peer2.bl.getBestBlock().get.hash )
157+
// assert(peer1.blockchainReader.getBestBlock().get.hash == peer2.blockchainReader.getBestBlock().get.hash )
161158
// assert(peer1.bl.getLatestCheckpointBlockNumber() == peer2.bl.getLatestCheckpointBlockNumber())
162159
}
163160

@@ -179,8 +176,8 @@ class RegularSyncItSpec extends FreeSpecBase with Matchers with BeforeAndAfterAl
179176
_ <- peer2.waitForRegularSyncLoadLastBlock(blockNumer + 3)
180177
} yield {
181178
assert(
182-
peer1.bl.getChainWeightByHash(peer1.bl.getBestBlock().get.hash) == peer2.bl.getChainWeightByHash(
183-
peer2.bl.getBestBlock().get.hash
179+
peer1.bl.getChainWeightByHash(peer1.blockchainReader.getBestBlock().get.hash) == peer2.bl.getChainWeightByHash(
180+
peer2.blockchainReader.getBestBlock().get.hash
184181
)
185182
)
186183
(

0 commit comments

Comments
 (0)