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

Tiêu chuẩn Token Không Phân tách ERC-721

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

Giới thiệu

NFT (Non-Fungible Token, hay Token không thể thay thế) là gì?

Token không thể thay thế (NFT) được dùng để xác định một thứ gì đó hoặc ai đó theo một cách độc nhất. Loại Token này rất phù hợp để sử dụng trên các nền tảng cung cấp các mặt hàng sưu tầm, chìa khóa truy cập, vé xổ số, chỗ ngồi có số cho các buổi hòa nhạc và các trận thể thao, v.v. Tiểu token đặc biệt này có khả năng kinh ngạc, và để tiêu chuẩn hóa tài sản, ERC-721 sẽ giúp chúng xử lý vấn đề này.

ERC-721 là gì?

ERC-721 trình bày các tiêu chuẩn NFT, nói cách khác, kiểu token này là duy nhất và có những giá trị khác nhau mà các token khác không có, dù chúng cùng Hợp đồng Thông Minh, có thể do tuổi tác, độ hiếm, hay thậm chí là thứ gì đó về bề ngoài. Đợi đã, bề ngoài?

Vâng! Tất cả các NFT đều có một biến uint256 gọi là tokenId, vì vậy đối với bất kỳ Hợp đồng ERC-721 nào, cặp địa chỉ hợp đồng, uint256 tokenId phải là duy nhất trên toàn cầu. Dù vậy, một ứng dụng phi tập trung có thể có một "bộ chuyển đổi" sử dụng tokenId làm đầu vào và cho ra hình ảnh của một thứ gì đó thú vị, như thây ma, vũ khí, kỹ năng hoặc những chú mèo tuyệt vời!

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

Nội dung

ERC-721 (Ethereum Request for Comments 721) được đề xuất bởi William Entriken, Dieter Shirley, Jacod Evans, Nastassia Sachs vào tháng 1 năm 2018, là một Tiêu chuẩn Token Không phân tách, thực hiện API cho các tokens trong các Hợp đồng Thông minh.

Nó cung cấp các chức năng như chuyển token từ tài khoản này sang tài khoản khác, lấy số dư token hiện tại của một tài khoản, lấy chủ sở hữu của một token cụ thể và cả tổng cung của token có sẵn trên mạng. Bên cạnh đó, nó cũng có một vài tính năng như chấp thuận lượng token từ tài khoản có thể di chuyển bởi tài khoản bên thứ 3.

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 Không phân tách ERC-721, 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-721 (opens in a new tab):

Các phương thức

1 function balanceOf(address _owner) external view returns (uint256);
2 function ownerOf(uint256 _tokenId) external view returns (address);
3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
6 function approve(address _approved, uint256 _tokenId) external payable;
7 function setApprovalForAll(address _operator, bool _approved) external;
8 function getApproved(uint256 _tokenId) external view returns (address);
9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);
Hiện tất cả

Sự kiện

