Keccak-256 とは
Keccak-256 は Ethereum があらゆる場所で使う 256 ビットのスポンジ型ハッシュ関数です。アドレスは公開鍵の Keccak-256 の末尾 20 バイト、関数セレクタは正規シグネチャの Keccak-256 の先頭 4 バイトで、イベントトピック、EIP-55 チェックサム、ストレージスロットもすべてここから導かれます。これは NIST が最終化した SHA3-256 ではなく元の Keccak 提案版で、両者の違いはパディングバイトだけですが、同じ入力に対して異なるダイジェストを返します。
主な用途
- 関数セレクタ:
transfer(address,uint256)をテキストとしてハッシュし、先頭 4 バイトを取ります:0xa9059cbb。セレクタツールは多数のシグネチャを一度に処理し、Solidity の宣言を正規化します。 - イベントトピック:
Transfer(address,address,uint256)の完全な Keccak-256 が、すべての ERC-20 transfer ログの topic[0] です。 - 公開鍵からアドレス: 64 バイトの非圧縮公開鍵(0x04 プレフィックスを除く)を hex としてハッシュし、末尾 20 バイトを取ります。
- マッピングのストレージスロット:
abi.encode(key, slot)を hex バイト列としてハッシュすると、mapping(address => uint)のエントリが格納される場所が分かります。 - コミット・リビールやコンテンツハッシュ: 任意のテキストや、hex で表したファイルをハッシュします。
テストベクタ
| 入力 | Keccak-256 |
|---|---|
| (空文字列) | 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 |
abc | 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 |
Transfer(address,address,uint256) | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
実装に頼る前に、これらのいずれかを貼り付けて確認してください。
Keccak-256 vs. SHA3-256 vs. SHA-256
| 関数 | ファミリー | パディング / 構造 | 利用先 |
|---|---|---|---|
| Keccak-256 | Keccak スポンジ、レート 1088 ビット | pad10*1、ドメインバイト 0x01 | Ethereum、Tron(TVM)、すべての EVM チェーン |
| SHA3-256 | Keccak スポンジ、レート 1088 ビット | pad10*1、ドメインバイト 0x06(FIPS 202) | NIST 系アプリケーション、一部の非 EVM チェーン |
| SHA-256 | Merkle–Damgård(SHA-2) | 長さパディング、512 ビットブロック | Bitcoin、Tron の txID、TLS、Base58Check |
具体例: FIPS 202 準拠のライブラリで abc の SHA3-256 を求めると 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532 が返りますが、同じ 3 バイトの Keccak-256 は上の表の 0x4e03657a… の値です。コントラクトやエクスプローラーの値がお使いのライブラリと一致しない場合、まずパディングバイトを疑ってください。