ビットコインなどの暗号通貨が関与するトランザクションでは、トランザクションは入力として取得され、安全なハッシュ アルゴリズム (「SHA」) を通じて実行されます。 SHA は、SHA-0、SHA-1、SHA-2、SHA-3 の 4 つの SHA アルゴリズムで構成されます。
SHA-1 は、現在の SHA ハッシュ関数の中で最も広く使用されており、Secure Socket Layer (SSL) セキュリティを含む多くのアプリケーションやプロトコルで利用されています。
もう 1 つは SHA-2 であり、ハッシュ値のビット数に応じて SHA-224、SHA-256、SHA-384、SHA-512 で構成されます。
たとえば、ビットコインは SHA-256 を使用しており、固定長のハッシュ値が得られます。入力のサイズや長さに関係なく、出力は常に 256 ビットの固定長になります。これは、巨大になる可能性がある入力データを覚えておく必要がないようにするためです。必要なのは、ハッシュを覚えて追跡することだけです。 SHA 機能の詳細については、ここをクリックしてください。
暗号化の特性に応じて、ハッシュ関数はパスワードの保存とデータの整合性という 2 つの異なる方法で適用できます。
すべてのログオン プロセスでは、パスワードを公開して保存するのではなく、パスワードのハッシュ値をファイル自体に保存します。パスワード ファイルは、(ユーザー ID, h(P)) の形式のペアのテーブルで構成されます。
このプロセスを以下の図に示します。
侵入者がファイルに遭遇した場合、たとえパスワード自体にアクセスしたとしても、パスワードのハッシュしか見ることができません。ハッシュ関数には事前イメージ耐性の特性があるため、ハッシュを使用してログインしたり、ハッシュ値からパスワードを導出したりすることはできません。
これはハッシュ関数の最も一般的なアプリケーションです。データ ファイルのチェックサムを生成するために使用され、データが正確であることをユーザーに保証します。

上の図では、ユーザーが元のファイルに加えられた変更を検出するのに役立つ整合性チェックが示されています。
データ整合性チェックに関する注意点は、これはファイルが実際に元のファイルであると確信できる場合にのみ価値があるということです。
例:侵入者が侵入すると、ファイル データを変更する代わりに、ファイル全体を変更してまったく新しいハッシュを計算し、それを受信者に送信します。どうすればわかりますか?そうは思わないでしょう。
したがって、整合性チェックは、ユーザーがファイルのオリジナル性を確信している場合にのみ役立ちます。
ハッシュ関数が「安全」で効果的な暗号化ツールであるとみなされるには、ハッシュ関数が特定の特性またはプロパティを持っている必要があります。
このプロパティの下では、個人がハッシュ関数を通じて特定の入力を何度行っても、常に同じ結果が得られます。これは、特定の入力を簡単に追跡できるようにするためです。
このプロパティの下では、ハッシュ関数は入力のハッシュを迅速に返す必要があります。
「プリイメージ耐性」特性は、ハッシュ関数を逆にすることが計算的に困難であることを意味します。
例:ハッシュ関数 (h) がハッシュ値 (z) を生成した場合、(z) にハッシュされる入力値 (x) を見つけるのは困難なプロセスになるはずです。チェーンのリンクを見つけるのは非常に困難です。これにより、ハッシュ値しか持たず、入力 (チェーン内のリンク) を見つけようとする潜在的なハッカーに対して確実に対抗できます。
このプロパティは、同じハッシュを持つ別の入力を見つけるのが難しいことを意味します。
例:入力 (x) のハッシュ関数 (h) がハッシュ値 h(x) を生成する場合、h(y) =h(x) となる他の入力値 (y) を見つけるのは困難です。
これにより、入力値とそのハッシュを持ち、その元の入力値の代わりに別の値 h(x) を正当な値として置き換えようとするあらゆる脅威から保護されます。
この特性により、同じハッシュから得られる任意の長さの 2 つの異なる入力を見つけることが困難になります。
例:ハッシュ関数 h の場合、ハッカーが h(x) =h(y) をまとめることができる 2 つの異なる出力 x と y を見つけるのは困難です。
ハッシュ関数は基本的に固定ハッシュ長で関数を圧縮しますが、ハッシュ関数が衝突しないことは不可能です。 「衝突がない」という特性を持つことにより、攻撃者が同じハッシュを持つ 2 つの入力値を見つけることがさらに困難になります。
すべての出力「y」について、「最小エントロピーが高い」分布から「K」が選択された場合、H(k|x) =Y となる入力「x」を見つけることは非常に困難です。
「最小エントロピーが高い」とは、選択されている値が値の範囲に非常に広範囲に分散しているため、正しい値を選択する可能性が非常に低いことを意味します。
「1 から 100 までの数字を選ぶ」というゲームを覚えていますか?それは高い最小エントロピーです。
|つまり、k|x は kx を意味します。
データ構造のプロパティについて話すときは、ポインターとリンク リストを指します。
ポインタは、プログラミングにおいて別の変数のアドレスを格納し、他の変数の位置を指す変数です。
リンク リストは、ポインタを介して次のブロックにリンクされたデータ セットを各ブロックに含む一連のブロックです。

