EIP - 55
EIP-55: 이더리움 주소 체크섬
왜 필요한가?
이더리움 주소는 40자리 hex 문자열이다. 복사하다 한 글자 틀리면 다른 주소로 전송되고, 되돌릴 수 없다. EIP-55는 대소문자 패턴을 이용해 오타를 감지한다. 주소 형식 자체는 바꾸지 않는다.
0xab5801a7d398351b8be11c439e05c5b3259aec9b ← 체크섬 없음
0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B ← 체크섬 적용
Keccak-256 vs SHA-3
EIP-55는 Keccak-256 해시를 사용한다. SHA-3와 핵심 알고리즘은 같고, 차이는 패딩 한 바이트뿐이다.
Keccak: 패딩에
0x01SHA-3: 패딩에
0x06
이더리움이 Keccak을 쓰는 이유는 단순히 타이밍이다. 이더리움 설계(2013~2014) 당시에는 Keccak만 존재했고, NIST가 패딩을 바꿔 SHA-3를 표준화한 건 2015년 8월(이더리움 출시 이후)이다. 이미 돌아가는 시스템을 굳이 바꿀 이유가 없었다.
동작 방식
주소에서
0x를 떼고 전부 소문자로 만든다그 문자열의 Keccak-256 해시를 구한다
해시의 각 자리(니블)가 8 이상이면 대문자, 미만이면 소문자로 변환한다
const { keccak256 } = require("js-sha3");
function toChecksumAddress(address) {
const addr = address.replace("0x", "").toLowerCase();
const hash = keccak256(addr);
let result = "0x";
for (let i = 0; i < 40; i++) {
result += parseInt(hash[i], 16) >= 8
? addr[i].toUpperCase()
: addr[i];
}
return result;
}
검증은 같은 로직을 돌려서 결과가 일치하는지 비교하면 끝이다.