diff --git a/src/blockencodings.h b/src/blockencodings.h --- a/src/blockencodings.h +++ b/src/blockencodings.h @@ -27,6 +27,29 @@ } }; +class DifferenceFormatter { + uint64_t m_shift = 0; + +public: + template void Ser(Stream &s, I v) { + if (v < m_shift || v >= std::numeric_limits::max()) { + throw std::ios_base::failure("differential value overflow"); + } + WriteCompactSize(s, v - m_shift); + m_shift = uint64_t(v) + 1; + } + template void Unser(Stream &s, I &v) { + uint64_t n = ReadCompactSize(s); + m_shift += n; + if (m_shift < n || m_shift >= std::numeric_limits::max() || + m_shift < std::numeric_limits::min() || + m_shift > std::numeric_limits::max()) { + throw std::ios_base::failure("differential value overflow"); + } + v = I(m_shift++); + } +}; + class BlockTransactionsRequest { public: // A BlockTransactionsRequest message