Một phiên bản mới của Solidity, ngôn ngữ phát triển hợp đồng thông minh phổ biến nhất của Ethereum, đã được phát hành

Biên soạn: Kế hoạch dịch thuật; Nguồn: soliditylang.org

Phiên bản mới nhất của trình biên dịch Solidity v0.8.22 đã được phát hành. Trình biên dịch 0.8.22 bao gồm một số cải tiến về ngôn ngữ và trình biên dịch, chẳng hạn như định nghĩa sự kiện cấp tệp, tối ưu hóa gia tăng các vòng lặp không được kiểm tra, hỗ trợ nhập EVM assembly JSON và hơn thế nữa.

QUAN TRỌNG

Bản phát hành này không chấp nhận hỗ trợ cho EVM dưới Constantinople (Constantinople), ngày càng trở nên khó bảo trì. Các phiên bản cổ xưa này từ lâu đã lỗi thời trên mạng chính và testnet Ethereum và chúng tôi nghi ngờ chúng cũng không còn phù hợp với các mạng khác. Các đường dẫn và giải pháp mã phức tạp làm chậm quá trình phát triển và thử nghiệm tính năng cho các phiên bản mới, vì vậy chúng tôi hy vọng sẽ ngừng hỗ trợ chúng trong các bản phát hành trình biên dịch trong tương lai. Nếu bạn dựa vào hỗ trợ cho các phiên bản EVM này, vui lòng liên hệ với chúng tôi[6] 。

Tính năng mới nổi bật

tăng vòng lặp không được kiểm tra

Việc sử dụng số học không được kiểm tra khi tăng bộ đếm vòng lặp là để tối ưu hóa khí[7] thực hành phổ biến. Hãy minh họa với ví dụ sau đây về một vòng lặp và bộ đếm i:

for (uint i = 0; i < array.length; ++i) {
Mảng ACC +=[i] ; i không bị sửa đổi bởi thân vòng lặp
}

Trong nhiều trường hợp (xem các điều kiện chính xác bên dưới), thao tác so sánh sẽ đảm bảo rằng i không bao giờ đạt đến giá trị tối đa của loại của nó, vì vậy có thể giả định rằng vòng lặp sẽ dừng trước khi đạt đến giá trị tối đa. Trong trường hợp này, việc kiểm tra an toàn của quầy sẽ là dư thừa và lãng phí gas. Điều này khuyến khích người dùng sử dụng mẫu dài không được kiểm tra, bao bọc bộ đếm dần dần trong một khối số học không được kiểm tra bên trong vòng lặp, bỏ qua kiểm tra:

for (uint i = 0; i < array.length;) {
Mảng ACC +=[i] ;
Bỏ chọn { i ++; } // Tôi được tăng lên mà không cần kiểm tra tràn - ít khí được sử dụng hơn
}

Solidity 0.8.22 giới thiệu tối ưu hóa kiểm tra tràn tự động tạo gia số học không được kiểm tra cho bộ đếm vòng lặp. Tối ưu hóa mới này giúp loại bỏ sự cần thiết phải sử dụng một mô hình delta dài không được kiểm tra trong các thân vòng lặp như trong ví dụ trước.

Ngược lại, các tối ưu hóa mới cho phép người dùng quay trở lại mã thô, dễ đọc hơn mà không phải hy sinh hiệu quả gas.

Các điều kiện chính xác để kiểm tra tránh tràn mới được tối ưu hóa như sau:

  • Điều kiện chu kỳ có hình dạng của i < ... trong đó i là một biến cục bộ (từ đó được gọi là "bộ đếm vòng lặp").
  • Việc so sánh này phải được thực hiện trên cùng loại với bộ đếm vòng lặp, tức là loại bên phải phải được chuyển đổi ngầm thành loại bộ đếm vòng lặp để bộ đếm vòng lặp không được mở rộng ngầm trước khi so sánh.
  • Bộ đếm vòng lặp phải là một biến cục bộ của loại số nguyên tích hợp.
  • Biểu thức vòng lặp phải là tiền tố hoặc gia số hậu tố cho bộ đếm vòng lặp, i ++ hoặc ++ i.
  • Bộ đếm chu kỳ không thể được sửa đổi trong điều kiện chu kỳ hoặc trong thân chu kỳ.

