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