BTC
$96,000
5.73%
ETH
$3,521.91
3.97%
HTX
$0.{5}2273
5.23%
SOL
$198.17
3.05%
BNB
$710
3.05%
lang
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
Trang chủ
AI AI
Tin nhanh
Bài viết
Sự kiện
BlockBeats Pro
Thêm
Thông tin tài chính
Chuyên đề
Hệ sinh thái chuỗi khối
Mục nhập
Podcast
Data
OPRR

Giới thiệu đơn giản về Solidity|Bài 19: Nhận ETH nhận và dự phòng

Đọc bài viết này mất 7 phút
Bài viết này giới thiệu hai hàm đặc biệt trong Solidity là get() và fallback().
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


Hàm gọi lại


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)


Bài giảng này chủ yếu giới thiệu tình hình nhận ETH.


Hàm nhận ETH nhận


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ả { ...


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.


Dự phòng hàm dự phòng


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:



Sự khác biệt giữa nhận và dự phòng


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:



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.


Tóm tắt


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

举报 Báo lỗi/Báo cáo
Chọn thư viện
Thêm mới thư viện
Hủy
Hoàn thành
Thêm mới thư viện
Chỉ mình tôi có thể nhìn thấy
Công khai
Lưu
Báo lỗi/Báo cáo
Gửi