EIP-7623 콜데이터 비용 인상 (Increase calldata cost)

최종 확정 · 수수료·가스 · 원문 상태 Final · 2024-02-13 작성

데이터를 올리는 용도가 큰 거래에 콜데이터 가스 비용 하한을 새로 둬서 이론상 최대 블록 크기를 줄입니다. EVM 연산이 많은 일반 거래의 비용은 그대로입니다.

왜 필요한가

이더리움 블록이 담을 수 있는 가스 총량(블록 가스 한도)은 EIP-1559 이후 늘지 않았지만 롤업이 데이터를 이더리움에 올리면서 블록의 평균 크기는 계속 커졌습니다. 거래에 데이터를 실어 보내는 공간인 콜데이터(calldata)의 가격도 EIP-2028 이후 그대로였습니다. 그 결과 평균 블록은 100KB 정도인데 이론상 최대 블록은 7.15MB까지 커질 수 있어 격차가 큽니다. 네트워크는 항상 최악의 블록 크기에 대비해야 하므로, 이 격차가 크면 블롭(blob)을 늘리거나 블록 가스 한도를 올리기 어렵습니다. EIP-4844가 데이터 게시용으로 블롭을 도입한 지금, 데이터 위주 거래의 콜데이터 가격을 올려 최대 블록 크기와 변동 폭을 줄이자는 제안입니다.

무엇이 바뀌나

지금

EIP-7623 이후

누구에게 영향이 있나

심층 설명

토큰 단위와 두 상수

콜데이터를 바이트가 아니라 토큰 단위로 환산합니다. tokens_in_calldata = zero_bytes_in_calldata + nonzero_bytes_in_calldata * 4로, 0바이트는 1토큰, 0이 아닌 바이트는 4토큰입니다. 상수는 두 개입니다. STANDARD_TOKEN_COST는 4로 기존 가격(0바이트 4가스, 0이 아닌 바이트 16가스)에 해당하고 TOTAL_COST_FLOOR_PER_TOKEN은 10으로 하한 가격(0바이트 10가스, 0이 아닌 바이트 40가스)에 해당합니다.

새 가스 계산식: max(기존 비용, 하한)

거래의 총 가스 사용량(tx.gasUsed)은 21000 + max(STANDARD_TOKEN_COST * tokens_in_calldata + execution_gas_used + isContractCreation * (32000 + INITCODE_WORD_COST * words(calldata)), TOTAL_COST_FLOOR_PER_TOKEN * tokens_in_calldata)로 바뀝니다. execution_gas_used는 EVM 실행에 쓴 가스에서 가스 환불을 뺀 값이고 INITCODE_WORD_COST는 EIP-3860에 정의된 대로 2입니다. EVM 실행 가스가 충분히 크면 왼쪽 항이 이겨서 기존과 같고 콜데이터 비중이 압도적인 거래만 오른쪽 하한이 적용됩니다.

가스 한도 유효성 규칙

가스 한도(gas limit)가 21000 + TOTAL_COST_FLOOR_PER_TOKEN * tokens_in_calldata보다 작거나 고유 가스 비용(intrinsic gas)보다 작으면(둘 중 큰 값 기준) 그 거래는 무효입니다. 콜데이터의 하한 가격은 거래 실행 결과와 무관하게 보장돼야 하기 때문입니다. 실제 gasUsed가 이 하한보다 낮게 나오는 유효한 경우도 있지만 하한만큼은 가스 한도에 미리 확보돼 있어야 합니다.

최대 블록 크기가 얼마나 줄어드는가

현재 최대 실행 페이로드는 약 1.79MB(30_000_000/16)이고 0바이트로 채우면 7.15MB까지 만들 수 있습니다. 다만 블록은 P2P 계층에서 Snappy로 압축되므로 0바이트 위주 페이로드는 보통 1.79MB 아래로 압축되고 EIP-4844 도입으로 압축 기준 최대 블록은 약 2.54MB까지 늘었습니다. 이 EIP는 데이터 위주 거래의 콜데이터 비용을 10/40가스로 올려 최대 페이로드를 약 0.72MB(30_000_000/40)로 줄이는 것을 목표로 합니다. 다른 방식의 적대적 블록 구성은 압축되지 않는 페이로드 기준 약 1.26MiB까지 가능합니다.

지갑과 노드가 해야 할 일

이 변경은 하위 호환이 없는 가스 리프라이싱이라 예정된 네트워크 업그레이드가 필요합니다. eth_estimateGas를 쓰는 지갑은 TOTAL_COST_FLOOR_PER_TOKEN을 올바르게 반영하도록 반드시 업데이트해야 하며 그러지 않으면 가스를 적게 추정해 거래가 실패할 수 있습니다. 노드 소프트웨어의 eth_estimateGas 같은 RPC 메서드도 새 계산식을 반영해야 합니다. 사용자는 지갑과 RPC가 업데이트되면 기존 사용 방식을 바꿀 필요가 없습니다.

거래 번들링 우려와 반론

콜데이터가 많은 거래와 EVM 연산이 많은 거래를 하나로 합쳐 하한을 피하는 전략이 유리해 보일 수 있습니다. 원문은 세 가지 이유로 큰 문제가 아니라고 봅니다. 첫째, 이런 번들링은 지금도 가능하고 거래를 합치면 추가 거래당 21,000가스를 아낄 수 있으며 ERC-4337이 명시적으로 지원하는 기능입니다. 둘째, 번들링이 있어도 이 EIP의 블록 크기 축소 목표는 훼손되지 않습니다. 셋째, 실제로는 신뢰와 조율 문제 때문에 번들링이 쉽지 않습니다. 최대 블록 크기 자체가 줄어드는 변경이라 제기된 보안 우려는 없습니다.

EIP 원문 · ← EIPs