Tech/EIPs/#155
EIP 155카테고리 · 코어유형 · 표준 트랙상태 · 최종

Simple replay attack protection

쉬운 설명

트랜잭션에 체인 ID를 포함시켜서, 이더리움 메인넷에서 서명한 거래가 테스트넷이나 다른 체인에서 그대로 재사용되는 리플레이 공격을 막아요.

EIP-155는 이더리움 트랜잭션 서명에 체인 ID를 포함시켜 리플레이 공격(replay attack)을 방지하는 간단하지만 중요한 개선입니다. 이 EIP 이전에는 메인넷에서 서명한 트랜잭션을 그대로 테스트넷이나 다른 이더리움 포크 체인에서 재사용할 수 있었습니다.

리플레이 공격이란

2016년 이더리움-이더리움 클래식(ETC) 분기 이후, 이더리움 메인넷에서 유효한 트랜잭션이 이더리움 클래식 체인에서도 그대로 유효했습니다. 공격자가 메인넷 트랜잭션을 복사해 ETC 체인에서 브로드캐스트하면, 피해자는 의도치 않게 두 체인에서 동시에 자산을 잃게 됩니다. 이를 리플레이 공격이라 하며, EIP-155는 이를 근본적으로 차단합니다.

서명 v 값에 체인 ID 포함

EIP-155 이전 트랜잭션의 v 값은 27 또는 28이었습니다. EIP-155 이후 v는 chainId * 2 + 35 또는 chainId * 2 + 36으로 계산됩니다. 서명 시 입력 데이터(rlp 인코딩)에 chainId, 0, 0을 추가로 포함하여 해싱합니다. 이렇게 하면 같은 트랜잭션이라도 체인 ID가 다르면 서명값이 완전히 달라져 다른 체인에서는 유효하지 않습니다.

주요 체인 ID 목록

체인 ID는 각 네트워크를 고유하게 식별합니다. 1 = 이더리움 메인넷, 3 = Ropsten(현재 폐기), 4 = Rinkeby(현재 폐기), 5 = Görli(현재 폐기), 11155111 = Sepolia, 61 = Ethereum Classic, 137 = Polygon, 56 = BNB Smart Chain, 42161 = Arbitrum One, 10 = Optimism. 전체 목록은 chainlist.org에서 확인할 수 있습니다.

구체적인 계산 예시

이더리움 메인넷(chainId = 1)에서 트랜잭션을 서명할 때: 서명 입력 = rlp([nonce, gasPrice, gasLimit, to, value, data, 1, 0, 0]). ECDSA 서명 결과 (r, s, v_original)에서 최종 v = v_original - 27 + chainId * 2 + 35 = v_original + 8. 따라서 v는 37 또는 38이 됩니다. Sepolia(chainId = 11155111)라면 v = 22310257 또는 22310258이 됩니다.

현재 적용 상태

EIP-155는 2016년 11월 스퍼리어스 드래곤(Spurious Dragon) 하드포크에서 활성화되었습니다. 오늘날 모든 주요 이더리움 클라이언트(Geth, Besu, Nethermind)와 지갑(MetaMask, Ledger, Trezor)은 EIP-155를 기본으로 적용합니다. EIP-2930, EIP-1559 등 이후의 트랜잭션 타입도 모두 체인 ID를 포함하는 방식을 유지합니다.

공식 EIP 문서open_in_new