Phân tích dựa trên dữ liệu về Đề xuất cải tiến Ethereum (EIP)-7907

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

Báo cáo sau đây nhằm mục đích tập hợp các dữ liệu, với hy vọng sẽ trở thành nguồn tài liệu giúp ACD đưa ra quyết định về Đề xuất cải tiến Ethereum (EIP)-7907.
Ngoài ra, điều này hy vọng sẽ thiết lập một phương pháp mới để sao lưu các EIP hoặc đề xuất với càng nhiều dữ liệu càng tốt, điều chắc chắn có thể giúp đưa ra các quyết định tốt hơn và sáng suốt hơn khi xác định phạm vi các nhánh phát triển.

Tôi muốn gửi lời cảm ơn đến @rjl493456442PR bổ sung các chỉ số vào Geth và những lời khuyên cũng như sự hỗ trợ của anh ấy trong quá trình thu thập dữ liệu chuẩn, điều này vô cùng hữu ích. Và tôi muốn chuẩn hóa việc này trên tất cả các khách hàng để chúng ta có thể dễ dàng so sánh và thu thập dữ liệu nhằm đưa ra quyết định về việc định giá lại và mở rộng quy mô.


Vấn đề liên quan:** Đề xuất cải tiến Ethereum (EIP)-7907
Ngày: 13/01/2026
Môi trường kiểm chuẩn: Geth (chế độ phát triển) với cơ sở dữ liệu kích thước mainnet (~24 triệu khối), bộ nhớ đệm nội bộ bị vô hiệu hóa.
Cấu hình thử nghiệm: ~18.106 thao tác EXTCODESIZE mỗi Block (tất cả đều là các hợp đồng mã byte khác nhau), ~50 triệu gas
Phần cứng: WD Black SN850X NVMe (8TB)


Tóm tắt

Báo cáo này phân tích hiệu năng của opcode EXTCODESIZE khi đọc các hợp đồng có kích thước bytecode khác nhau (0,5KB đến 64KB) với bộ nhớ đệm mã nội bộ của Geth bị vô hiệu hóa . Điều này thể hiện kịch bản tấn công tồi tệ nhất, trong đó kẻ tấn công triển khai hàng nghìn hợp đồng độc nhất để buộc phải đọc dữ liệu từ ổ đĩa.

Quá trình lặp lại này cũng có chi phí hoạt động thấp nhất có thể nhờ vào việc tạo địa chỉ xác định bằng CREATE2 .
Bạn có thể tìm thêm thông tin về vấn đề này tại:

Những phát hiện chính

Tìm kiếm Giá trị
Khoảng thời gian đọc mã 107ms - 904ms (đối với khoảng 18.000 lần đọc mã)
Phạm vi độ trễ mỗi cuộc gọi 5,9µs - 49,9µs
Điều chỉnh thời gian đọc mã Tăng trưởng gấp 8,5 lần (0,5KB → 64KB)
Thời gian thực thi Block 64KB ~1006ms
Mã được đọc (%) Block Time 51% (0.5KB) → 90% (64KB)
Hiệu năng của Geth so với NVMe thô 24-51%

Phán quyết Đề xuất cải tiến Ethereum (EIP)-7907

Kích cỡ Block Time % ngân sách của 1 người Phán quyết
24KB (hiện tại) 535ms 54% An toàn
32KB 685ms 69% An toàn
64KB 1006ms ~100% Có thể hoạt động ở mức 60 triệu gas.
128KB+ Dự kiến ​​1,5 giây trở lên >100% Có thể cần điều chỉnh lại gas . Chúng ta cần thêm dữ liệu sau khi có BALs và ePBS.

Khuyến nghị: Tiếp tục sử dụng 64KB làm kích thước hợp đồng tối đa mới. Vượt quá 64KB sẽ yêu cầu thu thập dữ liệu mới sau khi các tối ưu hóa của BAL và ePBS được triển khai trên tất cả các máy khách.
Nếu cần định giá lại sau khi thu thập dữ liệu như đã đề cập ở trên, việc định giá đó cũng đòi hỏi phải so sánh với các khách hàng khác cũng như xem xét các mã lệnh EXTCODE* còn lại.


1. Phương pháp luận & Thiết lập tiêu chuẩn so sánh

1.1 Môi trường thử nghiệm

Tham số Giá trị
Phiên bản Geth v1.16.8-unstable (với nhiều bản vá lỗi)
Cơ sở dữ liệu Mạng chính đã được đồng bộ hóa (~24 triệu khối)
Bộ nhớ đệm Geth Đã vô hiệu hóa (buộc phải đọc dữ liệu từ ổ đĩa)
Kích thước hợp đồng đã được kiểm tra. 0.5, 1, 2, 5, 10, 24, 32, 64 KB
các thao tác EXTCODESIZE ~18.106 mỗi Block
Gas trên mỗi Block ~50 triệu
Các hợp đồng đã triển khai Hơn 18.100 hợp đồng độc đáo cho mỗi kích thước
Số lần lặp trên mỗi kích thước 8
Phần cứng Ổ cứng SSD NVMe WD Black SN850X 8TB

1.2 Thiết kế kịch bản tấn công

Điểm chuẩn này thể hiện cuộc tấn công tồi tệ nhất nhắm vào EXTCODESIZE :

  • Hơn 18.100 hợp đồng độc nhất được triển khai cho mỗi kích thước (gây ra lỗi bộ nhớ cache mã)
  • Mỗi Block đọc mã bytecode từ tất cả các hợp đồng duy nhất đúng một lần.
  • Tỷ lệ truy cập bộ nhớ cache mã: <2% (thực tế đã bị vô hiệu hóa)
  • Bộ nhớ đệm trang hệ điều hành được xóa giữa các lần chạy thử nghiệm hiệu năng.

1.3 Đường cơ sở đĩa thô (fio)

Để xác định hiệu năng tối đa về mặt lý thuyết, chúng tôi đã đo lường khả năng thô của NVMe:

Block Size IOPS Xuất lượng Độ trễ trung bình
512B 337K 172 MB/s 95 µs
1KB 320K 328 MB/s 100 µs
4KB 272K 1,1 GB/giây 117 µs
24KB 171K 4,2 GB/giây 185 µs
32KB 155K 5,1 GB/giây 204 µs
64KB 85 nghìn 5,6 GB/giây 366 µs

2. Kết quả so sánh

2.1 Thời gian đọc mã so với kích thước mã byte

7907_violin_code_read_time
7907_violin_code_read_time 1800×1050 91.5 KB
7907_code_read_vs_size
7907_code_read_vs_size 1500×900 55 KB

Kết luận chính: Thời gian đọc mã tỷ lệ thuận với kích thước mã byte khi bộ nhớ đệm không hiệu quả.

Kích cỡ Mã đã đọc (ms) Tăng trưởng so với 0,5KB
0.5KB 107ms 1.0x (mức cơ bản)
1KB 135ms 1,3 lần
2KB 142ms 1,3 lần
5KB 145ms 1,4 lần
10KB 161ms 1,5 lần
24KB 428ms 4.0x
32KB 584ms 5,5 lần
64KB 904ms 8,5 lần

Điểm mấu chốt: Thời gian đọc mã tăng gấp 8,5 lần khi kích thước bytecode tăng gấp 128 lần. Đây là sự gia tăng dưới mức tuyến tính (không phải 1:1), nhưng tác động về thời gian tuyệt đối là đáng kể.

2.2 Số byte đã đọc so với thời gian đọc mã (Hệ số tương quan)

7907_code_read_vs_total_bytes
7907_code_read_vs_total_bytes 1500×900 76 KB

Hệ số tương quan dương mạnh (R² ≈ 0,96) xác nhận rằng thời gian đọc mã tỷ lệ thuận với tổng số byte đã đọc khi bộ nhớ đệm không hiệu quả.

2.3 Độ trễ mỗi cuộc gọi

7907_per_call_latency
7907_per_call_latency 1500×900 59.1 KB

Độ trễ mỗi lần gọi tăng theo kích thước mã byte:

Kích cỡ Độ trễ mỗi cuộc gọi Sự phát triển
0.5KB 5,9 µs 1.0x
1KB 7,5 µs 1,3 lần
10KB 8,9 µs 1,5 lần
24KB 23,7 µs 4.0x
32KB 32,3 µs 5,5 lần
64KB 49,9 µs 8,5 lần

3. Phân tích thời gian thực hiện

3.1 Phân tích thành phần

7907_time_breakdown_stacked
7907_time_breakdown_stacked 1800×1050 69.2 KB

Việc đọc mã trở thành yếu tố chi phối khi kích thước bytecode lớn hơn:

Kích cỡ Đọc mã Đã đọc tài khoản Giám đốc Máy ảo Ethereum (EVM) Ghi vào cơ sở dữ liệu Khác Tổng cộng
0.5KB 107ms (51%) 54ms 34ms 12ms 2ms 209ms
1KB 135ms (57%) 53ms 37ms 12ms 1ms 238ms
10KB 161ms (59%) 53ms 40ms 12ms 5ms 271ms
24KB 428ms (80%) 44ms 46ms 15ms 2ms 535ms
32KB 584ms (85%) 38ms 47ms 13ms 3ms 685ms
64KB 904ms (90%) 38ms 51ms 12ms 1ms 1006ms

