メインコンテンツへスキップ

ハッシュ関数 — ETH.BUILD

教育ツールETH.BUILDを使用した暗号化ハッシュ関数のデモンストレーション。ハッシュ関数の仕組みと、それがイーサリアムのアカウントおよびデータ整合性モデルにとって不可欠である理由を学びます。

Date published: 2021年1月14日

オースティン・グリフィスによるチュートリアル。ビジュアルプログラミングツールETH.BUILDを使用して、暗号化ハッシュ関数がどのように機能するかをデモンストレーションし、決定性、固定長出力、一方向性、およびマークル・ツリーについて解説します。

このトランスクリプトは、オースティン・グリフィスが公開した元のビデオトランスクリプト (opens in a new tab)のアクセシブルなコピーです。読みやすさのために軽く編集されています。

ハッシュ関数の紹介 (0:00)

これはETH.BUILDというシリーズの最初のビデオです。eth.buildにアクセスしてこのツールを使用することもできますが、これはイーサリアム上で構築する際に物事がどのように機能するかを遊びながら理解するためのものです。

最初に見るモジュールはハッシュ関数です。ハッシュ関数とは一体何でしょうか?簡単に言えば、指紋のようなものです。入力(何でも構いません)がありますが、ここでは「hello world」というテキストを使用します。反対側には出力があり、その出力は64文字の16進数文字列になります。「0x」というプレフィックスがあるため66文字と表示されますが、実際には64文字の16進数文字列です。

ハッシュを色として視覚化する (0:50)

16進数を見ると、色を表すコードのように見えます。ここで見ているものを色にしてしまえば、説明が簡単になるかもしれません。そこで、文字列の最初の6文字を取り出して、それを色として表示してみましょう。それを見ると、きれいな紫色であることがわかります。

私の名前が何色になるか見てみましょう。きれいなフォレストグリーンになりました。では、「hello world」に戻してみましょう。またあの紫色になりました。

決定性と固定長出力 (1:38)

ここで発見したのは、それが決定論的(deterministic)であるということです。基本的に、入力として何を入れても、反対側からは常に同じものが出力されます。

2つ目の特性は、任意のサイズのものを入力できるということです。キーボードを適当に叩くと色が変わるのがわかりますが、文字列の長さは66文字のままです。ここに何を入れても、ファイルであっても同じです。うちの子であるレオのファイルをドロップしてハッシュとして入力すると、きれいなオレンジ色になります。次に、BIPワードリストのテキストドキュメントをドロップすると、きれいな水色になります。もしレオのファイルを戻したら、何色になると思いますか?あのオレンジ色になることはわかっています。入力したものに対して、この決定論的な指紋が得られるのです。

一方向性 (2:37)

次に重要な特性は、一方向性であるということです。もう一度「hello world」と入力すると、「4717」から始まるハッシュが得られます。このハッシュを誰かに送って、「これが私の秘密のハッシュです。私の秘密を当てられたら100ドルあげますよ」と言ったとしても、彼らは正解に近づくことすらできないでしょう。

ハッシュが「4717」で始まると仮定して、彼らが一致するものを見つけようと色々と試し始めたとします。文字を少し変えて正解に近づくということはできません。当たるか外れるかのどちらかです。基本的には総当たりで推測するしかありません。たまたま「hello world」と推測できれば答えにたどり着きますが、推測できなければ永遠に正解することはできません。正解に近づいているかどうかを知る方法は全くないのです。

暗号技術を扱っていると、開発者としてフラストレーションを感じることがあります。なぜなら、機能するかしないかのどちらかであり、正解に近づいているかどうかのヒントが一切得られないからです。しかし、それは良いことなのです。それこそが、私たちがハッシュ関数に求めている特性だからです。

ハッシュ関数の特性のまとめ (3:43)

まとめると、任意のサイズのものをハッシュ関数に入力でき、そのデータが何であるかを示す正確な64文字の16進数の指紋が出力されます。それは決定論的です。一方向性であり、逆方向に進むことはできません。ハッシュを作成するのは非常に簡単ですが、ハッシュの秘密を推測するのは非常に困難です。

マークル・ツリーとハッシュの結合 (4:06)

これを使って、マークル・ツリーのような本当に素晴らしいことができます。3つの入力があり、それらを結合することができます。それらのハッシュをすべて組み合わせて、その組み合わせをハッシュ化することができます。

ここにある色、あの紫色は、これらすべてのハッシュのハッシュを表しています。「hello world」を「hello world one」に変更すると、あの紫色は変わります。これらの入力のいずれかに少しでも変更を加えると、最終的なハッシュが変わります。あらゆる種類のデータをさまざまな方法で取り込むことができます。ハッシュのツリー、つまりマークル・ツリーを作成したり、ブロックを連続して並べたりすることもでき、この最終的なハッシュはこれらすべての要素に基づいています。途中で少しでも何かが変われば、最終的なハッシュも変わるのです。

重要なポイント (5:53)

重要なポイントは、ハッシュ関数は基本的に指紋のようなものだということです。何かを入力すると、期待通りの出力が決定論的に得られます。これがハッシュ関数です。ETH.BUILDへようこそ。クールなものを作りながら、たくさんのことを学んでいきましょう。

このページは役に立ちましたか?