Tiêu đề gốc: " Giới thiệu đơn giản về Solidity: 27. Mã hóa và giải mã ABI 》
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
ABI  ;(Giao diện nhị phân ứng dụng, Giao diện nhị phân ứng dụng) là tiêu chuẩn để tương tác với các hợp đồng thông minh Ethereum. Dữ liệu được mã hóa dựa trên loại của chúng; và vì mã hóa không chứa thông tin về loại nên loại của chúng cần được lưu ý khi giải mã.
Trong Solidity, mã hóa ABI có bốn chức năng: abi.encode, abi.encodePacked, abi.encodeWithSignature, abi.encodeWithSelector. Giải mã ABI có một chức năng: abi.decode, được sử dụng để giải mã dữ liệu abi.encode. Trong bài học này chúng ta sẽ học cách sử dụng các hàm này.
Chúng ta sẽ sử dụng mã hóa 4 biến, loại của chúng là uint256 , địa chỉ, chuỗi, uint256[2]:

Mã hóa các tham số đã cho bằng cách sử dụng quy tắc ABI. ABI được thiết kế để tương tác với các hợp đồng thông minh, chuyển đổi từng tham số thành 32 byte dữ liệu và ghép chúng lại với nhau. Nếu bạn muốn tương tác với hợp đồng, bạn cần sử dụng abi.encode.

p>
Kết quả mã hóa là 0x0000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000007a58c0be72be218b41c60 8b7fe7c5bb630736c71000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000050000 0000000000000000000000000000000000000000000000000000000000060000000000000000000000 000000000000000000000000430000000000000000 000000000000000000000000000000000000000000, vì abi.encode đệm mỗi dữ liệu thành 32 byte với nhiều số 0 ở giữa.
Mã hóa tham số đã cho theo không gian yêu cầu tối thiểu của nó. Nó tương tự như abi.encode nhưng bỏ qua nhiều số 0 được điền vào. Ví dụ: chỉ 1 byte được sử dụng để mã hóa loại uint. Bạn có thể sử dụng abi.encodePacked khi bạn muốn tiết kiệm dung lượng và không tương tác với hợp đồng, chẳng hạn như khi tính toán hàm băm của một số dữ liệu.

p>
Kết quả mã hóa là 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000005 abi.encodePacked nén mã hóa và ngắn hơn nhiều so với abi.encode.
Hàm này tương tự như abi.encode, ngoại trừ tham số đầu tiên là hàm chữ ký. Ví dụ: "foo(uint256,address)". Có thể được sử dụng khi gọi các hợp đồng khác.

p>
Kết quả được mã hóa là 0xe87082f100000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000007a58c0be72be218b41c 6 08b7fe7c5bb630736c710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000 0000000000000000000000000, tương đương với việc thêm bộ chọn hàm 4 byte trước kết quả mã hóa abi.encode.
Tương tự như abi.encodeWithSignature, ngoại trừ tham số đầu tiên là bộ chọn hàm, 4 byte đầu tiên của hàm băm Keccak của chữ ký hàm.

p>
Kết quả được mã hóa là 0xe87082f100000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000007a58c0be72be218b41c 6 08b7fe7c5bb630736c710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000 00000000000000000000000000, kết quả tương tự như abi.encodeWithSignature.
abi.decode được sử dụng để giải mã mã hóa nhị phân do abi.encode tạo ra và khôi phục nó về các tham số ban đầu.

p>
Chúng ta nhập mã nhị phân của abi.encode để giải mã, các thông số gốc sẽ được giải mã:

abi.decode giải mã mã byte
p>
Trong Ethereum, dữ liệu phải được mã hóa thành mã byte để tương tác với hợp đồng thông minh. Trong bài giảng này chúng tôi đã giới thiệu 4 phương pháp mã hóa abi và 1 phương pháp giải mã abi.
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