1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

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 Không phân tách ERC-721 trên Ethereum. Chúng ta chỉ cần Contract Application Binary Interface (ABI), để tạo ra giao diện một token ERC-721 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
2from web3._utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Hợp đồng CryptoKitties
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Bán Đấu giá CryptoKitties
10
11# Đây là một Giao diện nhị phân ứng dụng (ABI) hợp đồng đơn giản hóa của một Hợp đồng NFT ERC-721.
12# Nó sẽ chỉ hiển thị các phương thức: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'name',
23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
28 'name': 'ownerOf',
29 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],
30 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'symbol',
35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': True
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'name': 'pregnantKitties',
50 'outputs': [{'name': '', 'type': 'uint256'}],
51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'name': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)
62name = ck_contract.functions.name().call()
63symbol = ck_contract.functions.symbol().call()
64kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()
65print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# Sử dụng ABI Sự kiện Chuyển để nhận thông tin về các Kitty đã được chuyển.
71tx_event_abi = {
72 'anonymous': False,
73 'inputs': [
74 {'indexed': False, 'name': 'from', 'type': 'address'},
75 {'indexed': False, 'name': 'to', 'type': 'address'},
76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
77 'name': 'Transfer',
78 'type': 'event'
79}
80
81# Chúng ta cần chữ ký của sự kiện để lọc nhật ký
82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
83
84logs = w3.eth.get_logs({
85 "fromBlock": w3.eth.block_number - 120,
86 "address": w3.to_checksum_address(ck_token_addr),
87 "topics": [event_signature]
88})
89
90# Lưu ý:
91# - Tăng số khối lên từ 120 nếu không có sự kiện Chuyển nào được trả về.
92# - Nếu bạn không tìm thấy bất kỳ sự kiện Chuyển nào, bạn cũng có thể thử lấy tokenId tại:
93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# Nhấp để mở rộng nhật ký của sự kiện và sao chép đối số "tokenId" của nó
95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
96
97if recent_tx:
98 kitty_id = recent_tx[0]['tokenId'] # Dán "tokenId" từ liên kết trên vào đây
99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")
Hiện tất cả

Hợp đồng CryptoKitties có vài Sự kiện thú vị hơn các hợp đồng Tiêu chuẩn

Hãy kiểm tra hai trong số chúng, PregnantBirth.

1# Sử dụng ABI Sự kiện Mang thai và Sinh để nhận thông tin về các Kitty mới.
2ck_extra_events_abi = [
3 {
4 'anonymous': False,
5 'inputs': [
6 {'indexed': False, 'name': 'owner', 'type': 'address'},
7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
10 'name': 'Pregnant',
11 'type': 'event'
12 },
13 {
14 'anonymous': False,
15 'inputs': [
16 {'indexed': False, 'name': 'owner', 'type': 'address'},
17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
21 'name': 'Birth',
22 'type': 'event'
23 }]
24
25# Chúng ta cần chữ ký của sự kiện để lọc nhật ký
26ck_event_signatures = [
27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# Đây là một Sự kiện Mang thai:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_logs = w3.eth.get_logs({
34 "fromBlock": w3.eth.block_number - 120,
35 "address": w3.to_checksum_address(ck_token_addr),
36 "topics": [ck_event_signatures[0]]
37})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# Đây là một Sự kiện Sinh:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_logs = w3.eth.get_logs({
44 "fromBlock": w3.eth.block_number - 120,
45 "address": w3.to_checksum_address(ck_token_addr),
46 "topics": [ck_event_signatures[1]]
47})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
Hiện tất cả
  • Etherscan NFT Tracker (opens in a new tab) liệt kê các NFT hàng đầu trên Ethereum theo khối lượng chuyển nhượng.
  • CryptoKitties (opens in a new tab) là một trò chơi tập trung vào các sinh vật có thể nhân giống, sưu tầm và vô cùng đáng yêu mà chúng ta gọi là CryptoKitties.
  • Sorare (opens in a new tab) là một trò chơi bóng đá giả tưởng toàn cầu, nơi bạn có thể thu thập các vật phẩm sưu tầm phiên bản giới hạn, quản lý đội của mình và thi đấu để giành giải thưởng.
  • Dịch vụ Định danh Ethereum (ENS) (opens in a new tab) cung cấp một cách an toàn và phi tập trung để định địa chỉ các tài nguyên cả trong và ngoài chuỗi khối bằng cách sử dụng các tên đơn giản, con người có thể đọc được.
  • POAP (opens in a new tab) cung cấp NFT miễn phí cho những người tham dự sự kiện hoặc hoàn thành các hành động cụ thể. POAP có thể được tạo và phân phối miễn phí.
  • Unstoppable Domains (opens in a new tab) là một công ty có trụ sở tại San Francisco chuyên xây dựng các tên miền trên chuỗi khối. Các tên miền chuỗi khối thay thế các địa chỉ tiền mã hóa bằng các tên mà con người có thể đọc được và có thể được sử dụng để cho phép các trang web chống kiểm duyệt.
  • Gods Unchained Cards (opens in a new tab) là một TCG (Trò chơi thẻ bài giao dịch) trên chuỗi khối Ethereum, sử dụng NFT để mang lại quyền sở hữu thực sự cho các tài sản trong trò chơi.
  • Bored Ape Yacht Club (opens in a new tab) là một bộ sưu tập gồm 10.000 NFT độc nhất. Đây vừa là một tác phẩm nghệ thuật hiếm có thể chứng minh được, vừa hoạt động như một token thành viên của câu lạc bộ, cung cấp các đặc quyền và lợi ích cho thành viên, những lợi ích này sẽ tăng dần theo thời gian nhờ vào nỗ lực của cộng đồng.

Đọc thêm

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