Nhảy đến nội dung chính
Change page

Tiêu chuẩn token ERC-20

Lần cập nhật trang lần cuối: 26 tháng 2, 2026

Giới thiệu

Token là gì?

Token đại diện cho bất kỳ thứ gì trên Ethereum:

  • Điểm danh tiếng trên nền tảng online
  • Kỹ năng của nhân vật trong game
  • Tài sản tài chính như cổ phần của một công ty
  • Tiền pháp định như USD chẳng hạn
  • Một ounce vàng (khoảng 31 gram)
  • và nhiều thứ khác

Một tính năng mạnh mẽ như vậy của Ethereum chắc chắn phải được quản lý bằng một tiêu chuẩn vững chắc, đúng chứ? Đó chính xác là những gì ERC-20 đang thực hiện. Tiêu chuẩn này cho phép các nhà phát triển xây dựng các ứng dụng token có khả năng tương tác với các sản phẩm và dịch vụ khác. Tiêu chuẩn ERC-20 cũng được sử dụng để cung cấp chức năng bổ sung cho .

ERC-20 là gì?

ERC-20 đặt ra một tiêu chuẩn cho các token có thể thay thế, nghĩa là mỗi token giống hệt nhau về loại và giá trị. Ví dụ, một Token ERC-20 hoạt động giống như ETH, có nghĩa là 1 Token luôn và sẽ luôn bằng tất cả các Token khác.

Điều kiện tiên quyết

Nội dung

ERC-20 (Ethereum Requests for Comments 20), được dự thảo bởi Fabian Vogelsteller vào tháng 11/2015, là một tiêu chuẩn token thực thi API cho token trong Hợp đồng Thông minh.

Ví dụ một số chức năng ERC-20 cung cấp:

  • gửi các token từ một tài khoản này đến một tài khoản khác
  • lấy thông tin số lượng token của tài khoản
  • lấy tổng cung của token đang có trên mạng
  • phê duyệt xem tài khoản của bên thứ ba có thể sử dụng token từ tài khoản hay không

Nếu một Hợp đồng Thông minh có thể thực thi các phương thức và sự kiện bên dưới, chúng được gọi là Hợp đồng Token ERC-20, khi triển khai, chúng sẽ có trách nhiệm duy trì các token được tạo trên Ethereum.

Từ EIP-20 (opens in a new tab):

Các phương thức

1function name() public view returns (string)
2function symbol() public view returns (string)
3function decimals() public view returns (uint8)
4function totalSupply() public view returns (uint256)
5function balanceOf(address _owner) public view returns (uint256 balance)
6function transfer(address _to, uint256 _value) public returns (bool success)
7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
8function approve(address _spender, uint256 _value) public returns (bool success)
9function allowance(address _owner, address _spender) public view returns (uint256 remaining)
Hiện tất cả

Sự kiện

1event Transfer(address indexed _from, address indexed _to, uint256 _value)
2event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Ví dụ

Hãy xem Tiêu chuẩn quan trọng như thế nào để giúp mọi thứ trở nên đơn giản với chúng ta khi kiểm tra Hợp đồng Token ERC-20 trên Ethereum. Chúng ta chỉ cần Contract Application Binary Interface (ABI), để tạo ra giao diện một token ERC-20 bất kỳ. Như bạn cũng thấy ở dưới, chúng ta sẽ dùng một ABI đơn giản, khiến nó trở thành một ví dụ có tính ma sát thấp.

Ví dụ về Web3.py

Đầu tiên, hãy đảm bảo rằng bạn đã cài đặt thư viện Python Web3.py (opens in a new tab):

1pip install web3
1from web3 import Web3
2
3
4w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
5
6dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Ether được bọc (WETH)
8
9acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
10
11# Đây là Giao diện nhị phân ứng dụng (ABI) hợp đồng được đơn giản hóa của một Hợp đồng Token ERC-20.
12# Nó sẽ chỉ hiển thị các phương thức: balanceOf(address), decimals(), symbol() và totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'decimals',
23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [],
28 'name': 'symbol',
29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
30 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'totalSupply',
35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 }
38]
39
40dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
41symbol = dai_contract.functions.symbol().call()
42decimals = dai_contract.functions.decimals().call()
43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
45
46# DAI
47print("===== %s =====" % symbol)
48print("Total Supply:", totalSupply)
49print("Addr Balance:", addr_balance)
50
51weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
52symbol = weth_contract.functions.symbol().call()
53decimals = weth_contract.functions.decimals().call()
54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
56
57# WETH
58print("===== %s =====" % symbol)
59print("Total Supply:", totalSupply)
60print("Addr Balance:", addr_balance)
Hiện tất cả

