private void PrepareHeadersResponse(HeadersSyncBatch headersSyncBatch, LatencySyncPeerMock syncPeer, IBlockTree tree) { if (headersSyncBatch != null) { long startNumber = headersSyncBatch.StartNumber; if (_maliciousByShiftedOneBack.Contains(syncPeer)) { startNumber++; TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} WILL SEND SHIFTED MESSAGES ({startNumber} INSTEAD OF {headersSyncBatch.StartNumber})"); } else if (_maliciousByShiftedOneForward.Contains(syncPeer)) { startNumber = Math.Max(0, startNumber - 1); TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} WILL SEND SHIFTED MESSAGES ({startNumber} INSTEAD OF {headersSyncBatch.StartNumber})"); } Keccak hash = tree.FindHash(startNumber); if (hash == null) { TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} CANNOT FIND {headersSyncBatch.StartNumber}"); return; } int requestSize = headersSyncBatch.RequestSize; if (_incorrectByTooLongMessages.Contains(syncPeer)) { requestSize *= 2; TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} WILL SEND TOO LONG MESSAGE ({requestSize} INSTEAD OF {headersSyncBatch.RequestSize})"); } else if (_incorrectByTooShortMessages.Contains(syncPeer)) { requestSize = Math.Max(1, requestSize / 2); TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} WILL SEND TOO SHORT MESSAGE ({requestSize} INSTEAD OF {headersSyncBatch.RequestSize})"); } BlockHeader[] headers = tree.FindHeaders(hash, requestSize, 0, false); if (_invalidBlocks.ContainsKey(syncPeer)) { for (int i = 0; i < headers.Length; i++) { if (_invalidBlocks[syncPeer].Contains(headers[i].Number)) { TestContext.WriteLine($"{_time,6} | SYNC PEER {syncPeer.Node:s} WILL SEND AN INVALID BLOCK AT {headers[i].Number}"); headers[i] = Build.A.Block.WithDifficulty(1).TestObject.Header; } } } if (headers.Length > 3 && _maliciousByRepetition.Contains(syncPeer)) { headers[^ 1] = headers[^ 3];
public BlockHeader[] FindHeaders(Keccak hash, int numberOfBlocks, int skip, bool reverse) { return(_blockTree.FindHeaders(hash, numberOfBlocks, skip, reverse)); }
public BlockHeader[] FindHeaders(Keccak hash, int numberOfBlocks, int skip, bool reverse) => _wrapped.FindHeaders(hash, numberOfBlocks, skip, reverse);