俺が間違ってる可能性あるから、predict_diff_bomb_effectの読み方書いとく
間違ってたら誰か訂正してくれるやろ、オープンソースってそういうことだよね(適当)

まず、EIP3554提案したハンコックっていうおっさんが解説してるけど、イーサの難易度計算はこう
NewDifficulty = ParentDifficulty + (parentDiff/2048 * S) + e
新規ブロックの難易度を決める要素は3つ、親ブロックの難易度と、ステップ係数と、ボム
親を2048で割ってるのは急激に難易度変化させないためで、Sがプラスになったりマイナスになったりして上下する
確か親ブロックが10秒切るとSが+になって遅延して、親ブロックが20秒超えるとSが-になって早くなる(この定義もソースのどっかにあったけど忘れた)
最後のイプシロンがボム
ボムの詳細はコード内で解説

def predict_diff_bomb_effect(current_blknum, current_difficulty, block_adjustment, months):
blocks_per_month = (86400 * 30) // 13.3
※1月のブロック生成数を求める
 まず、86400ってのは1日を秒に直しただけ(60*60*24=86400)
 1月は30日なので30をかけると1月の秒数が出る、それを平均ブロック生成時間(13.3秒)で割ると、1月のブロック生成数が出る
future_blknum = current_blknum + blocks_per_month * months
※現在のブロック数に、目標月までのブロック数を足す
diff_adjustment = 2 ** ((future_blknum - block_adjustment) // 100000 - 2)
※ここがボムそのもの
 まず、目標月のブロックから調整値を引く(今は970万)、それによって、ボムコンポーネントに現在のブロック数を誤認させる
 誤認させた(970万引いた)ブロックを10万で割るのは、ボムが10万ブロックごとに難易度を増加させるから
 ボム単位から2を引くのは、ジェネシスブロックから20万ブロックまではボムを起動させないため(逆にいえば、20万ブロック以降は既にボム発動済み)
 これを2のべき乗にすることによって、まさに指数関数的にボムが増加する
 ちなみに、ボムはディフィカルティに生で足されるので、この数値がそのまま必要ハッシュ数(難易度)の増加に直結する
diff_adjust_coeff = diff_adjustment / current_difficulty * 2048
※最初の式にあるように、カレント難度が高いと復帰(難易度の低下)も早い
 なので、生のボム数を現在の難度で割って割合に直すと分かりやすいよね、っていうビタリックの気遣い、たぶん
return diff_adjust_coeff

たぶん合ってると思うけど、間違ってたら、あとはボブおじ、頼んだで