gen_wide_data.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2014-2023, The Monero Project
  3. #
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without modification, are
  7. # permitted provided that the following conditions are met:
  8. #
  9. # 1. Redistributions of source code must retain the above copyright notice, this list of
  10. # conditions and the following disclaimer.
  11. #
  12. # 2. Redistributions in binary form must reproduce the above copyright notice, this list
  13. # of conditions and the following disclaimer in the documentation and/or other
  14. # materials provided with the distribution.
  15. #
  16. # 3. Neither the name of the copyright holder nor the names of its contributors may be
  17. # used to endorse or promote products derived from this software without specific
  18. # prior written permission.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  21. # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  22. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
  23. # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26. # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  27. # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  28. # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. #
  30. # Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
  31. import random
  32. DIFFICULTY_TARGET = 120
  33. DIFFICULTY_WINDOW = 720
  34. DIFFICULTY_LAG = 15
  35. DIFFICULTY_CUT = 60
  36. def difficulty():
  37. times = []
  38. diffs = []
  39. while True:
  40. if len(times) <= 1:
  41. diff = 1
  42. else:
  43. begin = max(len(times) - DIFFICULTY_WINDOW - DIFFICULTY_LAG, 0)
  44. end = min(begin + DIFFICULTY_WINDOW, len(times))
  45. length = end - begin
  46. assert length >= 2
  47. if length <= DIFFICULTY_WINDOW - 2 * DIFFICULTY_CUT:
  48. cut_begin = 0
  49. cut_end = length
  50. else:
  51. excess = length - (DIFFICULTY_WINDOW - 2 * DIFFICULTY_CUT)
  52. cut_begin = (excess + 1) // 2
  53. cut_end = length - excess // 2
  54. assert cut_begin + 2 <= cut_end
  55. wnd = times[begin:end]
  56. wnd.sort()
  57. dtime = wnd[cut_end - 1] - wnd[cut_begin]
  58. dtime = max(dtime, 1)
  59. ddiff = sum(diffs[begin + cut_begin + 1:begin + cut_end])
  60. diff = (ddiff * DIFFICULTY_TARGET + dtime - 1) // dtime
  61. times.append((yield diff))
  62. diffs.append(diff)
  63. random.seed(1)
  64. time = 1000
  65. gen = difficulty()
  66. diff = next(gen)
  67. for i in range(100000):
  68. power = 100 if i < 10000 else 100000000 if i < 500 else 1000000000000 if i < 1000 else 1000000000000000 if i < 2000 else 10000000000000000000 if i < 4000 else 1000000000000000000000000
  69. time += random.randint(-diff // power - 10, 3 * diff // power + 10)
  70. print(time, diff)
  71. diff = gen.send(time)