Here is a possible solution:
After resampling the curve, every point of the curve is repositioned along the curve using the Sample Curve node:
The Factor input of this node is clamped to 0 and 1. This means, we have to take care, that every node position is within this range.
This is the calculation of the factor:
The base position of every point is
index / point count. To animate the points, we want to move them between their base position and the position of the next point. This means, we have to add between
1/point count to the position of every point depending on the Scene Time. The Map Range is optional. It’s used to define how many frames should pass at speed 1 for one complete shift.
Using the segment length instead of point count
If you would like to use the segment length instead of the point count as an input, you could do it like this:
Just as the Curve to Points node, this will round down the segment length,
so that a whole number of samples will fit in each input spline
Finally, the complete bike chain
A bike chain consists of two different types of chain links. Thus, we need some adaptions to the node net.
On instantiation we use a set of the two chain links and align them to the curve tangent by using Align Euler to Vector.
But this is not enough. As we only move from point to point while having two different object types, this would visually lead to an exchange of the two object types after one animation "step".
To correct this, we have to choose the instances for the points explicitly and swap them on every animation "step". We do this by snapping the output of the Map Range to 1 and adding modulo 2 of it to the point index.