Khi bạn viết smart contract bằng Solidity và triển khai lên Ethereum, việc đầu tiên cần làm là dịch mã nguồn Solidity. Tiếp theo, Solidity compiler (đặc biệt là solc) sẽ “biên dịch” hợp đồng thành hai thành phần quan trọng: Bytecode và ABI (Application Binary Interface). Dưới đây mình sẽ đi sâu hơn vào 2 khái niệm này.
Bytecode là gì?
Bytecode là phiên bản đã được biên dịch của smart contract, dưới dạng chuỗi nhị phân (thường hiển thị ở định dạng hexadecimal) mà Ethereum Virtual Machine (EVM) có thể đọc và thực thi. Một khi đã biên dịch, đoạn mã Solidity gốc sẽ không còn giữ nguyên dạng con người có thể đọc được nữa.
Trong bytecode, mọi chức năng của smart contract được chuyển thành opcode — tức là những chỉ thị máy cực kỳ ngắn gọn mà EVM hiểu và xử lý.
Bytecode được chia thành 2 loại:
- Creation bytecode: Đây là đoạn mã chứa constructor và các thông tin cần thiết để triển khai (deploy) smart contract. Creation bytecode chỉ chạy một lần duy nhất khi bạn deploy hợp đồng lên blockchain.
- Runtime bytecode: Sau khi hợp đồng được triển khai thành công, chỉ phần runtime bytecode mới được lưu vĩnh viễn trên blockchain. Runtime bytecode chính là phần code thực thi các chức năng của smart contract sau này.
Có thể bạn quan tâm: Payable function trong Solidity
ABI là gì trong Solidity?
ABI (Application Binary Interface) trong Solidity có thể hiểu đơn giản là “cầu nối” giữa con người (hoặc ứng dụng) và bộ máy EVM.
Khi một smart contract được triển khai, ABI sẽ mô tả toàn bộ danh sách các hàm, sự kiện và kiểu dữ liệu mà contract đó cung cấp, dưới dạng một file JSON. Đây chính là bản “hướng dẫn” để các phần mềm bên ngoài biết cách tương tác với smart contract.
Nói ngắn gọn:
- Frontend (như giao diện web hoặc app) sẽ dựa vào ABI để biết có những hàm nào, tham số ra sao, từ đó gửi yêu cầu đúng cách.
- EVM thì nhận dữ liệu đã được “mã hóa” theo chuẩn ABI để thực thi các hành động bên trong blockchain.
Không có ABI, frontend không thể gọi được các hàm của smart contract, và EVM cũng không hiểu dữ liệu bạn gửi vào cần xử lý thế nào.
Vậy ABI Solidity và API khác nhau như thế nào?
Trong Web2, API (Application Programming Interface) là cầu nối giúp client (ví dụ trình duyệt, app) giao tiếp với server. Còn trong Web3, ABI (Application Binary Interface) đóng vai trò kết nối giữa ứng dụng (hoặc smart contract khác) với mã bytecode của contract trên blockchain.
Nói một cách dễ hiểu: ABI chính là “API của blockchain”. Tuy nhiên, có một điểm khác biệt quan trọng — dữ liệu trên blockchain không phải dạng văn bản dễ đọc mà là chuỗi nhị phân (hexadecimal), nên cần có ABI để “dịch” đúng cách
Solidity ABI Encoding và Decoding là gì?
- ABI Encoding: Khi bạn muốn gọi một hàm trong smart contract, ABI sẽ mã hóa tên hàm và các tham số thành chuỗi hex để EVM có thể hiểu và xử lý.
- ABI Decoding: Khi EVM thực thi xong và trả kết quả (dưới dạng hex), ABI sẽ giải mã ngược lại thành dạng dữ liệu mà con người hoặc ứng dụng frontend có thể đọc được.
Toàn bộ quá trình encode và decode này thường được tự động thực hiện bởi Solidity compiler hoặc thư viện hỗ trợ như ethers.js.
Quy trình giao dịch với ABI Contract
- Frontend đọc định dạng ABI và chọn function muốn gọi.
- Frontend encode function call + tham số và gửi đi thông qua transaction.
- Node Ethereum nhận transaction, xử lý, sinh receipt trie chứa log và gas fee.
Trong receipt trie, Ethereum lưu trữ thông tin:
- Trạng thái transaction.
- Gas tiêu thụ.
- Các log events.
- Bloom filter tổng hợp.
Đọc thêm: Cách deploy smart contract trên Polygon
Ví dụ: Chuyển ERC-20 Token
Giả sử ta muốn chuyển token ERC-20:
transfer(address to, uint amount) external;
Frontend sử dụng ABI để encode lệnh “transfer”, EVM đọc opcode, thực thi chuyển token, rồi ABI decode trả về kết quả thành công.
ABI to Interface Solidity và cách convert ABI to Solidity
Khi bạn đã có file ABI của một smart contract, bạn hoàn toàn có thể chuyển ABI thành Interface trong Solidity để dễ dàng import và tương tác trong dự án của mình.
Một số công cụ phổ biến hỗ trợ chuyển đổi này là:
- OpenZeppelin Wizard: Giao diện đơn giản để tạo nhanh interface từ ABI.
- Hardhat plugin
hardhat-abi-exporter
: Tự động xuất ABI khi compile, và bạn có thể dùng để tạo file interface.
Việc convert ABI to Solidity giúp bạn có được một bản interface chuẩn, dễ dàng gọi hàm, kiểm tra kiểu dữ liệu, và tận dụng type checking trong IDE.
Kết luận
Hiểu rõ về Application Binary Interface (ABI) sẽ giúp bạn viết dApps và smart contracts trên Ethereum một cách chính xác và hiệu quả hơn. ABI không chỉ đơn thuần là “cầu nối” giữa con người và máy móc, mà còn là chìa khóa để Solidity có thể giao tiếp trơn tru với EVM. Nếu bạn muốn nâng trình hơn nữa, mình khuyên bạn nên tìm hiểu thêm về Solidity Interface — một khái niệm cực kỳ quan trọng trong việc để các smart contract “nói chuyện” với nhau trên blockchain!
Bài viết liên quan: