EIP-8070 eth/72 스파스 블롭풀 (eth/72 - Sparse Blobpool)
포함 확정 (SFI) · 네트워크·노드 · 원문 상태 Last Call · 2025-10-29 작성
실행 레이어 블롭풀에서 모든 노드가 블롭 데이터 전체를 받는 방식을 바꿔, 15% 확률로만 전체를 받고 나머지는 합의 레이어와 같은 담당 조각만 샘플링해 평균 대역폭을 약 4분의 1로 줄입니다.
왜 필요한가
블롭을 싣는 거래(타입 3 거래)의 데이터는 지금 실행 레이어(Execution Layer, EL)의 대기열인 블롭풀에서 모든 노드가 전부 내려받습니다. 반면 합의 레이어(Consensus Layer, CL)는 이미 샘플링 덕분에 일부만 받습니다. 그 결과 Fusaka 데브넷에서 풀노드의 평균 다운로드 대역폭은 EL 블롭풀이 CL의 약 4~5배를 차지하는 것으로 관측됐습니다. 블롭 개수만 올리는 BPO 포크로 처리량이 계속 늘면 이 전면 복제 방식이 EIP-7870이 정한 노드 사양 기준의 한계에 부딪히고 블록과 증명(attestation) 전파와 대역폭을 두고 경쟁해 네트워크 안정성과 라이브니스를 해칠 수 있습니다. 이 제안은 CL과 같은 커스터디 정렬 샘플링을 EL에도 들여와 평균 대역폭을 약 4분의 1로 줄이면서 복잡한 샤딩 구조 대신 지금 블롭풀의 단순하고 확률적인 성격을 그대로 유지합니다. 사용자에게 보이는 변화 없이 다음 단계의 블롭 처리량을 열기 위한 설계입니다.
무엇이 바뀌나
지금
- 모든 EL 노드가 모든 블롭 거래의 데이터 전체를 내려받습니다.
- Fusaka 데브넷에서 풀노드 다운로드 대역폭은 EL 블롭풀이 CL의 약 4~5배를 차지합니다.
- 블롭 처리량이 늘수록 블롭풀 트래픽이 블록·증명 전파와 경쟁합니다.
EIP-8070 이후
- 노드는 15% 확률로만 블롭 전체를 받고 나머지 85%는 CL 커스터디와 같은 조각(셀)만 샘플링합니다.
- 검증자는 블롭당 64개 셀 중 최소 8개만 받아, 평균 대역폭이 기존의 약 0.25배(약 4배 절감)가 됩니다.
- 블록 빌더는 포함할 블롭 거래의 전체 데이터를 항상 미리 받아 둡니다(eager mode).
- CL은 블록 검증 때 engine_getBlobsV4로 블롭풀에 미리 퍼진 셀을 활용합니다.
누구에게 영향이 있나
- 노드 운영자·검증자: 블롭풀 평균 대역폭이 약 4분의 1로 줄어, 같은 하드웨어 기준(EIP-7870)에서 더 높은 블롭 처리량을 감당할 수 있습니다.
- 클라이언트 팀: 새 와이어 프로토콜 eth/72와 엔진 API 확장을 구현해야 합니다. 데브넷 8 참여에는 이 기능 구현이 의무입니다.
- L2·롤업: 블롭 처리량 확대의 병목인 EL 블롭풀 대역폭이 완화됩니다. 거래 형식이나 사용 방법은 바뀌지 않습니다.
- 사용자: 직접 보이는 변화는 없습니다. 네트워킹 계층만 바뀌고 합의 규칙은 그대로입니다.
심층 설명
eth/72 와이어 프로토콜 변경
NewPooledTransactionHashes(0x08)에 B_16(uint128) 타입의 cell_mask 필드를 추가합니다. CELLS_PER_EXT_BLOB 길이의 비트배열로 해석하며 메시지 안에서 공지하는 모든 타입 3 거래에 대해 보유한 열 인덱스에 1을 세웁니다. 타입 3 거래가 없으면 nil입니다. GetPooledTransactions(0x09)/PooledTransactions(0x0a) 응답에서는 타입 3 거래의 blobs 필드를 RLP 빈 리스트(0xc0)로 인코딩해 블롭 본문을 생략합니다(빈 바이트 문자열 0x80은 금지). 커밋먼트와 셀 증명은 계속 보냅니다. 셀 단위 요청·응답용으로 GetCells(0x14)와 Cells(0x15) 메시지를 새로 추가하며 응답자는 용량에 따라 요청보다 적은 셀을 돌려줄 수 있습니다. 하나의 cell_mask로는 거래마다 다른 보유 상태를 표현할 수 없어, 전체 보유 거래와 부분 보유 거래를 메시지를 나눠 공지하는 방식을 택했습니다.
프로바이더와 샘플러 역할
알려지지 않은 타입 3 거래 해시를 받으면 노드는 p = 0.15 확률로 프로바이더, 아니면 샘플러가 됩니다. 이 결정은 일정 기간 기억할 수 있고 시간 값과 거래의 안정적 속성을 섞어 해시하는 무상태 휴리스틱이 권장됩니다. 프로바이더는 전체 보유를 알린 피어에게 GetPooledTransactions와 all-ones cell_mask의 GetCells로 전체를 요청하고 EIP-7594에 따라 검증한 뒤 all-ones cell_mask로 재공지해야 합니다(MUST). 샘플러는 거래 본문만 받고 2개 이상의 프로바이더 공지를 관찰한 뒤 보유가 겹치는 피어에게 커스터디 정렬 셀을 요청합니다. 프로바이더에게 요청할 때는 커스터디 외에 랜덤 열 C_extra = 1개를 추가로 요청해야 합니다. 샘플러는 일정 기간 충분한 네트워크 포화를 관찰하지 못한 거래를 버릴 수 있고 오래된 거래는 재샘플링으로 가용성을 재확인할 수 있습니다. 피어별 전체 요청 빈도를 기록해 공정성 휴리스틱을 넘는 피어를 끊는 것은 각 구현의 재량입니다.
파라미터 선택과 신뢰성 분석
핵심 파라미터는 p = 0.15, 기본 피어셋 D = 50, 노드당 최소 SAMPLES_PER_SLOT = 8열, 재구성 임계 64셀, 샘플링 전 최소 프로바이더 관찰 2개, C_extra = 1입니다. 평균 대역폭은 0.15 + 0.85/8 ≈ 0.25로 약 4배 절감입니다. 이항분포 분석(X~Binomial(D, p))에 따르면 D = 50에서 전체 페이로드를 가진 이웃이 3개 이상일 확률은 98.6%, 완전 비가용 확률은 0.03%입니다. 1차 신뢰성이 실패해도 2차 신뢰성이 있습니다. 샘플러들이 가진 열을 모아 Reed-Solomon 복호로 재구성하는 경로로, 프로바이더 3개가 모두 응답에 실패한 적대 시나리오에서도 47개 샘플러가 기대값 124.3개의 서로 다른 열을 제공해 P(Y ≥ 64)가 99.9%를 넘습니다. 재구성에 합리적 확률(>80%)을 얻으려면 샘플러 약 10개가 필요합니다.
블록 빌더와 슈퍼노드
로컬 블록 빌더는 기본적으로 항상 eager mode로 동작해야 합니다(SHOULD). 포함하려는 모든 타입 3 거래에 대해 p = 1.0 프로바이더로 행동해 전체 블롭 데이터를 확보하고 페이로드의 모든 거래에 대해 완전한 블롭 데이터를 보장합니다. p = 0.15로 있다가 블록 생성 2~3슬롯 전에 eager mode로 전환하는 선택지도 있지만(MAY) 네트워킹 행동에 뚜렷한 패턴이 생겨 빌더의 프라이버시를 해치고 DoS 공격 위험을 키우므로 권장하지 않습니다. 모든 블롭을 전체로 받으려는 슈퍼노드는 요청을 샘플러와 프로바이더에 분산해야 하고(MUST) 64개 열로부터 블롭과 증명을 재구성하는 것을 우선해야 하며(SHOULD) 소수 이웃에 부담을 집중시키지 않도록 더 큰 피어셋을 유지해야 합니다(SHOULD).
엔진 API 확장
engine_forkchoiceUpdatedV4에 선택적 custodyColumns 파라미터를 추가합니다. 16바이트 값을 CELLS_PER_EXT_BLOB 길이 비트배열로 해석해 CL의 현재 커스터디 열 집합을 EL에 알리며 제공할 수 없으면 null입니다(타임아웃 8초). CL은 시작 후, 커스터디 변경 시, 연결 중단·재연결 후에 값을 보내야 합니다(MUST). 커스터디가 확장되면 EL은 늘어난 열에 대해 새 샘플링 요청을 발행해야 하고(MUST) 샘플러로서 갱신된 공지를 브로드캐스트해야 합니다(SHOULD). 축소되면 갱신 공지를 먼저 보낸 뒤에만 셀을 정리할 수 있습니다(MAY). 동일한 값이나 null은 블롭풀 상태에 대해 no-op입니다. engine_getBlobsV4는 versioned_blob_hashes와 indices_bitarray(uint128)를 받아 500ms 타임아웃으로 BlobCellsAndProofsV1 배열을 반환합니다. blob_cells는 요청된 블롭들의 부분 행렬로 누락 셀은 nil이며 proofs는 EIP-4844에 정의된 48바이트 KZGProof 배열입니다.
위협 모델과 샘플링 노이즈
위협 모델은 시빌 공격이 자유로운 무허가 환경을 가정합니다. 주요 시나리오는 네 가지입니다. 일부만 공개한 거래로 멤풀 자원을 소모시키는 DoS는 전체 페이로드를 요청하는 노드가 탐지할 수 있습니다. 특정 L2의 거래 데이터를 선별적으로 보류하는 공격은 크고 다양한 피어셋으로 완화합니다. 이클립스 공격은 연결의 주기적 교체와 이웃의 전체 공지율 추적으로, 프리라이더는 요청 대 공지 비율 추적과 차단으로 완화합니다. 커스터디 정렬 샘플링은 요청 패턴이 예측 가능해, 피해자가 샘플링할 소수의 열만 저장한 채 프로바이더를 사칭하는 공격이 가능합니다. 이를 막기 위해 프로바이더에게 요청할 때 랜덤 열을 최소 1개 추가하는 샘플링 노이즈를 도입했고 이 열을 못 주는 것은 강한 부정행위 신호로 해석합니다. 요청당 오버헤드는 약 12KiB로 미미합니다. 요청 대 공지 비율을 통계적으로 추적하는 규범적 피어 스코어링은 경직성을 이유로 표준화에서 제외하고 각 구현의 로컬 휴리스틱에 맡겼습니다.
상태와 배포 경로
이 EIP는 Last Call 상태이고 last-call-deadline은 2026-11-01입니다. 합의 규칙을 바꾸지 않아 하드포크가 엄밀히 필요하지는 않지만 하드포크 맥락에서 배포하는 것이 권장됩니다(RECOMMENDED). 와이어 프로토콜은 다중 버전 공존이 가능해 eth/71을 쓰는 구형 클라이언트가 즉시 깨지지는 않습니다. 코어 개발자 콜에서는 07.27 ACDT #89에서 이 EIP의 엔진 API 변경(GetBlobsV4, 커스터디 컬럼을 담은 FCU)을 데브넷8에 넣기로 합의했고 셀 단위 DAS는 대역폭이 될 때까지 미루기로 했습니다. 08.06 ACDC #184에서 데브넷8 포함을 확정했고 08.10 ACDT #91에서 반대 없이 데브넷 8 의무 사항으로 확정해 모든 클라이언트가 구현해야 데브넷 8에 참여할 수 있습니다. 원문에는 추가 위협 모델링과 RBF(replace-by-fee) 영향이 미해결 사항으로, Test Cases는 TBD로 남아 있고 cell_mask의 표현력 한계도 TODO로 명시돼 있습니다.