Tiêu đề gốc: " Giới thiệu tối giản về Solidity: 29. Bộ chọn chức năng Selector 》
Tác giả gốc: 0xAA
Gần đây tôi lại- Tìm hiểu sự vững chắc, củng cố các chi tiết và cũng viết "Giới thiệu tối giản về sự vững chắc" 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
Khi chúng ta gọi hàm của hợp đồng thông minh, 4 byte đầu tiên của mã byte được gửi là bộ chọn (bộ chọn hàm). Trong bài giảng này, chúng tôi sẽ giới thiệu bộ chọn là gì và cách sử dụng nó.
msg.data là một biến toàn cục ở dạng rắn với giá trị là Hoàn thành calldata (bytecode của hàm gọi).
Trong đoạn mã sau, chúng ta có thể sử dụng sự kiện Nhật ký để xuất dữ liệu lệnh gọi của hàm mint:

Khi tham số là 0x2c44b726ADF1963cA47Af88B284C06f30380fC78, dữ liệu cuộc gọi đầu ra là

Đây là một mớ byte lộn xộn mã có thể được chia thành hai phần:

Trên thực tế, calldata cho hợp đồng thông minh biết tôi muốn gọi chức năng nào và tham số là gì.
bộ chọn được định nghĩa là 4 giá trị băm đầu tiên của chữ ký hàm Byte, vậy chữ ký hàm là gì?
Thực ra, trong Bài giảng 21, chúng tôi đã giới thiệu ngắn gọn về chữ ký hàm, đó là “tên hàm (các kiểu tham số được phân tách bằng dấu phẩy)”. Ví dụ: chữ ký hàm của mint trong đoạn mã trên là "mint(địa chỉ)". Trong hợp đồng thông minh, các hàm khác nhau có chữ ký hàm khác nhau, vì vậy chúng ta có thể xác định hàm nào sẽ gọi thông qua chữ ký hàm.
Lưu ý rằng trong chữ ký hàm, uint và int được viết là uint256 và int256.
Chúng ta viết một hàm để xác minh xem bộ chọn của hàm mint có phải là 0x6a627842 hay không. Bạn có thể chạy hàm sau và xem kết quả.

p>
Chúng ta có thể sử dụng bộ chọn để gọi hàm đích. Ví dụ mình muốn gọi hàm mint thì chỉ cần sử dụng abi.encodeWithSelector để đóng gói và mã hóa selector cũng như các tham số của hàm mint và chuyển chúng cho hàm call:

Trong nhật ký, chúng tôi có thể thấy rằng hàm mint được gọi thành công và xuất ra sự kiện Nhật ký.
Trong bài giảng này chúng tôi đã giới thiệu hàm selector (bộ chọn) là gì, mối quan hệ của nó với msg.data, chữ ký hàm và cách sử dụng nó để gọi hàm đích.
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