Khóa học blockchain

Kiến Trúc ABI trong Contract ABI Specification

0 phút đọc

Trong lĩnh vực blockchain và đặc biệt là trong phát triển hợp đồng thông minh, Application Binary Interface (ABI) là một khái niệm cốt lõi không thể bỏ qua. ABI đóng vai trò như một cầu nối giữa các hợp đồng thông minh được viết bằng ngôn ngữ lập trình cao cấp như Solidity và máy ảo Ethereum (EVM) mà chúng chạy trên đó. Bài viết này sẽ đi sâu vào kiến trúc của ABI, cách nó được sử dụng để tương tác với hợp đồng thông minh, và các ví dụ cụ thể về cách thức hoạt động của nó.

Khái Niệm về ABI

ABI là viết tắt của Application Binary Interface, một tiêu chuẩn cho phép các hàm trong hợp đồng thông minh được gọi bởi các ứng dụng bên ngoài blockchain và cho phép các hợp đồng tương tác với nhau. ABI xác định cách mà dữ liệu được mã hóa và giải mã khi gửi giữa các ứng dụng và hợp đồng thông minh

Tầm Quan Trọng của ABI

ABI là một phần thiết yếu trong việc đảm bảo rằng các hợp đồng thông minh có thể giao tiếp một cách hiệu quả với thế giới bên ngoài. Nó không chỉ giúp định dạng dữ liệu để phù hợp với yêu cầu của EVM mà còn đảm bảo tính tương thích giữa các hợp đồng thông minh khác nhau và giữa hợp đồng thông minh với các ứng dụng bên ngoài

Cấu Trúc của ABI

Function Selector

Mỗi hàm trong hợp đồng thông minh có một bộ chọn hàm (function selector), là bốn byte đầu tiên của dữ liệu gọi hàm. Bộ chọn này được tạo ra bằng cách lấy hash Keccak-256 của chữ ký hàm và sau đó lấy bốn byte đầu tiên của hash này. Chữ ký của hàm bao gồm tên hàm và danh sách các kiểu tham số, được phân tách bởi dấu phẩy và không có khoảng trắng

Mã Hóa Đối Số

Bắt đầu từ byte thứ năm, các đối số được mã hóa theo sau. Cách mã hóa này cũng được sử dụng trong các trường hợp khác như giá trị trả về và cũng trong các sự kiện. Các kiểu dữ liệu như bytes, string, và các mảng động được mã hóa theo cách đặc biệt để đảm bảo rằng chúng có thể được giải mã một cách chính xác

JSON ABI

Định dạng JSON của ABI bao gồm một mảng các mô tả hàm và sự kiện. Mỗi mô tả hàm là một đối tượng JSON với các trường như type, inputs, outputs, name, và stateMutability. Điều này giúp cho việc phân tích và sử dụng ABI trở nên dễ dàng hơn, đồng thời cung cấp một cách thức chuẩn mực để tương tác với hợp đồng thông minh

Ví Dụ Minh Họa

Giả sử chúng ta có một hợp đồng thông minh với một hàm setNumber như sau trong Solidity:

pragma solidity ^0.8.0;

contract SimpleStorage {
    uint public num;

    function setNumber(uint _num) public {
        num = _num;
    }
}

Tạo ABI

Khi hợp đồng này được biên dịch, một file JSON ABI sẽ được tạo ra, trong đó có mô tả cho hàm setNumber. Mô tả này sẽ trông như sau:

{
  "inputs": [
    {
      "internalType": "uint256",
      "name": "_num",
      "type": "uint256"
    }
  ],
  "name": "setNumber",
  "outputs": [],
  "stateMutability": "nonpayable",
  "type": "function"
}

Gọi Hàm thông qua Web3.js

Để gọi hàm này từ một ứng dụng web sử dụng Web3.js, bạn cần mã hóa cuộc gọi sử dụng ABI và địa chỉ của hợp đồng. Đoạn mã sau đây minh họa cách thực hiện điều này:

const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');

const contractABI = [/* ABI JSON */];
const contractAddress = '0x123...abc';

const contract = new web3.eth.Contract(contractABI, contractAddress);

async function setNumber(num) {
    const accounts = await web3.eth.getAccounts();
    await contract.methods.setNumber(num).send({ from: accounts[0] });
}

setNumber(42);

Trong đoạn mã trên, chúng ta tạo một instance của hợp đồng thông minh sử dụng ABI và địa chỉ của nó, sau đó gọi hàm setNumber với giá trị 42.

Kết Luận

ABI là một thành phần không thể thiếu trong việc phát triển và tương tác với hợp đồng thông minh trên Ethereum. Nó không chỉ giúp định dạng và mã hóa dữ liệu một cách chính xác mà còn đảm bảo rằng các ứng dụng bên ngoài có thể giao tiếp hiệu quả với hợp đồng thông minh. Hiểu rõ về cấu trúc và cách thức hoạt động của ABI sẽ giúp các nhà phát triển blockchain tạo ra các ứng dụng an toàn, hiệu quả và dễ dàng tương tác với hệ sinh thái Ethereum.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Các công ty nổi tiếng sử dụng kiến trúc Microservices?

entry

Bạn có thể giải thích sự khác nhau giữa cấu trúc tập tin và cấu trúc lưu trữ?

entry

Khi nào sử dụng căn chỉnh trục chính và căn chỉnh trục phụ?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely