EIP-5793 거래 알림에 타입과 크기 추가 (eth/68) (eth/68 - Add tx type to tx announcement)
최종 확정 · 네트워크·노드 · 원문 상태 Final · 2022-10-18 작성
노드끼리 새 거래가 있다고 알리는 메시지에 거래 해시만 담던 것을 바꿔, 거래의 타입과 크기까지 함께 보내도록 와이어 프로토콜을 eth/68로 올립니다.
왜 필요한가
이더리움 노드는 새 거래를 받으면 이웃 노드(피어)에게 알립니다. 이때 쓰는 NewPooledTransactionHashes 메시지에는 거래의 해시(고유 식별값)만 들어 있어서 받는 쪽은 그 거래가 어떤 종류인지, 용량이 얼마나 큰지 모른 채 가져올지를 정해야 했습니다. EIP-4844가 도입하는 블롭 거래(blob transaction)처럼 덩치가 큰 거래가 문제입니다. 이런 거래를 지금처럼 피어 수의 제곱근만큼의 노드에 통째로 뿌리면 네트워크 대역폭 부담이 크게 늘 수 있습니다. 알림에 타입과 크기를 넣으면 노드가 필요한 거래만 골라 받을 수 있고 과거 행동을 근거로 특정 피어의 다운로드를 조절하거나 부하를 분산할 수 있습니다. 또 거래 전파를 악용한 서비스 거부(DoS) 공격의 증폭 효과를 줄이는 기반이 됩니다.
무엇이 바뀌나
지금
- 거래 알림 메시지에 거래 해시만 들어 있습니다.
- 받는 노드는 거래의 종류와 크기를 모른 채 가져올지 정해야 합니다.
- 큰 거래도 다른 거래와 똑같이 여러 피어에 그대로 전파될 수 있습니다.
EIP-5793 이후
- 알림 메시지에 해시와 함께 거래 타입, 크기가 들어갑니다.
- 받는 노드가 필요한 거래만 골라서 요청할 수 있습니다.
- 특정 타입이나 큰 거래의 다운로드를 피어별로 조절할 수 있습니다.
누구에게 영향이 있나
- 클라이언트 팀: eth/68 버전을 구현해야 합니다. 기존 eth/67과 함께 여러 버전을 지원할 수 있어 즉시 호환이 깨지지는 않습니다.
- 노드 운영자: 큰 거래를 선별해 받을 수 있어 대역폭 사용이 더 예측 가능해집니다.
- 일반 사용자: 프로토콜 내부 변경이라 직접 체감하는 변화는 없지만 블롭 거래 시대에 네트워크가 안정적으로 돌아가는 바탕이 됩니다.
심층 설명
메시지 형식 변경
NewPooledTransactionHashes (0x08) 메시지의 구조를 바꿉니다. eth/67에서는 [hash_0: B_32, hash_1: B_32, ...]로 32바이트 해시의 목록만 보냈습니다. eth/68에서는 [types: B, [size_0: P, size_1: P, ...], [hash_0: B_32, hash_1: B_32, ...]]로, 알린 해시들에 대응하는 거래 타입(types)과 각 거래의 크기(size_0, size_1, ...)를 함께 보냅니다. 거래 타입은 EIP-2718이 정의한 타입 체계를 따릅니다.
types가 리스트가 아니라 바이트 배열인 이유
types 요소는 타입 값들의 리스트가 아니라 하나의 바이트 배열(byte array)로 묶어 보냅니다. 이는 설계 의도라기보다, 이 EIP의 초기 구현들이 잘못해서 바이트 배열로 구현했기 때문입니다. 이후 수정 작업을 최소화하기 위해 이 동작을 그대로 유지하기로 결정했습니다.
블롭 거래와 대역폭 문제
EIP-4844는 새 거래 타입인 블롭 거래를 도입합니다. 블롭 거래는 크기가 커서 이를 sqrt(peers)에 그대로 브로드캐스트하면 대역폭 요구량이 크게 늘 수 있습니다. 알림에 타입과 크기를 추가하면 노드가 가져올 거래를 선택할 수 있고 과거 행동을 근거로 피어별 부하 분산이나 속도 제한(throttle)이 가능해집니다.
업그레이드 없는 향후 조정 여지
추가된 메타데이터 필드는 앞으로 프로토콜 버전을 다시 올리지 않고도 동작을 조정할 수 있는 길을 엽니다. 예를 들어 특정 거래 타입(블롭 거래)이나 특정 크기 이상(128KB+)의 거래를 여러 피어에 무턱대고 브로드캐스트하지 못하게 막는 방식입니다. 알림만 보내고 요청이 올 때만 전송하도록 강제하면 네트워킹 동작이 훨씬 예측 가능해지고 거래 전파를 이용한 DoS 공격의 증폭 효과가 제한됩니다.
하위 호환성과 배포 방식
이 EIP는 eth 프로토콜을 바꾸므로 새 버전 eth/68을 배포해야 합니다. 와이어 프로토콜은 여러 버전을 동시에 지원할 수 있어서 새 버전이 나와도 구 클라이언트는 eth/67을 계속 쓸 수 있고 즉시 호환이 깨지지 않습니다. EVM의 합의 규칙은 바뀌지 않으므로 하드포크가 필요 없으며 원문에 별도의 보안 고려 사항은 없다고 명시되어 있습니다. 이 EIP의 상태는 Final로 확정되었습니다.