Quan sát: Ở mức 64KB, việc đọc mã chiếm 90% thời gian thực thi Block . Điều này khác biệt đáng kể so với các trường hợp sử dụng bộ nhớ đệm nóng, nơi việc đọc mã chỉ chiếm 8-10%.


4. Phân tích ngân sách Block Time (Trọng tâm Đề xuất cải tiến Ethereum (EIP)-7907)

4.1 Mục tiêu về thời gian so với ngân sách

7907_block_time_budget
7907_block_time_budget 1500×900 60.4 KB

Sử dụng mục tiêu 1 giây để thực thi Block :

Kích cỡ Block Time % ngân sách của 1 người Trạng thái
0.5KB 209ms 21% Tiết kiệm hơn nhiều so với dự toán
1KB 238ms 24% Tiết kiệm hơn nhiều so với dự toán
2KB 248ms 25% Tiết kiệm hơn nhiều so với dự toán
5KB 252ms 25% Tiết kiệm hơn nhiều so với dự toán
10KB 271ms 27% Tiết kiệm hơn nhiều so với dự toán
24KB 535ms 54% Dưới ngân sách
32KB 685ms 69% Dưới ngân sách
64KB 1006ms ~100% Ở mức giới hạn

Kết luận: Các hợp đồng 64KB khả thi trong điều kiện tấn công tồi tệ nhất ở khối 60 triệu gas . Thời gian thực thi ~1 giây nằm ở giới hạn ngân sách nhưng vẫn chấp nhận được. Lưu ý rằng đây là giới hạn khá thận trọng vì ePBS & BAL có thể sẽ định hình lại những gì chúng ta coi là ngân sách an toàn trong tương lai gần.

4.2 Tốc độ xử lý gas (Phân tích định giá sai)

7907_mgas_vs_size
7907_mgas_vs_size 1500×900 64.3 KB
Kích cỡ Gas đã sử dụng Block Time Mgas/s
0.5KB 49,4 triệu 209ms 236
1KB 49,4 triệu 238ms 208
10KB 49,4 triệu 271ms 182
24KB 49,4 triệu 535ms 92
32KB 49,4 triệu 685ms 72
64KB 49,4 triệu 1006ms 49

Quan sát thấy sự định giá sai: Cùng một chi phí gas , nhưng thời gian thực thi khác nhau gấp 5 lần (236 Mgas/s → 49 Mgas/s). Điều này cho thấy rằng trong điều kiện xấu nhất, các hợp đồng lớn hơn sẽ gây ra chi phí cao hơn một cách không cân xứng cho các trình xác thực.

Ý nghĩa đối với dung lượng 128KB trở lên: Đối với dung lượng trên 64KB, cần điều chỉnh mô hình gas —có thể là chi phí cơ bản cộng với thành phần phụ thuộc vào kích thước.

Hãy lưu ý rằng đây là một phương án khá thận trọng. Bởi vì để "dừng" mạng lưới hoặc "gây tổn hại đáng kể cho các trình xác thực chậm", cần phải thiết lập số lượng hợp đồng gấp hàng trăm lần so với 18.000 hợp đồng duy nhất. Điều này dẫn đến chi phí khổng lồ (chúng ta không thể sử dụng lại chúng vì chúng sẽ được lưu vào bộ nhớ cache sau khi Block đầu tiên được thực thi).


5. Hiệu năng cơ bản của ổ đĩa thô (So sánh hiệu năng Geth và NVMe)

5.1 So sánh hiệu quả

7907_geth_vs_nvme
7907_geth_vs_nvme 2100×900 64.7 KB
Kích cỡ IOPS Geth IOPS NVMe thô Hiệu quả Xuất lượng Geth NVMe thô Hiệu quả
0.5KB 171K 337K 51% 83 MB/s 172 MB/s 48%
1KB 142K 320K 44% 139 MB/s 328 MB/s 42%
24KB 43K 171K 25% 1,0 GB/giây 4,2 GB/giây 24%
32KB 31 nghìn 155K 20% 979 MB/s 5,1 GB/giây 19%
64KB 20 nghìn 85 nghìn 24% 1,26 GB/giây 5,6 GB/giây 23%

Quan sát: Geth đạt được 20-51% hiệu năng ổ đĩa thô. Khoảng cách này có thể là do:

  • Chi phí phát sinh của Pebble/LevelDB (duyệt chỉ mục, bộ lọc Bloom)
  • Băm khóa và tra cứu
  • Giải mã giá trị

