새로운 오퍼코드 제안 2: `L / R` 구조화된 스킵 영역

이 기사는 기계로 번역되었습니다
원문 표시

L / R 오퍼코드를 통한 구조화된 스킵 영역

추상적인

이는 바이트코드에서 구조화된 건너뛰기 영역을 정의하는 두 가지 새로운 이더리움 가상 머신(EVM) 오퍼코드인 L (왼쪽 구분자)R (오른쪽 구분자) 을 도입합니다.

L 이 실행되면 이더리움 가상 머신(EVM) 내부에 포함된 바이트를 실행하지 않고 해당 R 로 건너뜁니다. 이러한 영역을 통해 계약은 결정론적 실행을 유지하면서 실행 불가능한 구조화된 데이터를 바이트코드 내부에 직접 포함할 수 있습니다.


동기 부여

현재 이더리움 가상 머신(EVM) 바이트코드에는 다음과 같은 사항을 구분할 수 있는 기본 기능이 없습니다.

  • 실행 가능한 지침
  • 내장된 메타데이터
  • 컴파일러 테이블
  • 구조화된 상수
  • 오프체인 도구 전용으로 설계된 대체 코드 경로

모든 바이트는 잠재적으로 실행 가능한 명령어로 취급되며, 코드를 건너뛰는 유일한 방법은 동적 점프를 이용하는 것입니다.

이로 인해 문제가 발생합니다:

  • 컴파일러는 구조화된 데이터를 바이트코드에 안전하게 포함시킬 수 없습니다.
  • 정적 도구는 모든 바이트를 실행 가능한 것으로 보수적으로 처리해야 합니다.
  • 바이트코드는 의도치 않은 실행의 위험 없이 복잡한 내부 구조를 담을 수 없습니다.
  • 제어 흐름은 비구조화된 점프를 사용하여 표현해야 합니다.

본 논문에서는 바이트코드 내에서 실행되지 않는 영역 처럼 동작하는 구조화된 스킵 영역을 제안합니다.

이 영역들은 바이트코드가 안전하게 다음을 포함할 수 있도록 합니다:

  • 조회 테이블
  • 점프 테이블
  • 유형 메타데이터
  • ABI 유사 내부 설명자
  • 컴파일러 힌트
  • 향후 확장 페이로드

실행에는 영향을 미치지 않습니다.


사양

새로운 Opcodes

Opcode 이름 스택 설명
0x?? L 영역 건너뛰기 시작
0x?? R 끝 건너뛰기 영역

의미론

1. LR 과 일치하도록 건너뛰기

이더리움 가상 머신(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 통해 코드를 복사하여 읽을 수 있습니다.


결론

LR 이더리움 가상 머신(EVM) 에 구조화된 비실행 영역을 도입하여 바이트코드가 코드와 구조화된 데이터의 혼합체 로 기능할 수 있도록 합니다.

이것:

  • 분석 가능성을 향상시킵니다.
  • 컴파일러가 생성하는 메타데이터를 더욱 안전하게 만듭니다.
  • 바이트코드 내에 밀집된 데이터 구조를 허용합니다.
  • 완전한 하위 호환성을 유지합니다.
  • 실행 모델에 최소한의 변경만 필요합니다.

간단한 오퍼레이션 코드 추가를 통해 이더리움 가상 머신(EVM) 바이트코드는 단순한 명령어 스트림이 아닌 , 자체 설명이 가능한 구조화된 아티팩트 로 변환됩니다.


출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
53
즐겨찾기에 추가
13
코멘트