EIP-1052 EXTCODEHASH 옵코드 (EXTCODEHASH opcode)

최종 확정 · EVM·실행 · 원문 상태 Final · 2018-05-02 작성

컨트랙트 코드의 keccak256 해시를 바로 돌려주는 새 명령어 EXTCODEHASH(0x3f)를 추가합니다. 코드 전체를 복사하지 않고도 싼 비용으로 상대 코드를 확인할 수 있습니다.

왜 필요한가

컨트랙트가 다른 컨트랙트를 믿고 호출하려면 그 주소에 어떤 코드가 들어 있는지 확인해야 할 때가 있습니다. 예를 들어 상대 코드가 미리 허용한 구현 목록 중 하나인지 검사하거나, 코드 분석을 통과한 것과 같은 코드를 가진 컨트랙트를 자동으로 승인하는 식입니다. 그런데 이 EIP 이전에는 이런 확인을 하려면 EXTCODECOPY라는 명령어로 상대 코드 전체를 복사해 와야 했습니다. 실제로는 코드의 지문에 해당하는 해시값만 필요한데도, 코드가 클수록 복사 비용이 커져 가스(연산 수수료 계산 단위)를 낭비하게 됩니다. 이 EIP는 코드 전체 대신 keccak256 해시만 바로 돌려주는 새 명령어 EXTCODEHASH를 추가해 이 낭비를 없앱니다.

무엇이 바뀌나

지금

EIP-1052 이후

누구에게 영향이 있나

심층 설명

명령어 정의와 동작

새 옵코드 EXTCODEHASH는 번호 0x3f를 씁니다. 스택에서 인자 하나를 꺼내 앞 96비트를 0으로 만든 뒤, 남은 160비트를 주소로 해석해 그 주소 계정 코드의 keccak256 해시를 스택에 올립니다. 코드 자체가 아니라 해시만 돌려주므로, 코드 동일성 검사나 존재 확인처럼 해시만으로 충분한 용도에 맞습니다.

계정 상태에 따른 세 가지 반환값

계정이 존재하지 않거나 EIP-161 기준으로 빈 계정이면 0을 올립니다. 계정은 존재하지만 코드가 없으면 빈 데이터의 keccak256 해시인 c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470을 올립니다. 코드가 있으면 그 코드의 해시를 올립니다. 코드 없는 계정과 존재하지 않는 계정을 구분하는 이 설계는 상태 트라이에서 계정을 표현하는 방식과 일치합니다. 덕분에 스마트 컨트랙트가 어떤 계정의 존재 여부를 확인하는 용도로도 쓸 수 있습니다.

가스 비용 400과 그 근거

EXTCODEHASH의 가스 비용은 400입니다. 실행에 필요한 작업이 BALANCE 옵코드와 같은 계정 조회이기 때문에 BALANCE와 같은 비용으로 정했습니다. EXTCODECOPY로 코드 전체를 복사할 때처럼 코드 크기에 비례해 비용이 늘지 않으므로, 큰 컨트랙트의 코드를 확인할 때 특히 가스가 절약됩니다.

주소 인자 해석 규칙

스택 인자의 마지막 20바이트만 의미가 있고 앞 12바이트는 무시합니다. 이는 BALANCE(0x31), EXTCODESIZE(0x3b), EXTCODECOPY(0x3c)가 주소를 다루는 방식과 같습니다. 테스트 케이스도 주소 A의 EXTCODEHASH가 X라면 A + 2**160의 EXTCODEHASH도 X여야 한다고 명시해 이 규칙을 확인합니다.

테스트 케이스가 다루는 경계 상황

원문은 10가지 테스트 케이스를 제시합니다. 코드 없는 계정은 빈 데이터 해시 c5d246...을, 존재하지 않는 계정은 0을 돌려줘야 합니다. 프리컴파일 컨트랙트는 c5d246... 또는 0입니다. 그 밖에 현재 트랜잭션에서 selfdestruct된 계정, selfdestruct가 revert된 계정, 현재 트랜잭션에서 생성된 계정, 생성이 revert된 계정, 처음에는 존재하지 않다가 나중에 빈 계정이 된 경우, 상태 정리 규칙으로 지워질 빈 계정 같은 경계 상황을 다룹니다.

호환성과 명세 상태

기존에 없던 새 옵코드를 추가하는 것이므로 하위 호환성 문제는 없습니다. 원문 상태는 Final로, 명세가 확정되어 더 바뀌지 않습니다.

EIP 원문 · ← EIPs