「ハッシュ」と「ナンス値」について

「ハッシュ」と「ナンス値」について

ビットコインのブロックチェーンの構造を説明される時に、「ハッシュ」と「ナンス値」という用語が出てきます。

これらは、ブロックチェーンのブロックに含まれるデータの種類を指します。

それぞれがどんな役割を持つデータなのか、簡単に解説していきたいと思います。

仮想通貨(暗号資産)におけるハッシュ値やハッシュ関数の役割

仮想通貨(暗号資産)の中核となるブロックチェーンの技術では、色々なところでハッシュ値を利用しています。

ハッシュ値は、あるデータを変換して別の文字列や値に暗号化されたもので、パスワードのようなものを知ることが出来ないので、基本的に改ざんや個人情報の漏洩はありません。

多くの仮想通貨(暗号資産)には、中央集権的なサーバーがないために、監視がない状態でデータの正しさを証明する必要性があります。

このデータを担保するために、「マイニング」と呼ばれる承認システムを導入し、適切なハッシュ値を計算する作業を行います。

ブロックチェーン上ではトランザクションの中でもハッシュ関数を利用しています。

トランザクションの中には、ハッシュ値が存在していて、このハッシュ値は、一つ前のトランザクションの一部をハッシュ関数により出力します。

ハッシュ値

ハッシュとは元々暗号化されたデータのことを指します。

あるデータをハッシュ関数という関数にかけると、そのデータは暗号化された値で出力されます。

この値を「ハッシュ値」と言います。

その値だけを取り出してみても、何を示しているか判断はできません。

同じデータからは必ず同じハッシュ値が算出されますが、少しでもデータが変化すると、異なるハッシュ値が算出されるという特徴を持っています。

規則性がないために、どのようなハッシュ値が出力されるのか予測することは不可能です。

例えば、学校の出席番号をイメージしてみます。

「安倍晋三」さんという人がいて、その人の出席番号は1番だとします。

これは容易に想像はつきますが、「出席番号1番」ということから〇〇学校における△△学年の✕✕組の1番は誰か?ということはわかり得ません。

このように、一方向からは容易に計算できるけれども、逆方向からは非常に難しいというような関数をハッシュ関数」と言います。

ナンス値

「ナンス値」は(number used once)の略で、特定のハッシュ値を生成するために用いられる使い捨ての数値です。

ブロックチェーン上で、マイナーが新しいブロックを追加する際に生成する数値です。

その性質から、「ワンタイムトークン」とも呼ばれます。

ブロックの構成に関わるハッシュとナンス

ブロックチェーンのブロックには3つのデータが含まれています。

  1. 取引データ
  2. 一つ前のブロックのハッシュ値
  3. ナンス値

これら3つの値を合わせてハッシュ関数に入力して、ハッシュ値を計算し、次のブロックのジョイントとして役割を果たしていくのです。

ブロックチェーンの仕様によって変わってきますが、新たなブロックを追加してチェーンをつないでいくマイナーの選定には、ゼロが任意に設定された個数以上に並ぶハッシュ値を最も早く見つけ出すことが必要となります。

このハッシュ値の生成には過去の全てのトランザクションデータがまとめられ、暗号化されたハッシュに新たにブロックに含めるトランザクションデータに、ナンスを加えることが求められます。

ですので、条件を満たすハッシュ値を探すためには、ナンスを総当りで探すことが必要となります。

ナンスが変わればハッシュ値も変化することを考えると、マイニングは、ハッシュ値の条件を満たすナンス値を見つけ出す作業とも言い替えることが出来ます。

まとめ

ハッシュ値の大きな特徴は、出力値から逆に入力値を算出出来ないところです。

ここが通常の関数と大きな違いになります。

このハッシュ関数により、過去データの改ざんを非常に難しくしています。

さらに、ハッシュ値の算出において、前のブロックのハッシュ値を利用しているのもポイントで、データを改ざんさせようとしても、前のハッシュ値も変える必要があるので、現在のハッシュ値を変えるためには、過去のハッシュ値を全て変えていく必要があります。

これは、現実的には不可能と言えるでしょう。

結果どの台帳も内容が正しく、最新の状態に保たれているというわけです。

仮想通貨(暗号資産)では、このような仕組みで不正を防止しています。