Để làm rõ điều kiện thứ hai, hãy xem xét đoạn mã sau:

for (uint8 i = 0; trong < UINT16(1000); ++I) {
thân vòng lặp
}

Trong trường hợp này, i được chuyển đổi thành uint16 trước khi so sánh và điều kiện không bao giờ thực sự sai, vì vậy kiểm tra tràn gia tăng không thể được gỡ bỏ.

Ngoài ra, lưu ý rằng < là toán tử so sánh duy nhất kích hoạt tối ưu hóa. Toán tử <= và các toán tử khác được cố tình loại trừ. Ngoài ra, nhà điều hành phải được tích hợp sẵn - < do người dùng xác định không đủ điều kiện.

Việc tối ưu hóa rất đơn giản và luôn có lợi, vì vậy nó sẽ được bật ngay cả khi phần còn lại của trình tối ưu hóa bị tắt bằng cách sử dụng cài đặt chung settings.optimizer.enabled. Bạn có thể tắt nó một cách rõ ràng bằng cách đặt settings.optimizer.details.simpleCounterForLoopUncheckedIncrement thành false trong đầu vào JSON tiêu chuẩn. Nó không thể bị vô hiệu hóa bằng giao diện dòng lệnh.

Điều chỉnh trình tối ưu hóa Yul để tạo lại số chữ không

Phiên bản mới được xây dựng dựa trên hỗ trợ opcode PUSH0 được giới thiệu trong phiên bản 0.8.20 bằng cách thêm Rematerialiser[8] [9] Bước tối ưu hóa được mở rộng để luôn tái tạo số 0 theo nghĩa đen thay vì lưu trữ nó dưới dạng tham chiếu biến, cho phép sử dụng PUSH0 thay vì DUP để giảm chi phí gas. Để đảm bảo rằng điều này được thực hiện hiệu quả, Rematerialiser và UnusedPruner được thêm vào Các bước được thêm vào trình tự dọn dẹp mặc định của trình tối ưu hóa Yul.

Thêm hỗ trợ nhập EVM lắp ráp JSON (thử nghiệm)

Bản phát hành mới này bổ sung hỗ trợ thử nghiệm để nhập các cụm EVM, mở ra khả năng cho các công cụ bên ngoài thực hiện siêu tối ưu hóa trước khi tạo bytecode. Mục đích chính của tính năng này là xác định định dạng tuần tự hóa cho các cụm EVM cấp thấp để các cụm do trình biên dịch tạo có thể được xuất, sửa đổi và nhập lại, do đó tiếp tục quá trình biên dịch bình thường.

Quan trọng: Đây là tính năng thử nghiệm và hiện không có sẵn trong sản xuất. Chúng tôi sẽ cung cấp tính năng này trong bản phát hành này để bạn có thể dùng thử và cung cấp phản hồi.

Cho phép các sự kiện được xác định ở cấp độ tệp

Solidity 0.8.22 cho phép bạn xác định các sự kiện ở cấp độ tệp. Định nghĩa sự kiện hiện có thể được đặt bên ngoài phạm vi của hợp đồng. Điều này cung cấp một tùy chọn khác cho tổ chức mã mà không cần phải bọc các sự kiện một cách giả tạo trong thư viện.

Ngoài ra, bản phát hành này sửa lỗi gây ra lỗi khi tạo NatSpec khi phát hành một sự kiện được xác định trong hợp đồng hoặc giao diện bên ngoài cho mã. Trong bản phát hành trước (0.8.21), trình biên dịch Solidity đã thêm hỗ trợ cho quyền truy cập hạn chế vào các sự kiện được xác định trong hợp đồng và giao diện không được kế thừa từ hợp đồng hiện tại, nhưng lỗi đã ngăn cản việc sử dụng đầy đủ tính năng.

