SimBlock
https://dsg-titech.github.io/simblock/images/simblock.png
ブロックチェーンシミュレータ
マイニング所要時間の計算
PoWについては、simblock.node.consensus.ProofOfWork#minting() で計算している。
計算式は以下の形。(注:変数名は必ずしも最新コードと一致しない)
$ interval=\frac{\log(u)}{\log(1 - \frac{1}{difficulty})} \div miningPower
interval: マイニングの所要時間
u: 一様乱数
difficulty: マイニング成功に必要なハッシュ計算の回数。
定義位置:simblock.block.ProofOfWorkBlock#genesisBlock()
miningPower: マイニング実施ノードの、ハッシュ計算能力。ミリ秒あたりに実行できるハッシュ計算回数。
定義位置:simBlock.simulator.Main#genMiningPower()
$ p=\frac{1}{difficulty}はマイニングの成功確率を意味する。
$ k=miningPower * intervalは実行するハッシュ回数を意味する。
$ p, kを用いると、上記の計算式は、以下のように変形できる。
$ k = \frac{\log(u)}{\log(1 - p)}
幾何分布は、成功確率が$ pである独立試行を繰り返す時、初めて成功するまでの試行回数$ kが従う確率分布。
まず、幾何分布の累積分布関数$ F(x)は、以下で表される。
$ F(x) = Pr(X \leq x) = 1 - (1 - p) ^ x
これの逆関数を求めると、
$ Pr = 1 - (1 - p) ^ x
$ \log_{1-p}(1-Pr) = x
$ \therefore x = \frac{\log(1-Pr)}{\log(1-p)}
逆関数に一様乱数$ uを入力することで、逆関数法による乱数生成ができる。
$ x = \frac{\log(1-u)}{\log(1-p)}
ここで、$ 1−uも一様乱数に従うため、以下に変形できる。
$ x = \frac{\log(u)}{\log(1-p)}