Đề xuất mã lệnh mới 2: Vùng bỏ qua có cấu trúc `L / R`

Bài viết này được dịch máy
Xem bản gốc

Các vùng bỏ qua có cấu trúc thông qua mã lệnh L / R

Tóm tắt

Điều này giới thiệu hai mã lệnh Máy ảo Ethereum (EVM) mới, L (Dấu phân cách bên trái)R (Dấu phân cách bên phải) , xác định các vùng bỏ qua có cấu trúc trong mã byte.

Khi được thực thi, L khiến Máy ảo Ethereum (EVM) bỏ qua đến R tương ứng mà không thực thi các byte bên trong. Các vùng này cho phép các hợp đồng nhúng dữ liệu có cấu trúc không thể thực thi trực tiếp vào mã bytecode trong khi vẫn duy trì tính xác định của quá trình thực thi.


Động lực

Mã bytecode Máy ảo Ethereum (EVM) hiện không có cách nào để phân biệt một cách tự nhiên:

  • Hướng dẫn thực thi
  • Siêu dữ liệu được nhúng
  • Bảng biên dịch
  • Hằng số có cấu trúc
  • Các đường dẫn mã thay thế chỉ dành cho các công cụ Ngoài chuỗi.

Tất cả các byte đều được coi là các lệnh có khả năng thực thi, và cách duy nhất để bỏ qua mã là thông qua các lệnh nhảy động.

Điều này dẫn đến các vấn đề:

  • Trình biên dịch không thể nhúng dữ liệu có cấu trúc vào mã byte một cách an toàn.
  • Các công cụ tĩnh phải thận trọng khi xem xét tất cả các byte như là tệp thực thi.
  • Mã bytecode không thể chứa cấu trúc nội bộ phức tạp mà không có nguy cơ bị thực thi ngoài ý muốn.
  • Luồng điều khiển phải được thể hiện bằng các bước nhảy không cấu trúc.

Chúng tôi đề xuất các vùng bỏ qua có cấu trúc hoạt động như các đảo không được thực thi bên trong mã bytecode.

Các vùng này cho phép mã bytecode chứa một cách an toàn:

  • Bảng tra cứu
  • Bảng nhảy
  • Siêu dữ liệu loại
  • Các mô tả nội bộ giống ABI
  • Gợi ý của trình biên dịch
  • Tải trọng mở rộng trong tương lai

mà không ảnh hưởng đến quá trình thực thi.


Thông số kỹ thuật

Mã lệnh mới

Mã lệnh Tên Ngăn xếp Sự miêu tả
0x?? L Bắt đầu bỏ qua vùng
0x?? R Kết thúc vùng bỏ qua

Ngữ nghĩa

1. L — Chuyển tiếp đến phần khớp R

Khi Máy ảo Ethereum (EVM) thực thi mã lệnh L :

  • Nó chuyển sang chế độ bỏ qua.
  • Nó quét tiến về phía trước trong mã byte để tìm R phù hợp.
  • Tất cả các byte nằm giữa đều bị bỏ qua và không bao giờ được thực thi.
  • Các cặp L / R lồng nhau phải được cân bằng.

Thuật toán khớp

depth = 1pc = pc + 1while depth > 0:opcode = code[pc]if opcode == L:depth += 1 else if opcode == R:depth -= 1pc += 1

2. R — Bộ phân định cấu trúc

Quá trình thực thi tiếp tục tại mã lệnh đầu tiên sau ký tự R khớp.

Nếu không tìm thấy R phù hợp → dừng ngoại lệ.


Quy tắc cấu trúc

1. Các vùng không thể thực thi

Các byte bên trong vùng L … R :

  • Không bao giờ được phép thi hành
  • Được coi là tải trọng mờ đục
  • Có thể chứa các giá trị byte tùy ý, bao gồm cả các mã lệnh không hợp lệ.

2. Việc nhảy vào hoặc ra khỏi các khu vực không bị cấm.

Điều này là hợp lệ:

  • JUMP hoặc JUMPI để di chuyển đến một vị trí bên trong vùng bỏ qua.
  • Di chuyển từ bên trong một khu vực ra bên ngoài.

3. Lồng nhau được cho phép

Các vùng bỏ qua có thể lồng nhau:

L<data or metadata>L<more data> R R

Thuật toán đối sánh đảm bảo việc ghép cặp chính xác.


Chi phí gas

Mã lệnh Gas
L 3
R 2

Các máy khách CÓ THỂ xử lý trước mã bytecode để ánh xạ các cặp phù hợp, cho phép L thực thi trong thời gian không đổi.


Lý do

Mã bytecode như một vùng chứa có cấu trúc

Đề xuất này cho phép các hợp đồng coi mã bytecode không chỉ là các lệnh mà còn là một định dạng chứa đựng thông tin .

Với L/R , mã bytecode có thể bao gồm một cách an toàn các thành phần sau:

Use Case Ví dụ
Khối dữ liệu cố định Bảng tính toán trước, hằng số lớn
Bảng nhảy Bảng điều phối chuyển mạch dày đặc
Bố cục nội bộ tương tự ABI Mô tả kiểu dữ liệu cho các ngôn ngữ chuyên dụng nội bộ (DSL).
Thông tin gỡ lỗi Bản đồ nguồn, tên ký hiệu
Siêu dữ liệu trình biên dịch Gợi ý tối ưu hóa, thông tin bố cục
Phần mở rộng theo phiên bản Các vùng tải trọng tương thích ngược

Tất cả đều không có nguy cơ bị hành quyết ngoài ý muốn.


Sao không dùng lệnh JUMP ?

Sử dụng JUMP để bỏ qua dữ liệu:

  • Yêu cầu điều khiển dòng chảy động
  • Giữ nguyên cú pháp cho phép thực thi các byte bị bỏ qua.
  • Làm cho phân tích tĩnh trở nên mơ hồ.
  • Không thể chứa các mẫu byte tùy ý một cách an toàn.

Thay vào đó, L/R tạo ra các vùng không thể thực thi rõ ràng , tương tự như các phần dữ liệu trong các tệp nhị phân truyền thống.


Tại sao không tái sử dụng JUMPDEST ?

JUMPDEST đánh dấu các mục tiêu nhảy hợp lệ nhưng không đánh dấu các vùng không thể thực thi .
Chúng ta cần điều ngược lại: một cách để tuyên bố "đây không phải là mã lập trình."


Khả năng tương thích ngược

Hoàn toàn tương thích ngược:

  • Các hợp đồng hiện có không chứa điều khoản L hoặc R
  • Hành vi mã byte cũ không thay đổi
  • Ngữ nghĩa mới chỉ áp dụng khi có mã lệnh (opcode)

Ví dụ: Nhúng bảng dữ liệu

PUSH1 0 x00SSTOREL 0 x12 0 x34 0 x56 0 x78 0 x9a 0 xbc 0 xde 0 xf0 R PUSH1 0 x01SSTORE

Các byte bên trong L … R không bao giờ được thực thi và có thể được đọc bởi các công cụ Ngoài chuỗi hoặc bằng cách sao chép mã thông qua EXTCODECOPY .


Phần kết luận

LR giới thiệu các vùng không thể thực thi có cấu trúc vào Máy ảo Ethereum (EVM), cho phép mã bytecode hoạt động như một sự kết hợp giữa mã và dữ liệu có cấu trúc .

Cái này:

  • Cải thiện khả năng phân tích
  • Giúp tạo siêu dữ liệu do trình biên dịch tạo ra an toàn hơn.
  • Cho phép cấu trúc dữ liệu dày đặc trong mã bytecode
  • Bảo toàn khả năng tương thích ngược hoàn toàn
  • Yêu cầu thay đổi tối thiểu đối với mô hình thực thi.

Việc bổ sung một đoạn mã lệnh nhỏ sẽ biến mã bytecode Máy ảo Ethereum (EVM) thành một cấu trúc tự mô tả, có cấu trúc , chứ không chỉ là một luồng lệnh đơn thuần.


Nguồn
Tuyên bố từ chối trách nhiệm: Nội dung trên chỉ là ý kiến của tác giả, không đại diện cho bất kỳ lập trường nào của Followin, không nhằm mục đích và sẽ không được hiểu hay hiểu là lời khuyên đầu tư từ Followin.
Thích
53
Thêm vào Yêu thích
13
Bình luận