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
Partnered With:

Giới thiệu đơn giản về sự vững chắc|Bài 22: Gọi

Đọc bài viết này mất 10 phút
Bài viết này giới thiệu cách sử dụng lệnh gọi, một hàm cấp thấp, để gọi các hợp đồng khác.
Tiêu đề gốc: " Giới thiệu tối giản về Solidity: 22. Call 》
Tác giả gốc: 0xAA  "Giới thiệu tối giản" dành cho người mới bắt đầu (chuyên gia lập trình có thể tìm hướng dẫn khác), với 1-3 bài giảng được cập nhật 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


Trong Bài giảng 17: Gửi ETH, chúng tôi đã giới thiệu cách sử dụng lệnh gọi để gửi ETH, trong bài giảng này chúng tôi sẽ giới thiệu cách sử dụng lệnh gọi để gọi hợp đồng.


Gọi


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


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


Quy tắc sử dụng lệnh gọi


Quy tắc sử dụng lệnh gọi như sau:



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ý hàm là "tên hàm (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).


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



Có vẻ hơi phức tạp. Hãy cùng thực hiện nhé. lấy một ứng dụng cuộc gọi bên dưới.


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


Trước tiên, chúng tôi viết một hợp đồng mục tiêu đơn giản OtherContract và triển khai nó. Mã giống như bài giảng 19 về cơ bản là giống bài 19, ngoại trừ 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 thanh toán bên ngoài, bạn có thể đặt giá trị của x và gửi ETH vào hợp đồng. getX(): Đọc giá trị của x.


Sử dụng lệnh gọi để gọi hợp đồng đích


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


Chúng ta viết hợp đồng Call để gọi hàm hợp đồng mục tiêu. Đầu tiên, viết định nghĩa về sự kiện Phản hồi và xuất ra kết quả thành công cũng như dữ liệu được cuộc gọi trả về để 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 số lượng ETH trong msg .value và Phát hành dữ liệu và thành công đầu ra của sự kiện Phản hồi:



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 đích setX() không có giá trị trả về nên dữ liệu đầu ra bởi sự kiện Phản hồi là 0x, trống.


3. Gọi hàm getX


Tiếp theo chúng ta gọi hàm getX(), hàm này sẽ trả về Giá trị của hợp đồng đích_x, loại là uint256. Chúng ta có thể sử dụng abi.decode để giải mã dữ liệu giá trị trả về của cuộc gọi và đọc giá trị.



Từ đầu ra của sự kiện Phản hồi, chúng ta có thể thấy dữ liệu đó là 0x0000000000000000000000000000000000000000000000000000000000000000000005. 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 ta nhập để gọi không tồn tại Đối với hợp đồng mục tiêu, khi đó chức năng dự phòng của hợp đồng mục tiêu sẽ được kích hoạt.



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


Tóm tắt


Trong bài giảng này, chúng tôi đã giới thiệu cách sử dụng lệnh gọi hàm cấp thấp để gọi các hợp đồng khác. call không phải là cách được khuyến nghị để gọi hợp đồng vì nó không an toàn. Nhưng nó cho phép chúng ta gọi hợp đồng đích mà không cần biết mã nguồn và ABI, điều này rất hữu í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

举报 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