Keccak-256란 무엇인가요?
Keccak-256는 이더리움이 거의 모든 곳에서 사용하는 256비트 스펀지 해시 함수입니다. 주소는 공개키의 Keccak-256 해시 중 마지막 20바이트이고, 함수 셀렉터는 정규 시그니처의 Keccak-256 해시 중 처음 4바이트이며, 이벤트 토픽, EIP-55 체크섬, 스토리지 슬롯도 모두 여기서 파생됩니다. 이는 원래의 Keccak 제출안으로, NIST가 최종 확정한 SHA3-256과는 패딩 바이트만 다르기 때문에 같은 입력에 대해 두 함수는 서로 다른 다이제스트를 냅니다.
주요 용도
- 함수 셀렉터:
transfer(address,uint256)를 텍스트로 해시한 뒤 처음 4바이트를 취합니다:0xa9059cbb. 셀렉터 도구는 여러 시그니처를 한 번에 처리하고 Solidity 선언문을 정규화합니다. - 이벤트 토픽:
Transfer(address,address,uint256)의 전체 Keccak-256 해시가 모든 ERC-20 전송 로그의 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 스펀지, rate 1088비트 | pad10*1, 도메인 바이트 0x01 | 이더리움, Tron(TVM), 모든 EVM 체인 |
| SHA3-256 | Keccak 스펀지, rate 1088비트 | pad10*1, 도메인 바이트 0x06 (FIPS 202) | NIST 애플리케이션, 일부 비 EVM 체인 |
| SHA-256 | Merkle–Damgård (SHA-2) | 길이 패딩, 512비트 블록 | 비트코인, Tron txID, TLS, Base58Check |
예시: FIPS 202 라이브러리에서 abc의 SHA3-256은 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532를 반환하지만, 같은 3바이트의 Keccak-256은 위 표의 0x4e03657a… 값입니다. 컨트랙트나 익스플로러의 값이 라이브러리 결과와 다르다면 패딩 바이트부터 확인하세요.