EIP-7516 블롭 기본 수수료 조회 명령어 (BLOBBASEFEE instruction)

최종 확정 · EVM·실행 · 원문 상태 Final · 2023-09-11 작성

현재 블록의 블롭(blob) 기본 수수료를 스마트 컨트랙트가 직접 읽을 수 있게 하는 EVM 명령어 BLOBBASEFEE(0x4a)를 추가합니다.

왜 필요한가

이더리움은 EIP-4844로 블롭(blob)이라는 별도 데이터 공간을 도입했습니다. 롤업 같은 서비스가 대량의 데이터를 싸게 올리는 공간인데, 이 공간의 가격인 블롭 기본 수수료는 일반 거래 수수료와 별개로 정해집니다. 그런데 스마트 컨트랙트는 이 가격을 체인 위에서 직접 읽을 방법이 없었습니다. 그래서 롤업 컨트랙트가 블롭 데이터 사용 비용을 신뢰 없이(trustlessly) 정산하기 어려웠고 블롭 가격 변동을 완만하게 만들어 주는 블롭 가스 선물 같은 상품도 만들기 어려웠습니다. 일반 거래의 기본 수수료는 이미 BASEFEE 명령어(EIP-3198)로 읽을 수 있습니다. 이 EIP는 그와 똑같은 방식으로 블롭 기본 수수료를 읽는 명령어를 EVM에 추가해 이 공백을 메웁니다.

무엇이 바뀌나

지금

EIP-7516 이후

누구에게 영향이 있나

심층 설명

명령어 사양: 옵코드 0x4a, 입력 0, 출력 1, 가스 2

옵코드 0x4a에 BLOBBASEFEE 명령어를 추가합니다. 스택에서 가져가는 입력은 0개, 스택에 올리는 출력은 1개, 가스 비용은 2입니다. 동작 구조는 EIP-3198의 BASEFEE 옵코드와 동일하며 일반 기본 수수료 대신 EIP-4844가 정의한 블롭 기본 수수료를 반환한다는 점만 다릅니다. 반환하는 값은 명령어가 실행되고 있는 현재 블록 기준의 블롭 기본 수수료입니다.

반환값은 EIP-4844의 get_blob_gasprice(header)

BLOBBASEFEE가 스택에 올리는 값은 EIP-4844의 Gas accounting 절에 정의된 get_blob_gasprice(header) -> int 함수를 현재 블록 헤더에 적용한 결과입니다. 별도의 계산 규칙을 새로 만들지 않고 EIP-4844가 이미 정의한 블롭 가스 가격 함수를 그대로 가져다 쓰기 때문에, 블롭 트랜잭션 처리에 쓰이는 가격과 컨트랙트가 읽는 가격이 항상 같습니다. 원문 Motivation은 이 값을 바탕으로 롤업 컨트랙트가 블롭 데이터 비용을 신뢰 없이 정산하거나 블롭 가스 선물을 구현하는 용례를 듭니다.

가스 비용 2의 근거

블롭 기본 수수료는 블롭 트랜잭션을 처리하는 데 필요한 값이라 EVM 코드를 실행하기 전에 이미 준비되어 있습니다. 이 명령어는 헤더에 있는 값을 그대로 노출할 뿐 추가 복잡성이나 별도의 읽기·쓰기 작업을 만들지 않습니다. 그래서 가스 비용을 2로 정했고 이는 같은 성격의 명령어인 EIP-3198 BASEFEE 옵코드의 비용과도 동일합니다.

테스트 케이스

대표 케이스는 이렇습니다. 현재 블록 헤더에 get_blob_gasprice(header)를 적용한 결과가 7 wei라면, BLOBBASEFEE는 7을 왼쪽을 0으로 채운 32바이트 값으로 스택에 올려야 합니다. 바이트코드 0x4a00(BLOBBASEFEE, STOP)을 실행하면 출력은 0x이고 소모 가스는 2입니다. 전체 테스트 묶음은 ethereum/execution-spec-tests 저장소의 tests/cancun/eip7516_blobgasfee/test_blobgasfee_opcode.py에 있습니다.

호환성·보안·상태

이 명령어로 인한 하위 호환성 문제는 알려진 것이 없습니다. 보안 측면에서도 블롭 기본 수수료는 민감한 정보가 아니고 블록 헤더에 공개되어 있는 값이라, 알려진 보안 영향이 없습니다. 이 EIP의 상태는 Final로 명세가 확정되었고 테스트 묶음이 execution-spec-tests의 cancun 디렉터리에 들어 있습니다. EIP-3198과 EIP-4844를 전제 조건(requires)으로 둡니다.

EIP 원문 · ← EIPs