Tiêu đề gốc: " Giới thiệu tối giản về Solidity: 19. Nhận ETH nhận và dự phòng 》
Tác giả gốc: 0xAA
Tôi đang học lại sự vững chắc gần đây, củng cố các chi tiết và viết "Giới thiệu tối giản về Solidity" cho người mới sử dụng (các chuyên gia lập trình có thể tìm một hướng dẫn khác) và cập nhật 1-3 bài giảng mỗi tuần.
Tất cả các mã và hướng dẫn đều là nguồn mở trên github: github.com/AmazingAng/WTFSolidity
Solidity hỗ trợ hai hàm gọi lại đặc biệt, get() và fallback(), được sử dụng chủ yếu trong hai trường hợp:
- Nhận ETH
- Xử lý các lệnh gọi hàm không tồn tại trong hợp đồng (hợp đồng proxy)
p>
Bài giảng này chủ yếu giới thiệu tình hình nhận ETH.
receive() chỉ được sử dụng để xử lý việc nhận ETH. Một hợp đồng có thể có tối đa một hàm get(). Phương thức khai báo khác với các hàm thông thường. Không bắt buộc phải có từ khóa hàm: get() bên ngoài phải trả { ...
Hàm p>
receive() không thể có bất kỳ tham số nào, không thể trả về bất kỳ giá trị nào và phải chứa bên ngoài và phải trả.
Khi hợp đồng nhận được ETH, hàm nhận() sẽ được kích hoạt. Tốt nhất không nên thực thi quá nhiều logic trong get() vì nếu người khác sử dụng phương thức gửi và chuyển để gửi ETH thì gas sẽ bị giới hạn ở mức 2300. Nếu get() quá phức tạp có thể gây ra lỗi Out of Gas ; nếu bạn sử dụng lệnh gọi, bạn có thể tùy chỉnh gas Thực thi logic phức tạp hơn (chúng ta sẽ nói về ba phương thức gửi ETH này sau).
Chúng ta có thể gửi một sự kiện trong hàm get(), ví dụ:

Một số hợp đồng độc hại sẽ xuất hiện trong get() Các chức năng được nhúng với nội dung tiêu thụ gas một cách độc hại, khiến một số hợp đồng hoàn tiền không hoạt động bình thường: do đó, dự án Akutar NFT đã bị khóa vĩnh viễn với 11.539 ETH, tương đương gần 200 triệu nhân dân tệ! Vì vậy, khi viết hợp đồng có logic như hoàn tiền, bạn phải chú ý đến tình huống này.
Hàm fallback() sẽ gọi một hàm không tồn tại trong hợp đồng được kích hoạt. Nó có thể được sử dụng để nhận ETH và cũng có thể được sử dụng trong các hợp đồng proxy. Fallback() không yêu cầu từ khóa hàm khi khai báo và phải được sửa đổi bởi bên ngoài. Nó cũng thường được sửa đổi bởi khoản phải trả và được sử dụng để nhận ETH:fallback() khoản phải trả bên ngoài { ... }.
Chúng ta xác định hàm fallback(), hàm này sẽ giải phóng sự kiện fallbackCalled khi được kích hoạt và xuất ra msg.sender, msg.value và msg.data: p>

Cả nhận và dự phòng đều có thể được sử dụng để nhận ETH và các quy tắc chúng kích hoạt như sau:

p>
Nói một cách đơn giản, khi hợp đồng nhận ETH, khi msg.data trống và có nhận() tồn tại thì nhận() sẽ được kích hoạt, khi msg.data không trống hoặc có không nhận được(), dự phòng() sẽ được kích hoạt. ), tại thời điểm này, dự phòng() phải được thanh toán.
Khi không tồn tại phương thức dự phòng nhận () hoặc phải trả (), việc gửi ETH đến hợp đồng sẽ báo lỗi.
Trong bài giảng này tôi đã giới thiệu 2 hàm đặc biệt trong Solidity là get() và fallback() , chúng chủ yếu được sử dụng trong hai trường hợp, chủ yếu được sử dụng để xử lý việc nhận ETH và hợp đồng proxy.
Liên kết gốc
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia