keccak256関数とは、一言でいえば、「ハッシュ関数」です。
ただいきなりハッシュ関数と言われてもピンとこないと思います。
本記事では、その意味や実行結果、使い方などについて解説します。
ハッシュ関数の意味
ハッシュ関数とは、“特定の値を不可逆な別の値に変換する関数”です。
これをハッシュ化といい、ハッシュ関数によりハッシュ化された値をハッシュ値といいます。
“不可逆(元の値に戻すことができない)”というのがポイントです。
変換後の値から元の値を復号することはできないため、暗号化とは異なります。
ハッシュ関数の実行結果
実際にkeccak256関数を実行し、どんな値を得られるか見てみたいと思います。
具体的には以下のようなコードに文字列を渡してみます。
keccak256(abi.encodePacked(文字列))
appleという値を渡してみる
appleという値を渡すと"0x85dca312121b082f39dd34192d69dffd93c0add33dac13f7846f2975fba845c6"というハッシュ値が得られます。
これは何度やっても、元の値が同じ(apple)である限り、同じ結果が返されます。
applという値を渡してみる
最後の一文字だけ削ったapplという値を渡してみると、今度は"0xc295a848a8ba37d67478c8c0ad603e8ae9b0caa69bf817696bb7f82d89d78e6d"という先程とは全く異なるハッシュ値が得られます。
こちらも、何度やっても元の値が同じ(appl)である限り、同じ結果が返されます。
実行結果まとめ
実行結果を纏めると以下のようになります。
- keccak256関数に値を渡すとハッシュ値を得られる
- 同じような文字でも1文字さえ違えばハッシュ値は全く異なったものになる
- ハッシュ値から元の値を求めることはほぼ不可能である
ハッシュ関数の使い方
ハッシュ関数については何となく分かったと思いますが、実際にどんな場面で活用するのかイメージし辛いと思います。
Solidityにおける、keccak256関数の最も典型的な使い方は、以下のような文字列比較です。
keccak256(abi.encodePacked(文字列1)) == keccak256(abi.encodePacked(文字列2))
一般的なプログラミング言語であれば文字列をそのまま比較すればよいのですが、Solidityは文字列を直接扱えないため、このようにkeccak256で一度ハッシュ値に変換しそれらを比較する必要があります。
なお、abi.encodePacked()というのは、Solidityで文字列を扱うための関数です。
サンプルコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
function strToKeccak256(string memory str) public pure returns(bytes32) {
// 引数で受け取った文字列(str)をハッシュ化
return keccak256(abi.encodePacked(str));
}
function isSameWord(string memory word1, string memory word2) public pure returns(bool) {
// 文字列を比較(Solidityでは文字列を直接扱えないためハッシュ値同士を比較)
return keccak256(abi.encodePacked(word1)) == keccak256(abi.encodePacked(word2));
}
}
Solidityにおいてハッシュ値すなわちkeccak256関数をよく使います。ぜひサンプルコードを実行し値を入力してみて実際の挙動をつかんでみて下さい。