메인 콘텐츠로 건너뛰기
Change page

EVM용 연산 부호

페이지 마지막 업데이트됨: 2025년 9월 11일

개요

wolflo/evm-opcodes (opens in a new tab)에 있는 EVM 참조 페이지의 업데이트된 버전입니다. 또한 옐로페이퍼 (opens in a new tab), 젤로페이퍼 (opens in a new tab), geth (opens in a new tab) 구현을 참고했습니다. 이 문서는 이해하기 쉬운 참조 자료로 만들어졌지만, 특별히 엄격하지는 않습니다. 정확성을 확인하고 모든 에지 케이스를 인지하고 싶다면, 젤로페이퍼 또는 클라이언트 구현을 사용하는 것이 좋습니다.

상호작용형 참조 자료를 찾고 계신가요? evm.codes (opens in a new tab)를 확인해 보세요.

동적 가스 비용이 드는 연산에 대해서는 gas.md (opens in a new tab)를 참조하세요.

💡 빠른 팁: 전체 라인을 보려면, 데스크톱에서 [shift] + 스크롤을 사용하여 가로로 스크롤하세요.

스택이름가스초기 스택결과 스택메모리 / 스토리지참고사항
00STOP0실행 중단
01ADD3a, ba + b(u)int256 덧셈(모듈로 2**256)
02MUL5a, ba * b(u)int256 곱셈(모듈로 2**256)
03SUB3a, ba - b(u)int256 뺄셈(모듈로 2**256)
04DIV5a, ba // buint256 나눗셈
05SDIV5a, ba // bint256 나눗셈
06MOD5a, ba % buint256 모듈로
07SMOD5a, ba % bint256 모듈로
08ADDMOD8a, b, N(a + b) % N(u)int256 덧셈(모듈로 N)
09MULMOD8a, b, N(a * b) % N(u)int256 곱셈(모듈로 N)
0AEXPA1 (opens in a new tab)a, ba ** buint256 거듭제곱(모듈로 2**256)
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)x(b+1) 바이트에서 32바이트로 부호 확장 (opens in a new tab)
0C-0F유효하지 않음
10LT3a, ba < buint256 보다 작음
11GT3a, ba > buint256 보다 큼
12SLT3a, ba < bint256 보다 작음
13SGT3a, ba > bint256 보다 큼
14EQ3a, ba == b(u)int256 같음
15ISZERO3aa == 0(u)int256이 0인지 확인
16AND3a, ba && b비트 AND
17OR3a, b`a \\b`
18XOR3a, ba ^ b비트 XOR
19NOT3a~a비트 NOT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFF왼쪽부터 (u)int256 xi번째 바이트
1BSHL3shift, valval << shift왼쪽으로 시프트
1CSHR3shift, valval >> shift논리적 오른쪽 시프트
1DSAR3shift, valval >> shift산술적 오른쪽 시프트
1E-1F유효하지 않음
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2F유효하지 않음
30ADDRESS2.address(this)실행 중인 컨트랙트의 주소
31BALANCEA5 (opens in a new tab)addraddr.balance잔액, wei 단위
32ORIGIN2.tx.origin트랜잭션을 시작한 주소
33CALLER2.msg.sender메시지 발신자의 주소
34CALLVALUE2.msg.value메시지 값, wei 단위
35CALLDATALOAD3idxmsg.data[idx:idx+32]인덱스 idx에서 메시지 데이터 워드 읽기
36CALLDATASIZE2.len(msg.data)메시지 데이터의 길이, 바이트 단위
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]메시지 데이터 복사
38CODESIZE2.len(this.code)실행 중인 컨트랙트 코드의 길이, 바이트 단위
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]실행 중인 컨트랙트의 바이트코드 복사
3AGASPRICE2.tx.gasprice트랜잭션의 가스 가격, 가스 단위당 wei ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)addr에 있는 코드 크기, 바이트 단위
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]addr에서 코드 복사
3DRETURNDATASIZE2.size마지막 외부 호출에서 반환된 데이터의 크기, 바이트 단위
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]마지막 외부 호출에서 반환된 데이터 복사
3FEXTCODEHASHA5 (opens in a new tab)addrhash해시 = addr이 존재하는 경우 ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbase현재 블록 제안자의 주소
42TIMESTAMP2.block.timestamp현재 블록의 타임스탬프
43NUMBER2.block.number현재 블록의 번호
44PREVRANDAO2.랜덤성 비콘랜덤성 비콘
45GASLIMIT2.block.gaslimit현재 블록의 가스 한도
46CHAINID2.chain_id현재 체인 ID (opens in a new tab)를 스택에 푸시
47SELFBALANCE5.address(this).balance실행 중인 컨트랙트의 잔액, wei 단위
48BASEFEE2.block.basefee현재 블록의 기본 수수료
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefee현재 블록의 블롭 기본 수수료 (EIP-7516 (opens in a new tab))
4B-4F유효하지 않음
50POP2_anon.스택 맨 위에서 항목을 제거하고 폐기
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]오프셋 ost의 메모리에서 워드 읽기
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := val메모리에 워드 쓰기
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFF메모리에 단일 바이트 쓰기
54SLOADA6 (opens in a new tab)keystorage[key]스토리지에서 워드 읽기
55SSTOREA7 (opens in a new tab)key, val.storage[key] := val스토리지에 워드 쓰기
56JUMP8dst.$pc := dstdst가 유효한 점프 대상인 경우에만 pc가 할당됨을 표시
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1`
58PC2.$pc프로그램 카운터
59MSIZE2.len(mem)현재 실행 컨텍스트의 메모리 크기, 바이트 단위
5AGAS2.gasRemaining
5BJUMPDEST1유효한 점프 대상 표시유효한 점프 대상(예: 푸시 데이터 내부에 있지 않은 점프 대상)
5CTLOAD100keytstorage[key]임시 스토리지에서 워드 읽기 (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := val임시 스토리지에 워드 쓰기 (EIP-1153 (opens in a new tab))
5EMCOPY3+3*words+A0 (opens in a new tab)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]한 영역에서 다른 영역으로 메모리 복사 (EIP-5656 (opens in a new tab))
5FPUSH02.uint8상수 값 0을 스택에 푸시
60PUSH13.uint81바이트 값을 스택에 푸시
61PUSH23.uint162바이트 값을 스택에 푸시
62PUSH33.uint243바이트 값을 스택에 푸시
63PUSH43.uint324바이트 값을 스택에 푸시
64PUSH53.uint405바이트 값을 스택에 푸시
65PUSH63.uint486바이트 값을 스택에 푸시
66PUSH73.uint567바이트 값을 스택에 푸시
67PUSH83.uint648바이트 값을 스택에 푸시
68PUSH93.uint729바이트 값을 스택에 푸시
69PUSH103.uint8010바이트 값을 스택에 푸시
6APUSH113.uint8811바이트 값을 스택에 푸시
6BPUSH123.uint9612바이트 값을 스택에 푸시
6CPUSH133.uint10413바이트 값을 스택에 푸시
6DPUSH143.uint11214바이트 값을 스택에 푸시
6EPUSH153.uint12015바이트 값을 스택에 푸시
6FPUSH163.uint12816바이트 값을 스택에 푸시
70PUSH173.uint13617바이트 값을 스택에 푸시
71PUSH183.uint14418바이트 값을 스택에 푸시
72PUSH193.uint15219바이트 값을 스택에 푸시
73PUSH203.uint16020바이트 값을 스택에 푸시
74PUSH213.uint16821바이트 값을 스택에 푸시
75PUSH223.uint17622바이트 값을 스택에 푸시
76PUSH233.uint18423바이트 값을 스택에 푸시
77PUSH243.uint19224바이트 값을 스택에 푸시
78PUSH253.uint20025바이트 값을 스택에 푸시
79PUSH263.uint20826바이트 값을 스택에 푸시
7APUSH273.uint21627바이트 값을 스택에 푸시
7BPUSH283.uint22428바이트 값을 스택에 푸시
7CPUSH293.uint23229바이트 값을 스택에 푸시
7DPUSH303.uint24030바이트 값을 스택에 푸시
7EPUSH313.uint24831바이트 값을 스택에 푸시
7FPUSH323.uint25632바이트 값을 스택에 푸시
80DUP13aa, a스택의 첫 번째 값 복제
81DUP23_, aa, _, a스택의 두 번째 값 복제
82DUP33_, _, aa, _, _, a스택의 세 번째 값 복제
83DUP43_, _, _, aa, _, _, _, a스택의 네 번째 값 복제
84DUP53..., aa, ..., a스택의 다섯 번째 값 복제
85DUP63..., aa, ..., a스택의 여섯 번째 값 복제
86DUP73..., aa, ..., a스택의 일곱 번째 값 복제
87DUP83..., aa, ..., a스택의 여덟 번째 값 복제
88DUP93..., aa, ..., a스택의 아홉 번째 값 복제
89DUP103..., aa, ..., a스택의 열 번째 값 복제
8ADUP113..., aa, ..., a스택의 열한 번째 값 복제
8BDUP123..., aa, ..., a스택의 열두 번째 값 복제
8CDUP133..., aa, ..., a스택의 열세 번째 값 복제
8DDUP143..., aa, ..., a스택의 열네 번째 값 복제
8EDUP153..., aa, ..., a스택의 열다섯 번째 값 복제
8FDUP163..., aa, ..., a스택의 열여섯 번째 값 복제
90SWAP13a, bb, a
91SWAP23a, _, bb, _, a
92SWAP33a, _, _, bb, _, _, a
93SWAP43a, _, _, _, bb, _, _, _, a
94SWAP53a, ..., bb, ..., a
95SWAP63a, ..., bb, ..., a
96SWAP73a, ..., bb, ..., a
97SWAP83a, ..., bb, ..., a
98SWAP93a, ..., bb, ..., a
99SWAP103a, ..., bb, ..., a
9ASWAP113a, ..., bb, ..., a
9BSWAP123a, ..., bb, ..., a
9CSWAP133a, ..., bb, ..., a
9DSWAP143a, ..., bb, ..., a
9ESWAP153a, ..., bb, ..., a
9FSWAP163a, ..., bb, ..., a
A0LOG0A8 (opens in a new tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (opens in a new tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (opens in a new tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (opens in a new tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (opens in a new tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EF유효하지 않음
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([주소(this), this.nonce]))
F1CALLAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataDELEGATECALL과 동일하지만, 원래의 msg.sender와 msg.value는 전파하지 않습니다.
F3RETURN0* (opens in a new tab)ost, len.mem[ost:ost+len-1] 반환
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (opens in a new tab)val, ost, len, saltaddraddr = keccak256(0xff ++ 주소(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9유효하지 않음
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FC유효하지 않음
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)지정된 유효하지 않은 연산 부호 - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.모든 ETH를 addr로 보냅니다. 컨트랙트가 생성된 것과 동일한 트랜잭션에서 실행되면 해당 컨트랙트를 파기합니다.

이 문서가 도움이 되셨나요?