EIP-3198 BASEFEE 명령어 추가 (BASEFEE opcode)

최종 확정 · EVM·실행 · 원문 상태 Final · 2021-01-13 작성

스마트 컨트랙트가 지금 실행 중인 블록의 기본 수수료(base fee) 값을 읽을 수 있도록 EVM에 BASEFEE(0x48) 명령어를 추가합니다.

왜 필요한가

EIP-1559가 도입한 기본 수수료는 블록마다 정해지는 최소 수수료입니다. 이 값은 블록 헤더에 공개되어 있지만 블록 안에서 돌아가는 스마트 컨트랙트가 직접 읽을 방법은 없었습니다. 그래서 수수료 시세에 맞춰 움직여야 하는 컨트랙트가 불리했습니다. 예를 들어 누군가 트랜잭션을 보내 컨트랙트를 깨워 주면 보상을 주는 구조에서는, 보상이 고정돼 있으면 수수료가 비싼 시기에 아무도 트랜잭션을 보내지 않을 수도 있습니다. 컨트랙트가 기본 수수료를 읽을 수 있으면 보상을 기본 수수료에 연동해 어떤 시세에서도 충분한 금액을 보장할 수 있습니다. 가스 선물 같은 금융 상품을 더 정확하게 만들 수 있고 사기 증명(fraud proof)에 의존하는 상태 채널이나 롤업은 수수료가 비쌀 때 이의 제기 기간을 자동으로 늘려 보안을 높일 수 있습니다.

무엇이 바뀌나

지금

EIP-3198 이후

누구에게 영향이 있나

심층 설명

명령어 명세: 0x48, 입력 0개, 출력 1개

BASEFEE 명령어를 0x48 자리에 추가합니다. 스택에서 가져가는 입력은 0개, 스택에 올리는 출력은 1개이며 출력 값은 현재 실행 중인 블록의 base fee입니다. 가스 비용은 G_base, 즉 2입니다. 테스트 케이스 기준으로 값은 left padded byte32 형태로 스택에 올라갑니다.

가스 비용을 G_base(2)로 정한 근거

base fee 값은 트랜잭션을 처리하는 데 필요한 값이라서 EVM 코드가 실행되기 전에 이미 준비되어 있습니다. 이 명령어는 추가 복잡성이나 별도의 읽기·쓰기 작업을 만들지 않습니다. 그래서 ADDRESS, ORIGIN처럼 환경 값을 읽는 가장 싼 등급인 G_base 가스 비용을 선택했습니다.

의도된 활용 사례 세 가지

첫째, 외부에서 트랜잭션으로 자신을 깨워 주기를 기다리는 컨트랙트가 보상을 BASEFEE + x 또는 BASEFEE * (1 + x)로 설정할 수 있습니다. 시장 상황과 무관하게 항상 충분한 금액을 지불하므로 메커니즘이 더 신뢰할 만해집니다. 둘째, base fee를 기준으로 가스 선물(gas futures)을 구현할 수 있으며 이는 가스토큰보다 정밀합니다. 셋째, 상태 채널, 플라즈마, 옵티롤 같은 사기 증명 기반 솔루션이 BASEFEE를 입력으로 받아, base fee가 높은 것을 확인하면 이의 제기 기간을 자동으로 늘려 보안을 높일 수 있습니다.

테스트 케이스: 바이트코드 0x4800

현재 블록 base fee가 7 wei일 때, 바이트코드 0x4800(BASEFEE, STOP)을 실행하면 BASEFEE가 가스 2를 소비하며 7을 left padded byte32로 스택에 올리고 STOP이 가스 0으로 종료합니다. 최종 스택은 [7], 출력은 0x, 총 소비 가스는 2입니다.

하위 호환성과 보안

알려진 하위 호환성 문제는 없습니다. base fee 값은 민감한 정보가 아니고 블록 헤더에 공개되어 있으므로, 이 명령어로 인한 알려진 보안 영향도 없습니다. 이 EIP는 Final 상태로 명세가 확정되었으며 EIP-1559를 전제 조건(requires)으로 둡니다.

EIP 원문 · ← EIPs