Skip to content

Instantly share code, notes, and snippets.

@lrettig
Created January 18, 2019 15:03
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save lrettig/801bff97cd668a0ae9227cad8f9c67fb to your computer and use it in GitHub Desktop.
Save lrettig/801bff97cd668a0ae9227cad8f9c67fb to your computer and use it in GitHub Desktop.
Simulation script for ice age block times
# Date, blocknum, difficulty as of 2019-01-18
# Script by vbuterin, slightly modified by lrettig
import random
import datetime
import sys
def calc_bomb(i):
period = i // 100000
if (period > 0):
# Subtract 2, this is the original formula
# Subtract another 30, this is the Byzantium delay
return 2**(period - 32)
return 0
def calc_difficulty_byzantium(i, cur_time, prev_diff, prev_time):
new_diff = prev_diff + prev_diff // 2048 * max(1 - (cur_time - prev_time) // 9, -99)
new_diff += calc_bomb(i)
return new_diff
first_block = 7_087_671
times = [1547823394]
#diffs = [3_033_556_249_786_083]
diffs = [2_580_831_000_000_000]
hashpower = diffs[0] / 14
for i in range(first_block, 10_000_000):
blocktime = random.expovariate(hashpower / diffs[-1])
new_time = times[-1] + blocktime
new_diff = calc_difficulty_byzantium(i, new_time, diffs[-1], times[-1])
times.append(new_time)
diffs.append(new_diff)
predicted_avg_blocktime = diffs[-1] / hashpower
if i % 10000 == 0:
print('Block %d, time %r blocktime %.2f diffratio %.4f' % (
i,
datetime.datetime.utcfromtimestamp(times[-1]).isoformat().replace('T',' '),
predicted_avg_blocktime,
calc_bomb(i) / diffs[-1],
))
if predicted_avg_blocktime > 60:
sys.exit('Predicted block time exceeded 60s')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment