# EIP - 55

# EIP-55: 이더리움 주소 체크섬

## 왜 필요한가?

이더리움 주소는 40자리 hex 문자열이다. 복사하다 한 글자 틀리면 다른 주소로 전송되고, 되돌릴 수 없다. EIP-55는 **대소문자 패턴**을 이용해 오타를 감지한다. 주소 형식 자체는 바꾸지 않는다.

```plaintext
0xab5801a7d398351b8be11c439e05c5b3259aec9b   ← 체크섬 없음
0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B   ← 체크섬 적용
```

## Keccak-256 vs SHA-3

EIP-55는 Keccak-256 해시를 사용한다. SHA-3와 핵심 알고리즘은 같고, 차이는 패딩 한 바이트뿐이다.

*   **Keccak**: 패딩에 `0x01`
    
*   **SHA-3**: 패딩에 `0x06`
    

이더리움이 Keccak을 쓰는 이유는 단순히 타이밍이다. 이더리움 설계(2013~2014) 당시에는 Keccak만 존재했고, NIST가 패딩을 바꿔 SHA-3를 표준화한 건 2015년 8월(이더리움 출시 이후)이다. 이미 돌아가는 시스템을 굳이 바꿀 이유가 없었다.

## 동작 방식

1.  주소에서 `0x`를 떼고 전부 소문자로 만든다
    
2.  그 문자열의 Keccak-256 해시를 구한다
    
3.  해시의 각 자리(니블)가 **8 이상이면 대문자**, 미만이면 소문자로 변환한다
    

```javascript
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;
}
```

검증은 같은 로직을 돌려서 결과가 일치하는지 비교하면 끝이다.
