EIP-7594 피어 데이터 가용성 샘플링(PeerDAS) (PeerDAS - Peer Data Availability Sampling)

최종 확정 · 확장성·데이터 · 원문 상태 Final · 2024-01-12 작성

노드가 블롭 데이터 전체를 내려받지 않고 일부만 추출해 확인해도 데이터가 실제로 공개됐다고 확신할 수 있게 하는 네트워킹 프로토콜입니다. 블롭 전파·보관·샘플링 방식을 새로 정의합니다.

왜 필요한가

이더리움 위에서 돌아가는 롤업(layer 2 roll-up)의 가장 큰 병목은 레이어 1의 데이터 가용성, 즉 블롭(blob) 데이터를 얼마나 많이 실어 나를 수 있느냐입니다. EIP-4844가 블롭을 도입했지만 지금 구조에서는 모든 노드가 블롭 데이터 전체를 내려받아야 그 데이터가 네트워크에 공개됐는지 확인할 수 있습니다. 이 상태에서 블롭 수를 늘리면 모든 노드의 대역폭과 저장 부담이 함께 늘어나 탈중앙성이 약해집니다. PeerDAS는 각 노드가 전체 데이터 중 일부만 내려받아 표본 검사하는 데이터 가용성 샘플링(DAS)으로 이 문제를 풉니다. 노드마다 무작위에 가까운 방식으로 서로 다른 조각을 확인하므로, 네트워크 전체로 보면 모든 데이터가 공개됐는지 검증하면서도 개별 노드의 부담은 작게 유지할 수 있습니다.

무엇이 바뀌나

지금

EIP-7594 이후

누구에게 영향이 있나

심층 설명

블롭을 소거 부호로 확장한 행·셀·열 구조

EIP-4844의 블롭을 1차원 소거 부호(erasure coding)로 확장합니다. 각 행(row)은 블롭 데이터와 그 소거 부호로 구성되고 행은 셀(cell)로 나뉩니다. 셀은 해당 블롭의 KZG 커밋먼트로 인증할 수 있는 최소 단위입니다. 열(column)은 특정 인덱스에 대해 모든 행의 셀을 모은 단면이며 각 열은 특정 가십 서브넷에 대응합니다. 데이터는 블롭(행) 방향이 아니라 열 방향으로 쪼개져 네트워크에 퍼집니다.

노드 ID 기반 보관과 매 슬롯 샘플링, 50% 복원

각 노드는 자기 노드 ID의 함수로 결정되는 열 서브넷 집합을 유지하고 그 데이터를 보관(custody)합니다. 노드는 다양한 피어 집합을 찾아 유지하고 매 슬롯 피어로부터 열을 샘플링해 DAS를 수행합니다. 전체 열의 50% 이상을 확보한 노드는 데이터 행렬 전체를 재구성할 수 있으며 50% 미만이면 필요한 열을 피어 노드에게 요청할 수 있습니다. 상세 명세는 ethereum/consensus-specs의 fulu 명세에 있습니다.

트랜잭션당 블롭 6개 제한

트랜잭션 하나에 담을 수 있는 블롭 수가 6개로 제한됩니다. 클라이언트는 블롭 트랜잭션을 검증하는 세 시점, 곧 제출 시점, 네트워크에서 수신한 시점, 블록 생산·처리 시점 모두에서 이 제한을 반드시(MUST) 적용해야 합니다. EIP-4844에는 없던 트랜잭션 단위 상한이 새로 생기는 것이므로, 블롭을 여러 개 묶어 보내는 쪽에서는 이 한도를 고려해야 합니다.

셀 KZG 증명과 멤풀 래퍼 변경

셀 KZG 증명(cell KZG proof)은 KZG 커밋먼트가 특정 인덱스의 셀로 열린다는 사실을 증명합니다. 증명 계산은 비싸고 검증은 훨씬 싸며 증명 크기는 셀에 비해 무시할 수준이므로, 블록 생산자가 아니라 블롭 트랜잭션 전송자가 증명을 계산해 멤풀 래퍼에 포함합니다. PooledTransactions 응답의 래퍼는 rlp([tx_payload_body, wrapper_version, blobs, commitments, cell_proofs])로 바뀝니다. wrapper_version은 1바이트이며 현재 버전은 1입니다. cell_proofs는 확장 인덱스를 포함해 블롭당 CELLS_PER_EXT_BLOB개의 증명을 담고, cell_proofs[i * CELLS_PER_EXT_BLOB + j]는 compute_cells(blobs[i])의 셀 j에 대한 증명입니다. 블롭 자체는 확장하지 않은 상태(블롭당 CELLS_PER_EXT_BLOB / 2 셀)로 보내는데, 확장 데이터는 수신 노드가 빠르게 계산할 수 있어 중복 전송을 피하기 위해서입니다.

