L / R 오퍼코드를 통한 구조화된 스킵 영역
추상적인
이는 바이트코드에서 구조화된 건너뛰기 영역을 정의하는 두 가지 새로운 이더리움 가상 머신(EVM) 오퍼코드인 L (왼쪽 구분자) 과 R (오른쪽 구분자) 을 도입합니다.
L 이 실행되면 이더리움 가상 머신(EVM) 내부에 포함된 바이트를 실행하지 않고 해당 R 로 건너뜁니다. 이러한 영역을 통해 계약은 결정론적 실행을 유지하면서 실행 불가능한 구조화된 데이터를 바이트코드 내부에 직접 포함할 수 있습니다.
동기 부여
현재 이더리움 가상 머신(EVM) 바이트코드에는 다음과 같은 사항을 구분할 수 있는 기본 기능이 없습니다.
- 실행 가능한 지침
- 내장된 메타데이터
- 컴파일러 테이블
- 구조화된 상수
- 오프체인 도구 전용으로 설계된 대체 코드 경로
모든 바이트는 잠재적으로 실행 가능한 명령어로 취급되며, 코드를 건너뛰는 유일한 방법은 동적 점프를 이용하는 것입니다.
이로 인해 문제가 발생합니다:
- 컴파일러는 구조화된 데이터를 바이트코드에 안전하게 포함시킬 수 없습니다.
- 정적 도구는 모든 바이트를 실행 가능한 것으로 보수적으로 처리해야 합니다.
- 바이트코드는 의도치 않은 실행의 위험 없이 복잡한 내부 구조를 담을 수 없습니다.
- 제어 흐름은 비구조화된 점프를 사용하여 표현해야 합니다.
본 논문에서는 바이트코드 내에서 실행되지 않는 영역 처럼 동작하는 구조화된 스킵 영역을 제안합니다.
이 영역들은 바이트코드가 안전하게 다음을 포함할 수 있도록 합니다:
- 조회 테이블
- 점프 테이블
- 유형 메타데이터
- ABI 유사 내부 설명자
- 컴파일러 힌트
- 향후 확장 페이로드
실행에는 영향을 미치지 않습니다.
사양
새로운 Opcodes
| Opcode | 이름 | 스택 | 설명 |
|---|---|---|---|
0x?? | L | — | 영역 건너뛰기 시작 |
0x?? | R | — | 끝 건너뛰기 영역 |
의미론
1. L — R 과 일치하도록 건너뛰기
이더리움 가상 머신(EVM) opcode L 을 실행할 때:
- 건너 뛰기 모드 로 들어갑니다
- 바이트코드를 앞으로 스캔하여 일치하는
R찾습니다. - 그 사이의 모든 바이트는 무시되고 실행되지 않습니다.
- 중첩된
L/R쌍은 균형을 이루어야 합니다.
매칭 알고리즘
depth = 1pc = pc + 1while depth > 0:opcode = code[pc]if opcode == L:depth += 1 else if opcode == R:depth -= 1pc += 1 2. R — 구조적 구분자
일치하는 R 이후의 첫 번째 opcode에서 실행이 재개됩니다.
일치하는 R 찾을 수 없는 경우 → 예외적으로 종료됩니다.
구조적 규칙
1. 해당 영역은 실행 불가능합니다.
L … R 영역 내부의 바이트:
- 절대 실행되어서는 안 된다.
- 불투명한 탑재체 로 취급됩니다.
- 유효하지 않은 명령어 코드를 포함하여 임의의 바이트 값을 포함할 수 있습니다.
2. 지역 간 이동은 금지되어 있지 않습니다.
다음과 같이 유효합니다:
-
JUMP또는JUMPI사용하여 건너뛰기 영역 내의 위치로 이동합니다. - 지역 내부에서 외부로 이동
3. 중첩이 허용됩니다
건너뛰기 영역은 중첩될 수 있습니다.
L<data or metadata>L<more data> R R매칭 알고리즘은 정확한 페어링을 보장합니다.
가스 비용
| Opcode | 가스 |
|---|---|
L | 3 |
R | 2 |
클라이언트는 바이트코드를 사전 처리하여 일치하는 쌍을 매핑할 수 있으며, 이를 통해 L 상수 시간 내에 실행될 수 있습니다.
이론적 해석
구조화된 컨테이너로서의 바이트코드
이 제안은 계약에서 바이트코드를 단순히 명령어가 아니라 컨테이너 형식 으로 처리할 수 있도록 합니다.
L/R 사용하면 바이트코드에 다음을 안전하게 포함할 수 있습니다.
| 사용 사례 | 예 |
|---|---|
| 고정 데이터 덩어리 | 미리 계산된 테이블, 큰 상수 |
| 점프 테이블 | 밀집된 스위치 디스패치 테이블 |
| ABI와 유사한 내부 레이아웃 | 내부 DSL용 타입 설명자 |
| 디버그 정보 | 소스 맵, 기호 이름 |
| 컴파일러 메타데이터 | 최적화 팁, 레이아웃 정보 |
| 버전 관리 확장 프로그램 | 전방 호환성 페이로드 영역 |
실수로 사형당할 위험 없이 모든 것이 가능합니다.
JUMP 사용하면 되지 않나요?
JUMP 사용하여 데이터를 건너뛰기:
- 동적 제어 흐름이 필요합니다.
- 건너뛴 바이트는 구문적으로 실행 가능한 상태로 남겨둡니다.
- 정적 분석을 모호하게 만듭니다.
- 임의의 바이트 패턴을 안전하게 포함할 수 없습니다.
대신 L/R 기존 바이너리의 데이터 섹션과 유사하게 명시적인 실행 불가능 영역을 생성합니다.
JUMPDEST 재사용하지 않는 이유는 무엇인가요?
JUMPDEST 유효한 점프 대상을 표시하지만 실행 불가능한 영역은 표시하지 않습니다.
우리에게 필요한 것은 그 반대입니다. 즉, "이것은 코드가 아닙니다"라고 선언할 수 있는 방법입니다.
하위 호환성
완벽한 하위 호환성:
- 기존 계약에는
L이나R포함되어 있지 않습니다. - 기존 바이트코드 동작은 변경되지 않았습니다.
- 새로운 의미 체계는 오퍼레이션 코드가 존재할 때만 적용됩니다.
예시: 데이터 테이블 삽입
PUSH1 0 x00SSTOREL 0 x12 0 x34 0 x56 0 x78 0 x9a 0 xbc 0 xde 0 xf0 R PUSH1 0 x01SSTORE L … R 내부의 바이트는 절대 실행되지 않으며 오프체인 도구를 사용하거나 EXTCODECOPY 통해 코드를 복사하여 읽을 수 있습니다.
결론
L 과 R 이더리움 가상 머신(EVM) 에 구조화된 비실행 영역을 도입하여 바이트코드가 코드와 구조화된 데이터의 혼합체 로 기능할 수 있도록 합니다.
이것:
- 분석 가능성을 향상시킵니다.
- 컴파일러가 생성하는 메타데이터를 더욱 안전하게 만듭니다.
- 바이트코드 내에 밀집된 데이터 구조를 허용합니다.
- 완전한 하위 호환성을 유지합니다.
- 실행 모델에 최소한의 변경만 필요합니다.
간단한 오퍼레이션 코드 추가를 통해 이더리움 가상 머신(EVM) 바이트코드는 단순한 명령어 스트림이 아닌 , 자체 설명이 가능한 구조화된 아티팩트 로 변환됩니다.

