どうも週末に、 パッと見つけた記事で面白かったものがあったので シェアしたいと思いました。
チュートリアル用のようなunderstandableなアプリも 一緒に公開しており、 Awesome!と思ったので和訳します。

原文はコチラ How does blockchain really work? I built an app to show you.
※プロフェッショナルな 訳ではないのでそこは大目にみてください。 雰囲気だけ伝わればと思っています。 誤訳等あればおしらせください。 ※訳文掲載は著者の転載許可の承諾を得ております。
全文を訳したましたが、 マイニング部分の流れがコード付きで わかりやすく説明されていて本当に役立ちました!! できれば本文中にあるweb版のデモを触ってみると より深く理解できるはずです。
海外の記事 - (訳)Sean HHow does blockchain really work? I built an app to show you.
実際ブロックチェーンはどうやって動いているのか?説明用のアプリを作ってみた
ウィキペディアによれば、ブロックチェーンは
ブロックと呼ばれる継続的に成長するレコードのリストを保持するために 使われる分散型データベースであるとある。 うん、いいね!でもそれはどうやって動くのか?
ブロックチェーンについて説明するには、オープンソースのBlockchain CLIコマンドラインインタフェースを使うと良いと思う。
私が作ったブラウザで使えるバージョンはここです。
browser-based version of this here.
コマンドラインインターフェースバージョンをインストールする
まだ、 自分の環境にNode.jsがインストールされてなかったら、 インスートールしてください、 それから、ターミナルで下のコマンドを実行します。
npm install blockchain-cli -g
blockchain
コマンドを実行すると ? Welcome to Blockchain CLI! と bloackchain → というプロンプトが現れるでしょう。
ブロックがどのように見えるか?
ターミナルの今のブロックチェーンを見るには、
blockchain
か
bc
をターミナルに 打ち込みます。 下のように見えるはずです。

- Index (Block#) : それがどのブロックか(ジェネシスブロックのindexは0)
- Hash : そのブロックが妥当か?
- Previous Hash : 前のブロックが妥当か?
- Timestamp:いつブロックが追加されたか?
- Data: どんな情報がブロックに保持されているか?
- Nonce: 妥当なブロックを見つけるまでに何回イテレートしたか?
Genesis Block (ジェネシスブロック) 全てのブロックチェーンはGenesis Blockから始まります。 あとで見るように、各ブロックチェーンのブロックは前のブロックに依存している。 そのため、Genesis Blockは最初のブロックとして採掘される必要がある。
新しいブロックが採掘される場合に何が起きるか?
最初のブロックを採掘してみましょう。mine freeCodeCamp♥︎と打ち込んでみてください。
そのブロックはブロックチェーン場での最新のインデックスと前のブロックのハッシュを みています。このジェネシスブロックのケースでは最新のブロックは、
- Index (Block#) : 0 + 1 = 1
- Previous Hash : 0000018035a828da0…
- Timestamp:ブロックが追加されたタイムスタンプ
- Data: freeCodeCamp♥︎
- Hash : ??
- Nonce: ??
ハッシュがどのように計算されているか?
ハッシュ値は一意にデータを識別する固定長の数字の値です。
そのハッシュはインデックスと前ブロックのハッシュ値、タイムスタンプ、ブロックの値と ナンスを足したものから計算される。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
SHA256アルゴリスムはこれらの与えられたものから一意なハッシュを計算します。 同じ入力値からは常に同じハッシュが返却されます。
ブロックのハッシュの頭につく4つの0
先頭の0は有効なハッシュに最低限必要なものです。 その必須の数字はdifficultyと呼ばれます。
function isValidHashDifficulty(hash, difficulty) { for (var i = 0, b = hash.length; i < b; i ++) { if (hash[i] !== '0') { break; } } return i >= difficulty; }
これはProof-of-Work systemとしても知られています。
nonce(ナンス)とは?
nonce(ナンス)は妥当なハッシュを見つけるたみに使われる数字です。
let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {
nonce = nonce + 1;
input = index + previousHash + timestamp + data + nonce;
hash = CryptoJS.SHA256(input)
}
そのナンスはハッシュが有効になるまでイテレートされます。 このケースでは、有効なハッシュは最低限先頭に4つの0をもつ必要があります。
その有効なハッシュに一致するナンスを見つける過程がマイニングです。
difficultyが増加すると、有効なハッシュである可能性の数字が減ります。 有効となる可能性が低ければ低いほど、ハッシュを見つけるためにより多くの電力を必要とします。
なぜこれが重要なのか?
これらの作業はブロックチェーンが改ざんできなくするのに重要です。
もし、私たちがA->B->Cというブロックチェーンを持っていて、 誰かがブロックAを変更した場合に、以下のことが起こります。
- ブロックAが変更される
- そのデータはハッシュの計算に使われるのでブロックAのハッシュ値が変更される
- そのハッシュはもはや先頭4つの0を持たないので、不正なハッシュとなる
- ブロックAのハッシュはブロックBのハッシュを計算するのに使われているので、 ブロックBのハッシュも変更されます
- ブロックBのハッシュも先頭4つの0を持たないので、ブロックBが不正になります
- ブロックBのハッシュはブロックCのハッシュを計算するのに使われるので、 ブロックCのハッシュが変わります。
- ブロックCのハッシュも先頭4つの0を持たないので、ブロックCが不正になります
このチュートリアルがあなたに役立ちますように!
もしWebバージョンのでもを確認したい場合はこちらのリンクにお進みください。 http://blockchaindemo.io