6. So sánh với kịch bản bộ nhớ đệm nóng

6.1 Hiệu năng khi sử dụng bộ nhớ đệm so với khi không sử dụng bộ nhớ đệm

7907_cached_vs_uncached
7907_cached_vs_uncached 1800×900 64 KB
Kích cỡ Bộ nhớ đệm ấm Bộ nhớ đệm lạnh Chậm lại
0.5KB 5,3ms 107ms 21x
1KB 4,4ms 135ms 31x
2KB 4,5ms 142ms 32x
5KB 4,6ms 145ms 31x
10KB 4,7ms 161ms 34x
24KB 4,8ms 428ms 89x
32KB 4,9ms 584ms 119x
64KB 4,9ms 904ms 181x

Kết quả "chi phí cố định" từ các bài kiểm tra hiệu năng bộ nhớ đệm nóng vẫn đúng trong điều kiện hoạt động bình thường. Điều kiện bộ nhớ đệm lạnh đòi hỏi các kịch bản tấn công cực đoan (hơn 18.000 hợp đồng duy nhất).


7. Ý nghĩa đối với Đề xuất cải tiến Ethereum (EIP)-7907 & Các khuyến nghị

7.1 Tóm tắt các phát hiện

  1. Thời gian đọc mã tỷ lệ thuận với kích thước tệp trong điều kiện bị tấn công (gấp 8,5 lần từ 0,5KB đến 64KB).
  2. 64KB là khả thi với khối gas 60M — thời gian thực thi trong trường hợp xấu nhất khoảng ~1 giây, nằm trong phạm vi ngân sách.
  3. Đây là trường hợp xấu nhất tuyệt đối — việc triển khai và duy trì hơn 18.000 hợp đồng độc nhất là không khả thi (bạn cần một bộ hợp đồng mới cho mỗi Block mà bạn muốn thực hiện cuộc tấn công).
  4. Hoạt động bình thường không bị ảnh hưởng — các kịch bản bộ nhớ đệm nóng cho thấy chi phí cố định khoảng ~5ms
  5. Việc định giá gas sai lệch đang bị tấn công (thời gian thực thi chênh lệch gấp 5 lần với cùng gas).

7.2 Khuyến nghị Đề xuất cải tiến Ethereum (EIP)-7907

Hoạt động Sự giới thiệu
Giới hạn 64KB Tiếp tục - khả thi ngay cả trong trường hợp tấn công tồi tệ nhất. Không cần Đề xuất cải tiến Ethereum (EIP).
Giới hạn 128KB+ Cần đo lại bằng BALs + ePBS

Có vẻ như chúng ta chỉ cần "giữ mọi thứ đơn giản" và cung cấp cho các nhà phát triển Hợp đồng thông minh một bản nâng cấp tốt về giới hạn kích thước mã mà không cần thay đổi giao thức nào ngoài giới hạn 64kB và việc tăng kích thước mã khởi tạo.

Khi BAL và ePBS được hoàn thiện hơn, chúng ta sẽ có thể dựa vào dữ liệu để đưa ra quyết định tốt hơn về việc định giá lại/hoặc chuyển sang 256kB.
Nhưng việc điều chỉnh giá vào lúc này có vẻ không cần thiết đối với một sản phẩm mà ngay cả trong trường hợp xấu nhất cũng không thực sự cần thiết.

7.3 Tại sao 64KB là chấp nhận được

  1. Tính bất khả thi của cuộc tấn công: Triển khai hơn 18.000 hợp đồng 64KB độc nhất đòi hỏi:

    • ~13 triệu gas cho mỗi lần triển khai hợp đồng (32K cơ bản + 64K × 200 gas/byte)
    • Hàng trăm khối chỉ để thiết lập
    • Chi phí duy trì bề mặt tấn công rất đáng kể.
  2. Block Time nằm trong ngân sách: Ngay cả trường hợp xấu nhất là khoảng 1 giây cũng có thể chấp nhận được đối với các khối gas 60M.

  3. Hiệu quả của bộ nhớ đệm trong thực tế: Các khối mạng chính thực tế tái sử dụng hợp đồng; tỷ lệ truy cập bộ nhớ đệm mã thường cao.

  4. Tăng trưởng dưới tuyến tính: Thời gian gấp 8,5 lần để đạt được mức tăng trưởng kích thước gấp 128 lần cho thấy khấu hao vẫn hữu ích.


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
Thêm vào Yêu thích
Bình luận