Với bản sửa lỗi này và cho phép định nghĩa sự kiện cấp tệp, phiên bản mới nhất của Solidity cho phép người dùng biên dịch các ví dụ sau mà không gặp bất kỳ lỗi nào:

giao diện I {
sự kiện ForeignEvent();
}
hợp đồng C {
sự kiện ForeignEvent();
}
sự kiện E();
hợp đồng D {
hàm f() public {
Phát ra một sự kiện nước ngoài sẽ gây ra lỗi nội bộ vào ngày 0.8.21
phát ra I.ForeignEvent();
phát ra C.ForeignEvent();
Phát ra sự kiện cấp tệp. Tính năng mới.
phát ra E();
}
}

Bảng thay đổi đầy đủ

Đặc điểm ngôn ngữ

  • Cho phép các sự kiện được xác định ở cấp độ tệp.

Tính năng trình biên dịch

  • Trình tạo mã: Loại bỏ kiểm tra tràn dư thừa cho một số vòng lặp khi biến đếm không tràn.
  • Giao diện dòng lệnh: Đã thêm tùy chọn --no-import-callback để ngăn trình biên dịch tải các tệp nguồn không được đưa ra rõ ràng trong đầu vào CLI hoặc JSON tiêu chuẩn.
  • Giao diện dòng lệnh: Đã thêm tùy chọn thử nghiệm --import-asm-json để nhập các cụm EVM ở định dạng được sử dụng bởi --asm-json. Giao diện dòng lệnh: Sử dụng mức độ nghiêm trọng và màu sắc thích hợp cho các thông báo lỗi được tạo bên ngoài đường ống được biên dịch.
  • EVM: Hỗ trợ không dùng nữa cho các phiên bản EVM "homestead", "tangerineWhistle", "spuriousDragon" và "byzantium".
  • Trình phân tích cú pháp: Xóa chế độ khôi phục lỗi thử nghiệm (--error-recovery / settings.parserErrorRecovery).
  • SMTChecker: Hỗ trợ các toán tử do người dùng xác định.
  • Yul Optimizer: Nếu PUSH0 được hỗ trợ, thích sử dụng zero literals thay vì lưu trữ các giá trị zero trong các biến.
  • Yul Optimizer: Chạy các bước Rematerializer và UnusedPruner ở cuối trình tự dọn dẹp mặc định.

Sửa lỗi

  • Trình tạo mã: Đã khắc phục sự cố trong đó đầu ra qua trình tạo mã qua IR phụ thuộc vào các tệp được tìm thấy trong callback nhập. Trong một số trường hợp, các gán ID AST khác nhau có thể thay đổi thứ tự các hàm trong lập lịch nội bộ, dẫn đến các mã byte rõ ràng khác nhau nhưng tương đương về mặt ngữ nghĩa.
  • NatSpec: Đã khắc phục lỗi nội bộ khi yêu cầu tài liệu người dùng hoặc tài liệu phát triển cho hợp đồng phát ra sự kiện được xác định trong hợp đồng hoặc giao diện bên ngoài.
  • SMTChecker: Đã sửa lỗi mã hóa khiến vòng lặp mở rộng sau khi hoàn thành.
  • SMTChecker: Đã khắc phục sự không nhất quán trong kiểm tra tình trạng liên tục khi một thời gian hoặc cho vòng lặp được mở ra trước khi kiểm tra tình trạng.
  • Trình tối ưu hóa Yul: Đã khắc phục sự cố trong đó tên biến Yul do trình biên dịch tạo trong CSE ảnh hưởng đến quyết định thay thế, dẫn đến mã bytecode khác nhau (nhưng tương đương) trong một số trường hợp.
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Chia sẻ
Bình luận
0/400
Không có bình luận
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)