EIP-155: Simple replay attack protection

Static Badge Static Badge

단순 재생 공격(Simple Replay Attack)을 방지하기 위해 트랜잭션에 체인 ID를 추가하는 EIP입니다.

Spurious Dragon 포크와 함께 적용되었습니다.

적용일시: Nov 22, 2016, 4:15:44 AM +UTC


등장 배경

DAO 하드 포크 이후, 이더리움 메인넷이 이더리움 클래식이더리움으로 분리되었습니다. 이더리움 클래식은 이더리움 메인넷의 하드 포크 이전 상태를 유지하고 있습니다. 이더리움 클래식의 블록체인을 이더리움 메인넷의 블록체인과 공유하는 것은 불가능합니다. 하지만 이더리움 클래식의 트랜잭션을 이더리움 메인넷에서 재생할 수 있습니다. 소프트웨어 사양이 크게 다르지 않고 포크가 진행될 때 기존의 이더리움 메인넷에서 사용한 계정과 이더 잔액을 그대로 이더리움 클래식에서 사용할 수 있기 때문입니다.

예를 들어, Alice가 이더리움 클래식에서 Bob에게 10 이더를 전송하는 트랜잭션을 생성합니다. Bob은 이 트랜잭션(서명된)을 이더리움 메인넷에서 재생하여 Alice의 비밀키를 모르고도 Alice 계정으로부터 10 이더를 탈취할 수 있습니다. 이를 단순 재생 공격(Simple Replay Attack)이라고 하며, 이 문제를 해결하기 위해 트랜잭션에 체인 ID를 추가하는 EIP-155이 제안되었습니다.


세부 사항

파라미터

  • FORK_BLOCK_NUMBER: 하드 포크 블록 번호, 2675000
  • CHAIN_ID: 체인 ID, 1 (메인넷)

설명

현재 block.numberFORK_BLOCK_NUMBER보다 크거나 같으면, 트랜잭션에 CHAIN_ID를 추가할 수 있습니다. 그리고 블록 해시를 계산할 때 기존에는 6개의 요소 (nonce, gasprice, startgas, to, value, data)를 rlp 인코딩한 것과 달리, 9개의 요소 (nonce, gasprice, startgas, to, value, data, chainid, 0, 0)를 rlp 인코딩하여 사용해야만 합니다. 이렇게 할 경우, 서명의 v 값은 반드시 {0,1} + CHAIN_ID * 2 + 35로 계산되어야 합니다. 이 때 {0,1}은 서명에 사용된 secp256k1 타원 곡선 위의 점의 x좌표 r로부터 y좌표를 계산할 때 y 좌표가 짝수인지 홀수인지를 나타내는 패리티 갑입니다. 만약 기존처럼 6개의 요소를 rlp 인코딩하여 사용한다면, 서명의 v 값은 반드시 {0,1} + 27로 계산되어야 합니다.

현재 block.numberFORK_BLOCK_NUMBER보다 크거나 같고 vCHAIN_ID * 2 + 35 또는 CHAIN_ID * 2 + 36이면, 6개의 요소를 RLP 인코딩하는 대신 9개의 요소를 RLP 인코딩하여 사용해야 합니다. 현존하는 서명 스키마는 하위 호환성을 보장하기 위해 여전히 v27 또는 28인 경우에도 유효하다고 판단합니다. 그러나 한편으로 이는 여전히 재생 공격이 발생할 수 있다는 것을 의미합니다.


논리적 근거

ETC(이더리움 클래식)나 테스트넷 등 서로 다른 체인 ID를 가지게 함으로써 이더리움 네트워크에서 발생하는 단순 재생 공격을 방지할 수 있습니다. 또한 향후 이더리움 메인넷에 기반한 다른 블록체인이 등장할 경우, 고유한 체인 ID를 부여하도록 합니다.

Chain IDNetwork
1Mainnet
5Görli
11155111Sepolia
1337Geth private chains

참고 자료