@@ -2,16 +2,16 @@ package io.iohk.ethereum.blockchain.sync
2
2
3
3
import java .net .InetSocketAddress
4
4
5
- import akka .actor .{ActorRef , ActorSystem , Props }
5
+ import akka .actor .{ActorSystem , Props }
6
6
import akka .testkit .{TestActorRef , TestProbe }
7
7
import akka .util .ByteString
8
8
import com .miguno .akka .testing .VirtualTime
9
9
import io .iohk .ethereum .{Mocks , Timeouts }
10
10
import io .iohk .ethereum .blockchain .sync .FastSync .{StateMptNodeHash , SyncState }
11
11
import io .iohk .ethereum .blockchain .sync .SyncController .MinedBlock
12
- import io .iohk .ethereum .domain .{Account , Block , BlockHeader }
12
+ import io .iohk .ethereum .domain .{Account , Block , BlockHeader , SignedTransaction }
13
13
import io .iohk .ethereum .ledger .{BloomFilter , Ledger }
14
- import io .iohk .ethereum .network .PeerEventBusActor .PeerEvent .{ MessageFromPeer , PeerDisconnected }
14
+ import io .iohk .ethereum .network .PeerEventBusActor .PeerEvent .MessageFromPeer
15
15
import io .iohk .ethereum .network .PeerEventBusActor .SubscriptionClassifier .{MessageClassifier , PeerDisconnectedClassifier }
16
16
import io .iohk .ethereum .network .PeerEventBusActor .{PeerSelector , Subscribe , Unsubscribe }
17
17
import io .iohk .ethereum .network .EtcPeerManagerActor .{GetHandshakedPeers , HandshakedPeers , PeerInfo }
@@ -147,6 +147,83 @@ class SyncControllerSpec extends FlatSpec with Matchers {
147
147
peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (BlockHeaders .code), PeerSelector .WithId (peer2.id))))
148
148
}
149
149
150
+ it should " request for block bodies again if block bodies validation fails" in new TestSetup () {
151
+ override val syncController = TestActorRef (Props (new SyncController (
152
+ storagesInstance.storages.appStateStorage,
153
+ blockchain,
154
+ storagesInstance.storages,
155
+ storagesInstance.storages.fastSyncStateStorage,
156
+ ledger,
157
+ new Mocks .MockValidatorsFailingOnBlockBodies ,
158
+ peerMessageBus.ref, pendingTransactionsManager.ref, ommersPool.ref, etcPeerManager.ref,
159
+ externalSchedulerOpt = Some (time.scheduler))))
160
+
161
+
162
+ val peer1TestProbe : TestProbe = TestProbe ()(system)
163
+ val peer1 = Peer (new InetSocketAddress (" 127.0.0.1" , 0 ), peer1TestProbe.ref, incomingConnection = false )
164
+ val peer2TestProbe : TestProbe = TestProbe ()(system)
165
+ val peer2 = Peer (new InetSocketAddress (" 127.0.0.1" , 0 ), peer2TestProbe.ref, incomingConnection = false )
166
+
167
+ val expectedTargetBlock = 399500
168
+ val targetBlockHeader : BlockHeader = baseBlockHeader.copy(
169
+ number = expectedTargetBlock,
170
+ stateRoot = ByteString (Hex .decode(" deae1dfad5ec8dcef15915811e1f044d2543674fd648f94345231da9fc2646cc" )))
171
+ val bestBlockHeaderNumber : BigInt = targetBlockHeader.number - 1
172
+ storagesInstance.storages.fastSyncStateStorage.putSyncState(SyncState (targetBlockHeader)
173
+ .copy(bestBlockHeaderNumber = bestBlockHeaderNumber,
174
+ mptNodesQueue = Seq (StateMptNodeHash (targetBlockHeader.stateRoot))))
175
+
176
+ time.advance(1 .seconds)
177
+
178
+ val peerStatus = Status (1 , 1 , 20 , ByteString (" peer2_bestHash" ), ByteString (" unused" ))
179
+
180
+ etcPeerManager.send(syncController, HandshakedPeers (Map (
181
+ peer2 -> PeerInfo (peerStatus, forkAccepted = true , totalDifficulty = peerStatus.totalDifficulty, maxBlockNumber = 0 ))))
182
+
183
+ syncController ! SyncController .StartSync
184
+
185
+ val stateMptLeafWithAccount =
186
+ ByteString (Hex .decode(" f86d9e328415c225a782bb339b22acad1c739e42277bc7ef34de3623114997ce78b84cf84a0186cb7d8738d800a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" ))
187
+
188
+ val watcher = TestProbe ()
189
+ watcher.watch(syncController)
190
+
191
+ etcPeerManager.expectMsg(
192
+ EtcPeerManagerActor .SendMessage (GetNodeData (Seq (targetBlockHeader.stateRoot)), peer2.id))
193
+ peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (NodeData .code), PeerSelector .WithId (peer2.id))))
194
+ peerMessageBus.reply(MessageFromPeer (NodeData (Seq (stateMptLeafWithAccount)), peer2.id))
195
+ peerMessageBus.expectMsg(Unsubscribe (MessageClassifier (Set (NodeData .code), PeerSelector .WithId (peer2.id))))
196
+
197
+ etcPeerManager.expectMsg(EtcPeerManagerActor .SendMessage (
198
+ GetBlockHeaders (Left (targetBlockHeader.number), expectedTargetBlock - bestBlockHeaderNumber, 0 , reverse = false ),
199
+ peer2.id))
200
+ peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (BlockHeaders .code), PeerSelector .WithId (peer2.id))))
201
+ peerMessageBus.reply(MessageFromPeer (BlockHeaders (Seq (targetBlockHeader)), peer2.id))
202
+ peerMessageBus.expectMsg(Unsubscribe (MessageClassifier (Set (BlockHeaders .code), PeerSelector .WithId (peer2.id))))
203
+
204
+ etcPeerManager.expectMsg(
205
+ EtcPeerManagerActor .SendMessage (GetReceipts (Seq (targetBlockHeader.hash)), peer2.id))
206
+ peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (Receipts .code), PeerSelector .WithId (peer2.id))))
207
+ peerMessageBus.reply(MessageFromPeer (Receipts (Seq (Nil )), peer2.id))
208
+ peerMessageBus.expectMsg(Unsubscribe (MessageClassifier (Set (Receipts .code), PeerSelector .WithId (peer2.id))))
209
+
210
+ etcPeerManager.expectMsg(
211
+ EtcPeerManagerActor .SendMessage (GetBlockBodies (Seq (targetBlockHeader.hash)), peer2.id))
212
+ peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (BlockBodies .code), PeerSelector .WithId (peer2.id))))
213
+ peerMessageBus.reply(MessageFromPeer (BlockBodies (Seq (BlockBody (Nil , Nil ))), peer2.id))
214
+ peerMessageBus.expectMsg(Unsubscribe (MessageClassifier (Set (BlockBodies .code), PeerSelector .WithId (peer2.id))))
215
+
216
+ // peer was blacklisted for bad block bodies. connecting second peer
217
+ etcPeerManager.send(syncController, HandshakedPeers (Map (
218
+ peer1 -> PeerInfo (peerStatus, forkAccepted = true , totalDifficulty = peerStatus.totalDifficulty, maxBlockNumber = 0 ))))
219
+
220
+ time.advance(1 .seconds)
221
+
222
+ // ask different peer for block bodies again
223
+ etcPeerManager.expectMsg(EtcPeerManagerActor .SendMessage (GetBlockBodies (Seq (targetBlockHeader.hash)), peer1.id))
224
+ peerMessageBus.expectMsg(Subscribe (MessageClassifier (Set (BlockBodies .code), PeerSelector .WithId (peer1.id))))
225
+ }
226
+
150
227
it should " not use (blacklist) a peer that fails to respond within time limit" in new TestSetup () {
151
228
val peer2TestProbe : TestProbe = TestProbe ()(system)
152
229
0 commit comments