Các vấn đề đã biết

Sự cố nhận token ERC-20

Tính đến ngày 20/06/2024, ít nhất 83.656.418 USD giá trị token ERC-20 đã bị mất do sự cố này. Lưu ý rằng việc triển khai ERC-20 thuần túy dễ gặp phải vấn đề này trừ khi bạn triển khai một tập hợp các hạn chế bổ sung bên trên tiêu chuẩn như được liệt kê dưới đây.

Khi các token ERC-20 được gửi đến một hợp đồng thông minh không được thiết kế để xử lý các token ERC-20, những token đó có thể bị mất vĩnh viễn. Điều này xảy ra bởi vì hợp đồng nhận không có chức năng nhận diện hoặc phản hồi với các token đến, và không có cơ chế nào trong tiêu chuẩn ERC-20 để thông báo cho hợp đồng nhận về các token được gửi đến. Lý do chính mà vấn đề này thể hiện là qua:

  1. Cơ chế chuyển đổi token
  • Các token ERC-20 được chuyển đổi bằng cách sử dụng các hàm transfer hoặc transferFrom.
    • Khi một người dùng gửi token đến địa chỉ hợp đồng bằng cách sử dụng những hàm này, token sẽ được chuyển giao bất kể hợp đồng nhận có được thiết kế để xử lý chúng hay không.
  1. Thất thoát thông báo
    • Hợp đồng nhận không nhận thông báo hoặc cuộc gọi lại rằng các token đã được gửi đến nó.
    • Nếu hợp đồng nhận thiếu cơ chế để xử lý token (ví dụ: một hàm fallback hoặc một hàm chuyên dụng để quản lý việc nhận token), các token sẽ bị mắc kẹt trong địa chỉ của hợp đồng.
  2. Không tích hợp xử lý sẵn
    • Chuẩn ERC-20 không có một hàm bắt buộc nào cho các hợp đồng nhận tiền phải thực hiện, dẫn đến việc nhiều hợp đồng không thể quản lý các token đến một cách đúng đắn.

Các giải pháp khả thi

Mặc dù không thể ngăn chặn hoàn toàn vấn đề này với ERC-20, nhưng có vài cách cho phép giảm đáng kể khả năng mất tokens cho người dùng:

  • Vấn đề phổ biến nhất là khi người dùng gửi token đến chính địa chỉ hợp đồng token (ví dụ: USDT được gửi vào địa chỉ của hợp đồng token USDT). Khuyến nghị hạn chế hàm transfer(...) để hoàn tác các nỗ lực chuyển tiền như vậy. Cân nhắc thêm kiểm tra require(_to != address(this)); trong quá trình triển khai hàm transfer(...).
  • Nhìn chung, hàm transfer(...) không được thiết kế để gửi token vào các hợp đồng. chấp thuận(..) Thay vào đó, mẫu transferFrom(...)được sử dụng để gửi token ERC-20 vào các hợp đồng. Có thể hạn chế hàmtransfer(...)để không cho phép gửi token vào bất kỳ hợp đồng nào bằng hàm đó, tuy nhiên, điều này có thể phá vỡ tính tương thích với các hợp đồng giả định rằng token có thể được gửi vào các hợp đồng bằng hàmtrasnfer(...)` (ví dụ: các bể thanh khoản Uniswap).
  • Luôn luôn giả định rằng các token ERC-20 có thể xuất hiện trong hợp đồng của bạn, ngay cả khi hợp đồng của bạn không được thiết kế để nhận bất kỳ token nào. Không thể ngăn chặn hoặc từ chối các khoản tiền gửi không mong muốn từ phía người nhận. Nên thực hiện một chức năng cho phép trích xuất các token ERC-20 được gửi nhầm.
  • Hãy xem xét việc sử dụng các chuẩn token khác.

Một số tiêu chuẩn thay thế đã ra đời từ vấn đề này, chẳng hạn như ERC-223 hoặc ERC-1363.

Đọc thêm

Các tiêu chuẩn token có thể thay thế khác

Bài viết này hữu ích không?