EIP-155: Simple replay attack protection
단순 재생 공격(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.number
가 FORK_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.number
가 FORK_BLOCK_NUMBER
보다 크거나 같고 v
가 CHAIN_ID * 2 + 35
또는 CHAIN_ID * 2 + 36
이면, 6개의 요소를 RLP 인코딩하는 대신 9개의 요소를 RLP 인코딩하여 사용해야 합니다. 현존하는 서명 스키마는 하위 호환성을 보장하기 위해 여전히 v
가 27
또는 28
인 경우에도 유효하다고 판단합니다. 그러나 한편으로 이는 여전히 재생 공격이 발생할 수 있다는 것을 의미합니다.
논리적 근거
ETC
(이더리움 클래식)나 테스트넷 등 서로 다른 체인 ID를 가지게 함으로써 이더리움 네트워크에서 발생하는 단순 재생 공격을 방지할 수 있습니다. 또한 향후 이더리움 메인넷에 기반한 다른 블록체인이 등장할 경우, 고유한 체인 ID를 부여하도록 합니다.
Chain ID | Network |
---|---|
1 | Mainnet |
5 | Görli |
11155111 | Sepolia |
1337 | Geth private chains |