수신 노드의 검증 규칙

노드는 tx_payload_body를 검증하고 래핑된 데이터를 그에 대해 확인해야(MUST) 합니다. 조건은 네 가지입니다. 첫째, tx_payload_body.blob_versioned_hashes와 blobs, commitments의 개수가 같아야 합니다. 둘째, cell_proofs는 정확히 CELLS_PER_EXT_BLOB * len(blobs)개여야 합니다. 셋째, kzg_to_versioned_hash(commitments[i]) == tx_payload_body.blob_versioned_hashes[i]가 성립해야 합니다. 넷째, commitments가 해당 blobs 및 cell_proofs와 일치해야 하는데, 이는 모든 블롭의 확장 셀을 compute_cells 등으로 계산한 뒤 모든 셀 증명을 확인하는 과정입니다. 모든 셀 증명은 verify_cell_kzg_proof_batch 등으로 한 번에 일괄 검증할 수 있습니다.

왜 행이 아니라 열로 샘플링하나

샘플은 블롭 하나 전체인 행이 아니라, 모든 블롭을 가로지르는 단면인 열로 정의됩니다. 행으로 샘플링하면 재구성이 네트워크에 처음부터 존재하지 않는 확장 블롭 위에서 이뤄져야 합니다. 열로 하면 블롭 대부분이 공개 멤풀에 있어 노드가 이미 전체 데이터의 상당 부분을 갖고 있다고 가정할 수 있어 재구성이 훨씬 수월합니다. 또 행 샘플링은 열 방향 확장을 블록 구성 시점, 즉 가장 바쁜 경로(critical path)에서 해야 하지만 열 샘플링에 필요한 행 방향 확장은 미리 해 둘 수 있고 증명 계산도 블롭 트랜잭션 전송자에게 맡길 수 있습니다.

노드 부담 1/8과 검증자의 추가 보관

현재 파라미터에서 노드는 로컬 가용성 확인을 위해 전체 데이터(블록의 블롭들)의 1/8만 내려받으면 됩니다. 샘플 크기를 줄여 열 수를 늘리면 앞으로 1/16, 1/32까지 낮출 수 있습니다. 피어를 기본 단위로 삼기 때문에 중복성이 생겨, 한 피어가 응답하지 못해도 다른 피어로 같은 샘플링을 대신할 수 있습니다. 노드가 최소 요구보다 많은 데이터를 자발적으로 보관해 전체 성능을 높이는 것도 가능합니다. 검증자에게는 풀노드보다 높은 보관 요구가 부과되며 이 요구는 검증자 수에 비례해 늘어나 자원이 많은 노드가 네트워크를 떠받치는 더 안정적인 백본에 기여하게 합니다.

데이터 보류 공격에 대한 보안 분석

DAS의 주된 실패 모드는 블록 생산자가 데이터를 내놓지 않으면서 공개된 것처럼 속이는 데이터 보류(data withholding) 공격입니다. PeerDAS는 의사난수 샘플링으로 이를 막으며 네트워크가 커질수록 공격 성공 확률이 떨어집니다. 분석에서 n은 샘플링 노드 수, m은 가능한 샘플 총수(NUMBER_OF_CUSTODY_GROUPS), k는 노드가 내려받아야 하는 최소 샘플 수(SAMPLES_PER_SLOT)입니다. 메인넷 파라미터에 노드 10,000개를 가정하면, 전체 노드의 2%(200개)를 속일 확률 상한은 10^-20.04, 3%(300개)는 10^-101.55, 5%(500개)는 10^-306.34로 급격히 떨어져, 보류 공격에 안전하다고 평가됩니다.

EIP 원문 · ← EIPs