各ブロック内には、次のブロックへのアドレスを含むポインターが表示されます。ポインタが表示される最初のブロックは、Genesis ブロックと呼ばれます。

データ構造のプロパティについて話すときは、ポインターとリンク リストを指します。
ポインタは、プログラミングにおいて別の変数のアドレスを格納し、他の変数の位置を指す変数です。
リンク リストは、ポインタを介して次のブロックにリンクされたデータ セットを各ブロックに含む一連のブロックです。

マークル ツリーを見るときは常に、一番下のリーフ ノード (L1、L2、L3、L4) から始めるのが最善です。上に進むと、非リーフ ノードが表示されます。これは、子ノード (ハッシュ 0-0、0-1、1-0、1-1) の値 (hash(L1))、(hash(L2))、(hash(L3))、および (hash(L4)) のハッシュとして機能します。
「子ノード」は、ハッシュにフィードするノードです。ハッシュ 0 の場合、子ノードはハッシュ 0-0 とハッシュ 0-1 です。ハッシュ 1 の場合、子ノードはハッシュ 1-0 とハッシュ 1-1 です。

グラフを「トップ ハッシュ」というラベルの付いた最上位の層に移動すると、これがルート ノードになります。
では、マークル ツリーの目的は何なのか気になりますか?特定のブロックを並べ替えるのは簡単な作業ではありませんが、マークル ツリーを使用すると、特定のトランザクションを検索して、そのトランザクションがその特定のブロックに属するかどうかを判断する時間を節約できます。
トランザクションを確認するときは、含まれているデータが適切なブロックに属していることを確認する必要があります。マークル ツリーを使用すると、ハッシュの痕跡をたどることでデータをすばやく追跡できます。

新しいブロックが到着すると、それらのブロックの内容全体がハッシュされます。ハッシュが目標難易度未満の場合は、コミュニティが認識できるようにブロックチェーンに追加されます。
このように、新しいブロックをチェーンに追加する準備ができていることはほとんどありません。これが、任意のデータ文字列であるノンスがブロックのハッシュに追加される理由です。追加されると、文字列は再度ハッシュされ、難易度レベルと比較されます。
難易度レベルよりも高い場合は、ノンスが変更され、難易度レベルの要件が満たされるまで何度も繰り返しられます。これらの要件が満たされた場合にのみ、ブロックは最終的にブロックチェーンに追加されます。
ハッシュ レートは、マイニング プロセス中にハッシュ操作にかかる速度を表します。
ハッシュ レートが高いということは、マイニング プロセスに関与する関係者が多くなり、スムーズな操作が可能になることを意味します。ただし、ハッシュレートが速すぎると難易度が高くなります。
ハッシュレートが遅くなりすぎると、難易度が下がります。システムが常にスムーズに動作するようにすることが目的であるため、正確なハッシュ操作のあらゆる手段を提供することが不可欠です。
つまり、要約すると次のようになります。
データのブロックを受信すると、そのブロックの内容のハッシュがノンス、つまりランダムなデータ文字列と結合されます。
新しいデータ文字列 (ハッシュ + ノンス) は、難易度に応じて再度ハッシュされます。要件を満たしているかどうかに応じて、新しい文字列は再度ハッシュされるか、ブロックチェーンに追加されます。
ブロックチェーンに追加されると、コミュニティに通知されます。
このプロセスを担当するマイナーにはビットコインが報酬として与えられます。