1 // Copyright (c) 2024-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 5 #ifndef BITCOIN_NODE_TIMEOFFSETS_H
6 #define BITCOIN_NODE_TIMEOFFSETS_H
7 8 #include <sync.h>
9 10 #include <chrono>
11 #include <cstddef>
12 #include <deque>
13 14 namespace node {
15 class Warnings;
16 } // namespace node
17 18 class TimeOffsets
19 {
20 public:
21 TimeOffsets(node::Warnings& warnings) : m_warnings{warnings} {}
22 23 private:
24 //! Maximum number of timeoffsets stored.
25 static constexpr size_t MAX_SIZE{50};
26 //! Minimum difference between system and network time for a warning to be raised.
27 static constexpr std::chrono::minutes WARN_THRESHOLD{10};
28 29 mutable Mutex m_mutex;
30 /** The observed time differences between our local clock and those of our outbound peers. A
31 * positive offset means our peer's clock is ahead of our local clock. */
32 std::deque<std::chrono::seconds> m_offsets GUARDED_BY(m_mutex){};
33 34 node::Warnings& m_warnings;
35 36 public:
37 /** Add a new time offset sample. */
38 void Add(std::chrono::seconds offset) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
39 40 /** Compute and return the median of the collected time offset samples. The median is returned
41 * as 0 when there are less than 5 samples. */
42 std::chrono::seconds Median() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
43 44 /** Raise warnings if the median time offset exceeds the warnings threshold. Returns true if
45 * warnings were raised. */
46 bool WarnIfOutOfSync() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
47 };
48 49 #endif // BITCOIN_NODE_TIMEOFFSETS_H
50