Bắt đầu với Solidity | Bài giảng 22: Gọi

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 đều là mã nguồn mở trên GitHub: github.com/AmazingAng/WTFSolidity

Trong Bài giảng 17: Gửi ETH, chúng ta đã nói về việc sử dụng lệnh gọi để gửi ETH và trong bài giảng này, chúng tôi sẽ chỉ cho bạn cách sử dụng nó để gọi hợp đồng.

Gọi

Cuộc gọi là một chức năng thành viên cấp thấp của loại địa chỉ, được sử dụng để tương tác với các hợp đồng khác. Nó trả về (bool, dữ liệu), tương ứng với sự thành công của cuộc gọi và giá trị trả về của hàm mục tiêu, tương ứng.

call là phương thức được khuyến nghị chính thức để gửi ETH bằng cách kích hoạt các chức năng dự phòng hoặc nhận bằng solidity. Không nên gọi một hợp đồng khác bằng một cuộc gọi, bởi vì khi bạn gọi chức năng của một hợp đồng không an toàn, bạn cho nó sáng kiến. Phương pháp được đề xuất vẫn là gọi hàm sau khi khai báo biến hợp đồng, xem Bài giảng 19: Gọi các hợp đồng khác. Nếu chúng ta không biết mã nguồn hoặc ABI của hợp đồng của bên kia, chúng ta không thể tạo biến hợp đồng, nhưng chúng ta vẫn có thể gọi các hàm hợp đồng của bên kia thông qua cuộc gọi.

Quy tắc sử dụng cuộc gọi

Các quy tắc sử dụng cuộc gọi như sau:

Mã hóa nhị phân sử dụng hàm mã hóa có cấu trúc abi.encodeWithSignature để lấy:

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ụ: abi.encodeWithSignature(“f(uint256,address)”, _x, _addr).

Ngoài ra, khi gọi hợp đồng, bạn có thể chỉ định số lượng ETH và gas sẽ được gửi bởi giao dịch:

Nó có vẻ hơi phức tạp, vì vậy hãy lấy một ví dụ về một ứng dụng cuộc gọi.

Hợp đồng mục tiêu

Hãy bắt đầu bằng cách viết một hợp đồng đích đơn giản, OtherContract và triển khai nó, mã về cơ bản giống như trong Bài giảng 19, ngoại trừ việc bổ sung chức năng dự phòng.

Hợp đồng này chứa biến trạng thái x, nhật ký sự kiện được kích hoạt khi nhận được ETH và ba hàm:

getBalance(): Trả về số dư ETH của hợp đồng. setX(): hàm phải trả bên ngoài, có thể đặt giá trị của x và gửi ETH đến hợp đồng. getX(): Đọc giá trị của x.

Sử dụng cuộc gọi để gọi hợp đồng mục tiêu

1. Sự kiện phản hồi

Hãy viết một Call contract để gọi hàm target contract. Trước hết, hãy viết định nghĩa về sự kiện Phản hồi và xuất ra thành công và dữ liệu được trả về bởi cuộc gọi, để chúng ta có thể quan sát giá trị trả về.

2. Gọi hàm setX

Chúng ta định nghĩa hàm callSetX để gọi setX() của hợp đồng đích, chuyển lượng ETH sang msg.value và giải phóng sự kiện Phản hồi để xuất thành công và dữ liệu:

Tiếp theo, chúng ta gọi callSetX để thay đổi biến trạng thái _x thành 5 và các tham số là địa chỉ OtherContract và 5, vì hàm mục tiêu setX() không trả về giá trị, do đó đầu ra dữ liệu của sự kiện Phản hồi là 0x, trống.

3. Gọi hàm getX

Hãy gọi hàm getX(), hàm này sẽ trả về giá trị của hợp đồng đích _x, thuộc loại uint256. Chúng ta có thể sử dụng abi.decode để giải mã giá trị trả về của call, data và đọc ra giá trị.

Từ đầu ra của sự kiện Phản hồi, chúng ta có thể thấy rằng dữ liệu được 0x0000000000000000000000000000000000000000000000000000000000000005. Sau abi.decode, giá trị trả về cuối cùng là 5.

4. Gọi một hàm không tồn tại

Nếu hàm chúng ta nhập vào lệnh gọi không tồn tại trong hợp đồng đích, thì hàm dự phòng của hợp đồng đích sẽ được kích hoạt.

Trong ví dụ trên, chúng ta gọi hàm foo không tồn tại. Cuộc gọi vẫn có thể được thực hiện thành công và trả về thành công, nhưng nó thực sự là chức năng dự phòng của hợp đồng đích được gọi.

Tóm tắt

Trong bài nói chuyện này, chúng tôi đã chỉ ra cách sử dụng lệnh gọi hàm cấp thấp để gọi các hợp đồng khác. Cuộc gọi không phải là phương thức được khuyến nghị để gọi hợp đồng vì nó không an toàn. Nhưng thật hữu ích khi cho phép chúng ta gọi hợp đồng đích mà không biết mã nguồn và ABI.

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