Ép xung khối với hoàn tiền gas

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

Tăng tốc Block bằng Hoàn lại Gas

TL;DR: Hoàn lại xóa bộ nhớ là có giá trị nhưng có thể làm phình số liệu gas của block - giữ chúng cho người dùng, nhưng không tính chúng vào gas block đã sử dụng. EIP-7778 khôi phục việc kế toán gas on-chain chính xác.

Cơ chế gas của Ethereum nhằm phản ánh chính xác việc tiêu thụ tài nguyên tính toán. Để khuyến khích người dùng giữ trạng thái sạch sẽ và quản lý được, Ethereum cấp hoàn lại gas khi các ô lưu trữ được đặt lại về không. Mặc dù hiệu quả trong việc giảm sự phình to của trạng thái, những khoản hoàn lại này hiện đang làm phức tạp việc kế toán gas, khiến dường như các block tiêu thụ ít tài nguyên hơn so với thực tế.

Cách Hoàn lại Gas Hoạt động Ngày nay

Các giao dịch xóa các ô lưu trữ thông qua các thao tác SSTORE, đặt lại một ô về không, đủ điều kiện để hoàn lại gas (xem EIP-3529). Ví dụ, một giao dịch sử dụng 45 triệu gas với mức hoàn lại 20% về thực tế sẽ tốn người dùng:

tx.gas_used = 45,000,000 - (0.20 × 45,000,000) = 36,000,000 gas

Tương tự, một giao dịch khác sử dụng 9 triệu gas với mức hoàn lại 20% sẽ dẫn đến:

tx.gas_used = 9,000,000 - (0.20 × 9,000,000) = 7,200,000 gas

Quan trọng là, việc hoàn lại gas của một giao dịch có thể được sử dụng bởi một giao dịch khác.

Vấn đề Gì Với Cơ chế Hiện Tại?

Mặc dù việc hoàn lại gas hiệu quả trong việc khuyến khích dọn dẹp bộ nhớ, nhưng cách triển khai hiện tại làm giảm tổng lượng gas được tính vào giới hạn gas của block. Do đó, việc sử dụng gas của block đã che giấu nỗ lực tính toán thực tế. Quan trọng là, các ưu đãi dài hạn chống lại sự phình to của trạng thái không nên làm méo các cơ chế điều khiển phản hồi ngắn hạn như basefee của EIP-1559.

Để hiểu rõ ảnh hưởng của việc hoàn lại gas đối với việc kế toán gas của block, chúng ta hãy hệ thống hóa điều này một cách có hệ thống hơn.

(Phần còn lại của bản dịch tương tự như trên, tuân thủ các quy tắc dịch đã được đặt ra)

n = ⌊log(G_min/G_0)/log(r)⌋ + 1
n = ⌊log(21.000/45.000.000)/log(0,2)⌋ + 1 = ⌊4,766⌋ + 1 = 5

Tổng Gas Tính Toán

Tổng tất cả Gas tính toán được sử dụng cho đến bước n-1:

G_tổng = G_0 + G_0 r + G_0 r^2 + ... + G_0 r^(n-1)

Rút gọn G_0:

G_tổng = G_0 (1 + r + r^2 + ... + r^(n-1))

Sử dụng công thức chuỗi hình học:

1 + r + r^2 + ... + r^(n-1) = (1 - r^n)/(1 - r)

Chúng ta có:

G_tổng = G_0 × (1 - r^n)/(1 - r)

Thay các giá trị:

  • G_0 = 45.000.000
  • r = 0,2
  • G_min = 21.000

Tính n:

G_{\text{total}} = 45,000,000 \times \frac{1 - (0.2)^5}{1 - 0.2} = 56,232,000
Gtotal=45,000,000×1(0.2)510.2=56,232,000

Điều này cho thấy sự gia tăng khoảng 25% so với giới hạn gas ban đầu, làm nổi bật mức độ các khoản hoàn trả hiện tại làm méo mó việc tính toán gas của block.

Ví dụ về Hợp đồng

Đây là cách các hợp đồng như vậy có thể trông như thế nào:

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract Refundooor {mapping(uint256 => uint256) private storageSlots;/// @notice Điền trước `maxSlots` khóa bắt đầu từ `startKey`function chargeStorage(uint256 startKey, uint256 maxSlots) external {for (uint256 i = 0; i < maxSlots; i++) {storageSlots[startKey + i] = startKey + i + 1;}}/// @notice Xóa chính xác MAX_LOOPS slot không điều kiện (không kiểm tra)fallback() external {assembly {let base := storageSlots.slotmstore(0x20, base)// MAX_LOOPS * ~5,109 gas/iter ≈ 45 000 000 gaslet MAX_LOOPS := 8805for { let i := 0 } lt(i, MAX_LOOPS) { i := add(i, 1) } {// tính toán storage slot cho key = imstore(0x0, i)let s := keccak256(0x0, 0x40)// vô điều kiện ghi zero sstore(s, 0)}}}}
  • Đầu tiên chúng ta *nạp* hợp đồng bằng cách ghi vào các ô lưu trữ trống.
  • Thứ hai, chúng ta gọi fallback của hợp đồng, đặt 8805 ô lưu trữ về không.

Hãy xem giao dịch mẫu này trên Holesky, nó tối đa hóa số lượng hoạt động SSTORE.

Cuối cùng, gas "được nhập lậu" sẽ tăng tuyến tính với giới hạn gas của block. Ở 100 triệu gas, một block có thể đi kèm 125 triệu gas công việc thực tế.


Thay đổi được đề xuất: Tách Hoàn trả Giao dịch khỏi Tính toán Gas của Block

EIP-7778 đề xuất giữ lại các khoản hoàn trả cấp người dùng để khuyến khích quản lý lưu trữ hiệu quả nhưng loại bỏ các khoản hoàn trả này khỏi tính toán gas cấp block. Điều này đảm bảo việc sử dụng gas của block phản ánh chính xác mức tiêu thụ tài nguyên.

Những lợi ích của việc triển khai EIP là:

  • Tăng Tính Dự đoán: Công việc thực tế của các block vẫn dưới mức giới hạn dự định.
  • Tăng Tính Ổn định của Mạng: Giảm các rủi ro DoS bất kể kịch bản xấu nhất.
  • Duy trì Động lực cho Người dùng: Người dùng vẫn giữ được động lực để dọn dẹp trạng thái.

EIP-7778 tách biệt rõ ràng các động lực của người dùng khỏi các ràng buộc tài nguyên của block, làm cho việc sử dụng gas của block phù hợp hơn với công việc thực tế được thực hiệ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
Thêm vào Yêu thích
Bình luận