UpdateTransactionsFromBlock is called during a re-org. When a re-org occurs, all of the transactions in the mempool may be descendants from a transaction which is in the pre-reorg block. This can cause us to propagate updates, worst case, to every transaction in the mempool.
Because we construct a setEntries setChildren, which is backed by a std::set, it is possible that this algorithm is O(N log N).
By using an Epoch visitor pattern, we can limit this to O(N) worst case behavior.
Epochs are also less resource intensive than almost any set option (e.g., hash set) because they are allocation free.
This is a backport of Core PR17925