Bắt đầu với Solidity | Bài giảng 29: Bộ chọn chức năng

Gần đây tôi đã học lại solidity, củng cố các chi tiết và viết “Solidity Minimalist Primer” cho người mới bắt đầu sử dụng (những người lập trình có thể tìm thấy một hướng dẫn khác), cập nhật 1-3 lần một tuần.

Tất cả các mã và hướng dẫn là mã nguồn mở tại github: github .com / AmazingAng / WTFSolidity

Bộ chọn ###

Khi chúng ta gọi một hàm của hợp đồng thông minh, 4 byte đầu tiên của bytecode được gửi là bộ chọn. Trong bài nói chuyện này, chúng ta sẽ đề cập đến bộ chọn là gì và cách sử dụng nó.

msg.data

msg.data là một biến toàn cục trong Solidity với giá trị của calldata đầy đủ (bytecode gọi hàm).

Trong đoạn mã sau, chúng ta có thể sử dụng sự kiện Log để xuất ra calldata gọi hàm mint:

Khi tham số được 0x2c44b726ADF1963cA47Af88B284C06f30380fC78, calldata đầu ra là

Mã bytecode lộn xộn này có thể được chia thành hai phần:

Trên thực tế, calldata cho hợp đồng thông minh biết chức năng nào tôi muốn gọi và các tham số là gì.

Chữ ký chức năng và bộ chọn

Bộ chọn được định nghĩa là 4 byte đầu tiên của hàm băm của chữ ký hàm, vậy chữ ký hàm là gì?

Trên thực tế, trong Bài giảng 21, chúng tôi đã giới thiệu ngắn gọn chữ ký hàm, đó là “tên hàm (loại tham số được phân tách bằng dấu phẩy)”. Ví dụ: chữ ký hàm cho mint trong đoạn code trên là “mint(address)”. Trong các 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 phải được viết là uint256 và int256.

Hãy viết một hàm để xác minh rằng bộ chọn của hàm mint là 0x6a627842. Bạn có thể chạy hàm sau và xem kết quả.

Sử dụng bộ chọn

Chúng ta có thể sử dụng bộ chọn để gọi hàm đích. Ví dụ nếu muốn gọi hàm mint, mình chỉ cần sử dụng abi.encodeWithSelector để mã hóa selector và các tham số của hàm mint và truyền nó vào hàm call:

Trong nhật ký, chúng ta có thể thấy hàm mint được gọi thành công và sự kiện Log được xuất ra.

Tóm tắt

Trong bài nói chuyện này, chúng tôi đã giới thiệu bộ chọn hàm là gì, nó liên quan đến msg.data như thế nào, chữ ký hàm và cách sử dụng nó để gọi một hàm khách quan.

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
  • Đăng lại
  • Retweed
Bình luận
0/400
Không có bình luận
  • Ghim