EIP-3855는 이더리움 개선 제안으로, Shapella 업그레이드의 일부인 상하이 하드 포크의 일환으로 이더리움 가상 머신(EVM)에 PUSH0(0x5f)라는 새로운 명령어를 추가할 것을 제안합니다. 이 명령어는 스택에 상수 0을 푸시해야 하는 계약의 가스 비용과 스토리지 비용을 줄이는 데 도움이 되는 것을 목표로 합니다. [1]
2021년 2월 19일, EIP-3855는 PUSH0를 도입하여 계약 코드 크기를 줄이고, 다른 명령어의 계약 오용 위험을 낮추며, 0을 복제하기 위해 DUP 명령어를 사용할 필요성을 줄이기 위해 만들어졌습니다. 현재 개발자는 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 도입의 잠재적인 문제점 중 하나는 이 opcode를 사용하는 이미 배포된 계약이 이 EIP 이후에 동작을 변경할 수 있다는 것입니다. 그러나 작성자는 보안에 미치는 영향에 대해 알지 못하며, PUSH0에는 즉각적인 데이터 바이트가 없으므로 jumpdest 분석은 영향을 받지 않습니다. [1]