Tiêu đề gốc: " Giới thiệu đơn giản về Solidity: 23.Delegatecall 》
Tác giả gốc: 0xAA
Gần đây tôi đang học lại sự vững chắc, củng cố các chi tiết và cũng đang viết "Giới thiệu về chủ nghĩa tối giản vững chắc" Đối với người mới học (lập trình viên có thể tìm các bài hướng dẫn khác) mỗi tuần sẽ có 1-3 bài giảng được cập nhật.
Tất cả các mã và hướng dẫn đều là nguồn mở trên github: github.com/AmazingAng/WTFSolidity
Delegatecall tương tự như call và là một hàm thành viên cấp thấp của loại địa chỉ trong Solidity. delegate có nghĩa là ủy quyền/đại diện, vậy delegatecall có nghĩa là gì?
Khi người dùng A gọi hợp đồng C thông qua hợp đồng B thì chức năng của hợp đồng C được thực thi. Ngữ cảnh (Context) có thể hiểu là bao gồm các biến và trạng thái. ) cũng là của hợp đồng C: msg.sender là địa chỉ của B, và nếu hàm thay đổi một số biến trạng thái thì hiệu ứng sẽ được áp dụng cho các biến của hợp đồng C.

ngôn ngữ gọi Môi trường
Khi người dùng A ủy quyền gọi hợp đồng C thông qua hợp đồng B, chức năng của hợp đồng C được thực thi, nhưng ngữ cảnh vẫn là hợp đồng B: msg.sender là địa chỉ của A và nếu hàm thay đổi một số biến trạng thái thì hiệu ứng sẽ là Sẽ hành động theo các biến của hợp đồng B.

Bối cảnh của delegatecall
Bạn có thể hiểu theo cách này: một doanh nhân giàu có bàn giao toàn bộ tài sản của mình (các biến trạng thái ) Giao cho đại lý VC (chức năng của hợp đồng mục tiêu) để xử lý. Thứ được thực thi là chức năng VC, nhưng thứ được thay đổi là địa vị của một doanh nhân giàu có.
Cú pháp cuộc gọi ủy nhiệm cũng tương tự như cuộc gọi:

Mã hóa nhị phân thu được bằng cách sử dụng hàm mã hóa có cấu trúc abi.encodeWithSignature:

Chữ ký của hàm là "hàm tên (các loại tham số được phân tách bằng dấu phẩy)". Ví dụ: abi.encodeWithSignature("f(uint256,address)", _x, _addr).
Không giống như cuộc gọi, delegatecall có thể chỉ định lượng gas được giao dịch gửi khi gọi hợp đồng, nhưng không thể chỉ định số lượng ETH đã gửi
Lưu ý: delegatecall có rủi ro về bảo mật, khi sử dụng phải đảm bảo cấu trúc lưu trữ biến trạng thái của hợp đồng hiện tại và hợp đồng đích giống nhau, hợp đồng đích phải an toàn, nếu không sẽ sẽ gây thất thoát tài sản.
Hiện tại, delegatecall có hai kịch bản ứng dụng chính . :
Hợp đồng proxy: Tách biệt hợp đồng lưu trữ và hợp đồng logic của hợp đồng thông minh: Hợp đồng proxy lưu trữ tất cả các biến có liên quan và lưu chúng. Địa chỉ của logic hợp đồng; tất cả các chức năng tồn tại trong hợp đồng logic (Hợp đồng logic) và được thực thi thông qua delegatecall. Khi nâng cấp, chỉ cần trỏ hợp đồng proxy vào hợp đồng logic mới.
EIP-2535 Diamonds: Kim cương là một tiêu chuẩn hỗ trợ xây dựng các hệ thống hợp đồng thông minh dạng mô-đun có thể mở rộng trong sản xuất. Một viên kim cương là một hợp đồng đại lý với nhiều hợp đồng thực hiện. Để biết thêm thông tin, hãy xem: Giới thiệu về Tiêu chuẩn Kim cương.
Cấu trúc cuộc gọi: Bạn (A) gọi hợp đồng mục tiêu C thông qua hợp đồng B.
Đầu tiên chúng ta viết một hợp đồng mục tiêu đơn giản C: Có hai các biến công khai: num và người gửi, lần lượt là uint256 và loại địa chỉ, có một hàm có thể đặt num thành _num được truyền vào và đặt người gửi thành msg.sender.

p>
Đầu tiên, hợp đồng B phải có cùng bố cục lưu trữ biến đổi như hợp đồng đích C Phải giống nhau, hai biến và thứ tự là num và người gửi
p>
Tiếp theo, chúng ta sử dụng call và delegatecall để gọi hàm setVars của hợp đồng C để hiểu rõ hơn sự khác biệt của chúng.
Hàm callSetVars gọi setVars thông qua call. Nó có hai tham số _addr và _num, tương ứng với địa chỉ của hợp đồng C và các tham số của setVars.

p>
Hàm delegatecallSetVars gọi setVars thông qua delegatecall. Tương tự như hàm callSetVars ở trên, có hai tham số _addr và _num tương ứng với địa chỉ của hợp đồng C và tham số của setVars.

Chúng tôi triển khai hợp đồng B và C, sau đó gọi callSetVars trong hợp đồng C. Các tham số đến là địa chỉ của hợp đồng B và 10. Sau khi chạy, các biến trạng thái trong hợp đồng C sẽ được sửa đổi: num được đổi thành 10 và người gửi trở thành địa chỉ của hợp đồng B.
Tiếp theo, chúng tôi gọi delegatecallSetVars trong hợp đồng C, chuyển địa chỉ hợp đồng B và 100 làm tham số. Vì đó là delegatecall nên ngữ cảnh là hợp đồng B. Sau khi chạy, các biến trạng thái trong hợp đồng B sẽ được sửa đổi: num được đổi thành 100 và người gửi trở thành địa chỉ ví của hợp đồng.
Trong bài giảng này, chúng tôi đã giới thiệu một hàm ủy nhiệm cấp thấp khác một cách vững chắc. Tương tự như cuộc gọi, nó có thể được sử dụng để gọi các hợp đồng khác; sự khác biệt nằm ở bối cảnh đang chạy, B gọi C, bối cảnh là C; trong khi B delegatecall C, bối cảnh là B. Hiện tại, ứng dụng lớn nhất của cuộc gọi đại biểu là hợp đồng đại lý và EIP-2535 Diamonds.
Liên kết gốc blockquote>
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