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 tối giản về Solidity|Bài 27: Mã hóa và giải mã ABI

Đọc bài viết này mất 10 phút
Bài viết này giới thiệu 4 phương pháp mã hóa abi và 1 phương pháp giải mã abi.
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.


Mã hóa ABI


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]:



abi.encode


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.



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.


abi.encodePacked


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.



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.


abi.encodeWithSignature


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.



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.


abi.encodeWithSelector


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.



Kết quả được mã hóa là 0xe87082f100000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000007a58c0be72be218b41c 6 08b7fe7c5bb630736c710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000 00000000000000000000000000, kết quả tương tự như abi.encodeWithSignature.


Giải mã ABI 


abi.decode


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.



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


Tóm tắt


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

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