ブロックのnonce値をプロットしてみた

Masahiko Hyuga
Feb 13 · 7 min read

みなさんこんにちは!フレセッツ株式会社の日向です。

ブロックに刻まれるハッシュ値調整用のフィールドである「nonce値」をご存知でしょうか?マイナー(採掘者)はこの nonce 値を一つづつ増やしながら目的とするハッシュ値が出てくるまで、ブロックのハッシュ値を計算していきます。

ブロックとして正しい nonce 値が見つかるのは確率の問題なので、基本的にはランダムに分布するはずなのですが、実際の値はどうなの?ということで、ビットコイン、モナーコイン、イーサリアムの nonce 値をプロットしてみました。

利用したコードはこちら⇩⇩⇩

基本的には「このコードを実行してみてください」という感じなのですが、大した量ではないので、中でどのような処理をしているのかちょっとだけ見てみましょう。

ステップ1:nonce値をCSVファイルとして出力する

まずはプロットするための元データとして、ブロック高と nonce 値が記録されている CSV ファイルを作ります。

ビットコイン・モナーコインの場合には、いわゆる coind に対して bitcoin-cli (monacoin-cli) を用いて JSON-RPC アクセスし、ブロック高と nonce 値をゲットしてくれば OK です。

#!/bin/bash

COIN_CLI=monacoin-cli

BLOCKS=$($COIN_CLI getblockcount)

START_BLOCK=$(expr 1 + $(tail -n1 nonce.csv | awk -F , ‘{print $1}’))

for i in `seq $START_BLOCK $BLOCKS`; do
BLOCK_HASH=$($COIN_CLI getblockhash $i)
NONCE=$($COIN_CLI getblock $BLOCK_HASH | jq .nonce)
echo “$i,$NONCE” | tee -a nonce.csv
done

ン十万ブロックもの nonce 値を取ってくるため、この処理には非常に時間がかかります。寝る前に実行しておけば明日の朝には完了するレベルの時間ではありますが、途中でエラーなどにより取得処理が止まってしまったときを考えて、最後に取得してきたブロック高を元に再開する(1 からやりなおさない)処理とかも入れています。

イーサリアムの場合には、JavaScript ライブラリの web3 を使うのが便利なので、以下のようなコードで nonce 値を取得していきます。

const async = require(‘async’);
const Web3 = require(‘web3’);

if(process.argv.length < 3) {
console.log(‘uasge: node ./nonce_eth.js START_BLOCK’);
process.exit(1);
}

const START_BLOCK = +process.argv[2];

const web3 = new Web3(‘ws://localhost:8546’);

web3.eth.isSyncing().then((syncing) => {
let i = START_BLOCK;
async.whilst(() => i<=syncing.currentBlock, (cb) => {
web3.eth.getBlock(i).then((block) => {
console.log(i + ‘,’ + web3.utils.hexToNumberString(block.nonce));
i++;
cb();
});
}, () => process.exit(0));
});

簡単ですね。実際のコードでは再開機能をつけるために、このコードをシェルスクリプトから呼び出すようにしています。

#!/bin/bash

START_BLOCK=$(expr 1 + $(tail -n1 nonce_eth.csv | awk -F , ‘{print $1}’))

node ./nonce_eth.js $START_BLOCK | tee -a nonce_eth.csv

ステップ2:gnuplot でプロットする

さて、これでグラフにする元データができたので、あとはプロットするだけです。グラフプロットツールは色々とあると思いますが、ここでは gnuplot という OSS を使ってみましょう。

gnuplot -e “ \
set terminal png size 1920,1080 font ‘VL P Gothic,18’; \
set output ‘$@’; \
set datafile separator ‘,’; \
set title ‘Nonce Distribution’; \
set xlabel ‘Block Height’; \
set ylabel ‘Nonce’; \
set grid xtics ytics mxtics mytics; \
set nokey; \
plot ‘$<’ using 1:2 with points pt 7 ps 0.1 lc rgb ‘black’; \

こんな感じでプロットできます。ブロック高の大きさなどがコインごとに違いますので、グラフがきれいになるように適宜調整は必要ですが。

ステップ3:鑑賞する

で、実際にプロットしたものが以下です。

まずはビットコイン。

次にモナーコイン。

最後にイーサリアム。

どのコインも 0 付近が濃い時代があるとか、イーサリアムとそれ以外だと nonce の値の範囲が違うとか、ビットコインの場合には四つの「線」が入っているとか、じっくり鑑賞するとなかなか趣深いところがありますね(気になる方は理由を考えてみましょう)。


お知らせ
■ブロックチェーンエンジニア集中講座開講中!
HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。
ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/
■フレセッツ株式会社では仮想通貨の事業者向け BtoB ウォレットの開発をしていただけるエンジニアを募集しています!詳しくはこちら→https://fressets.com/career/
■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。
HashHub:https://hashhub.tokyo/
Twitter:https://twitter.com/HashHub_Tokyo

GBEC Tech Blog

This Blog is for all Blockchain Engineer

Masahiko Hyuga

Written by

GBEC Tech Blog

This Blog is for all Blockchain Engineer

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade