EIP-3855는 이더리움 개선 제안으로, Shapella 업그레이드의 상하이 하드 포크의 일부로 이더리움(https://iq.wiki/wiki/ethereum) 가상 머신(EVM)에 PUSH0(0x5f)라는 새로운 명령어를 추가하는 것을 제안합니다. 이 명령어는 스택에 상수 0을 푸시해야 하는 계약의 가스 비용과 스토리지 비용을 줄이는 데 목적이 있습니다. [1]
2021년 2월 19일, 계약 코드 크기 감소, 다른 명령어의 계약 오용 위험 감소, 0의 복제를 위한 DUP 명령어 사용 필요성 감소를 목표로 PUSH0를 도입하기 위해 EIP-3855가 만들어졌습니다. 현재 개발자는 PC, MSIZE, CALLDATASIZE, RETURNDATASIZE, CODESIZE, CALLVALUE, SELFBALANCE와 같은 다른 명령어를 사용하여 이 효과를 얻을 수 있지만, 이러한 명령어는 비용이 다르며 컨텍스트에 따라 달라질 수 있습니다. 또한 기존 계정에서 현재 PUSH1 00 명령어로 인해 발생하는 낭비는 340,557,331바이트이며, 이는 배포에 68,111,466,200 가스가 소모됨을 의미합니다. 이 제안은 다른 주요 목표와 함께 이러한 중복성을 줄이려는 것입니다. [1][2]
PUSH0 명령어는 즉시 데이터가 없으며, 스택에서 항목을 팝하지 않고 값이 0인 단일 항목을 스택에 배치합니다. 가스 비용은 2이며, ADDRESS 및 ORIGIN과 같이 스택에 상수 값을 배치하는 다른 명령어와 동일합니다. PUSH0의 opcode는 0x5f이며, 이는 다른 PUSH 구현과 "연속적인" 공간에 있고 구현을 공유할 수 있음을 의미합니다. [2][3]
메인넷에 대한 분석에 따르면 실행된 모든 PUSH* 명령어의 약 11.5%가 0 값을 푸시하며, PUSH1로 상수 0을 푸시하는 데 드는 가스 및 스토리지 비용의 낭비가 상당합니다. [2]
PUSH0를 도입함으로써 발생할 수 있는 한 가지 문제는 이미 배포된 계약이 이 EIP 이후에 동작이 변경될 수 있다는 것입니다. 그러나 작성자는 보안에 대한 영향을 인지하지 못하고 있으며, PUSH0에는 즉시 데이터 바이트가 없으므로 jumpdest 분석에는 영향을 미치지 않습니다. [1]
[3}