ERC-721 là gì?

Trả lời nhanh: ERC-721 là chuẩn giao diện cho hợp đồng thông minh trên Ethereum, dùng để tạo token không thể thay thế (NFT). Mỗi token có một mã tokenId riêng và tại mỗi thời điểm chỉ có một chủ sở hữu. Chuẩn quy định cách tra cứu chủ sở hữu, chuyển nhượng và uỷ quyền.

Điểm chính

  • ERC-721 không phải là một NFT hay một đồng coin. Nó là bộ quy ước về hàm và sự kiện mà hợp đồng phải có.
  • Lõi của chuẩn là bảng ghi tokenId thuộc về địa chỉ ví nào, cùng ba sự kiện Transfer, Approval và ApprovalForAll.
  • Ảnh hoặc tệp của NFT thường nằm ngoài chuỗi. Trên chuỗi chỉ có tokenId và đường dẫn tokenURI.
  • Rủi ro thực tế nằm ở quyền uỷ quyền, metadata đổi được và lỗi trong mã hợp đồng, không nằm ở bản thân chuẩn.
Mục lục
  1. ERC-721 là gì và viết tắt của gì?
  2. ERC-721 vận hành thế nào bên trong hợp đồng?
  3. Giao diện ERC-721 gồm những hàm và sự kiện nào?
  4. safeTransferFrom khác transferFrom ở điểm nào?
  5. Dữ liệu của NFT nằm ở đâu: trên chuỗi hay ngoài chuỗi?
  6. ERC-721 khác ERC-20 và ERC-1155 thế nào?
  7. Ví dụ thực tế dùng ERC-721 là gì?
  8. Doanh nghiệp Việt Nam có thể dùng ERC-721 vào việc gì?
  9. Rủi ro khi dùng token ERC-721 là gì?
  10. Khi nào nên và không nên chọn ERC-721?
  11. Câu hỏi thường gặp

ERC-721 là gì và viết tắt của gì?

ERC là viết tắt của Ethereum Request for Comments. Số 721 chỉ là mã định danh được gán cho đề xuất. Theo mô tả trên Wikipedia, chuẩn được công bố chính thức năm 2018 và ghi nhận cho William Entriken cùng các đồng tác giả Dieter Shirley, Jacob Evans và Nastassia Sachs. Dự án CryptoKitties là nơi chuẩn này được áp dụng đầu tiên.

Nói gọn: ERC-721 là bản “hợp đồng mẫu về giao diện”. Bất kỳ hợp đồng thông minh nào cài đủ các hàm và sự kiện theo mẫu đều được gọi là hợp đồng ERC-721. Ví, sàn giao dịch NFT và ứng dụng khác nhờ vậy có thể đọc và chuyển NFT mà không cần viết mã riêng cho từng dự án.

Điểm khác với token thông thường nằm ở đơn vị quản lý. Hợp đồng ERC-721 không đếm “bao nhiêu đơn vị”, mà quản lý từng tokenId. Nếu bạn cần khái niệm NFT ở góc độ thị trường và rủi ro, hãy đọc bài về token không thể thay thế. Bài này tập trung vào phần chuẩn kỹ thuật.

ERC-721 vận hành thế nào bên trong hợp đồng?

Có thể hình dung hợp đồng ERC-721 như một cuốn sổ có hai cột: mã tokenId và địa chỉ ví đang sở hữu. Hàm ownerOf(tokenId) đọc cột bên phải, hàm balanceOf(địa chỉ) đếm số dòng thuộc về một ví. Khi chuyển nhượng, hợp đồng sửa dòng tương ứng và phát ra sự kiện Transfer để các công cụ lập chỉ mục biết có thay đổi.

Sơ đồ bảng sở hữu của hợp đồng ERC-721: tokenId 1 thuộc ví A, tokenId 2 thuộc ví B, tokenId 3 thuộc ví A. Mỗi tokenId chỉ trỏ tới một ví.
Sơ đồ khái niệm: một ví có thể giữ nhiều token, nhưng mỗi tokenId chỉ có một chủ. Ví dụ minh hoạ.

Giao diện ERC-721 gồm những hàm và sự kiện nào?

Theo đặc tả EIP-721 và tài liệu của ethereum.org, hợp đồng phải cài các hàm sau:

Thành phần Loại Tác dụng
balanceOf(owner) Đọc Đếm số NFT một địa chỉ đang giữ
ownerOf(tokenId) Đọc Trả về địa chỉ chủ của một tokenId
safeTransferFrom (có và không có tham số data) Ghi Chuyển token và kiểm tra bên nhận
transferFrom Ghi Chuyển token, không kiểm tra bên nhận
approve(to, tokenId) Ghi Cho một địa chỉ quyền chuyển đúng một token
setApprovalForAll(operator, approved) Ghi Cho một operator quyền với mọi token của bạn trong hợp đồng này
getApproved, isApprovedForAll Đọc Tra cứu các quyền đã cấp
Transfer, Approval, ApprovalForAll Sự kiện Ghi nhật ký để sàn và công cụ lập chỉ mục theo dõi

Hai phần mở rộng là tuỳ chọn: Metadata (name, symbol, tokenURI) và Enumeration (liệt kê token). Hợp đồng còn khai báo hỗ trợ giao diện qua ERC-165. Mã giao diện của ERC-721 là 0x80ac58cd, theo bảng tổng hợp chuẩn NFT của một tài liệu kỹ thuật công khai. Ứng dụng dùng mã này để kiểm tra một địa chỉ có phải hợp đồng ERC-721 hay không.

Ba hướng được phép khởi tạo chuyển nhượng theo EIP-721: chủ sở hữu, địa chỉ được duyệt cho token đó, hoặc operator được chủ uỷ quyền. Nhờ vậy sàn NFT có thể chuyển token khi có người mua, nhưng chỉ khi bạn đã cấp quyền trước.

Các hàm này thường được viết bằng ngôn ngữ Solidity. Phần lớn dự án không tự viết từ đầu mà kế thừa thư viện OpenZeppelin. Thư viện này đã có sẵn ERC721, ERC721URIStorage và các hàm nội bộ như _safeMint.

safeTransferFrom khác transferFrom ở điểm nào?

Đây là chi tiết mà bài giới thiệu hay bỏ qua, nhưng nó giải thích vì sao ERC-721 có hai hàm chuyển. Với transferFrom, nếu bạn gửi token tới địa chỉ của một hợp đồng không biết cách xử lý NFT, token vẫn được ghi cho địa chỉ đó và có thể bị kẹt vĩnh viễn. safeTransferFrom hỏi trước: nếu bên nhận là hợp đồng, nó phải cài hàm onERC721Received và trả về đúng giá trị. Nếu không, giao dịch bị huỷ.

Sơ đồ safeTransferFrom: người gửi gọi hàm, hợp đồng kiểm tra bên nhận, sau đó ba nhánh: ví thường thì chuyển, hợp đồng hỗ trợ thì chuyển
Sơ đồ cơ chế theo đặc tả EIP-721, minh hoạ lại bằng ba nhánh kết quả.

Lưu ý thực tế: transferFrom vẫn là hàm hợp lệ trong chuẩn, và nhiều giao diện sàn vẫn gọi nó. Khi tự chuyển NFT sang hợp đồng, bạn nên ưu tiên đường đi có kiểm tra bên nhận.

Dữ liệu của NFT nằm ở đâu: trên chuỗi hay ngoài chuỗi?

Hiểu sai chỗ này là nguồn gốc của nhiều tranh cãi. Chuẩn chỉ bảo đảm sổ ghi tokenId và chủ sở hữu nằm trên chuỗi. Phần mở rộng Metadata cho phép hàm tokenURI(tokenId) trả về một chuỗi, thường là đường dẫn tới tệp JSON ngoài chuỗi. Tệp JSON này mô tả tên, thuộc tính và liên kết tới ảnh. Đặc tả không bắt buộc cấu trúc JSON, nên các định dạng phổ biến hình thành từ thực tế của các sàn.

Kiến trúc ba lớp của một NFT ERC-721: lớp trên chuỗi chứa tokenId và chủ sở hữu, lớp con trỏ tokenURI, lớp ngoài chuỗi chứa tệp JSON và
Sơ đồ khái niệm về nơi lưu dữ liệu của NFT ERC-721.

Hệ quả: nếu đường dẫn trỏ tới máy chủ của công ty và công ty ngừng duy trì, bạn vẫn là chủ của tokenId nhưng ảnh có thể biến mất. Nếu hợp đồng cho phép chủ dự án đổi tokenURI, nội dung NFT cũng có thể bị đổi sau khi bán. Phần mở rộng ERC-4906 ra đời để sàn biết khi metadata thay đổi và làm mới hiển thị, theo bảng tổng hợp chuẩn NFT nói trên. Khi đánh giá một bộ sưu tập, hãy kiểm tra đường dẫn trỏ tới đâu và hợp đồng có hàm đổi đường dẫn hay không.

ERC-721 khác ERC-20 và ERC-1155 thế nào?

ERC-20 phục vụ token có thể thay thế, trong đó mỗi đơn vị như nhau. Bạn có thể xem chi tiết ở bài về chuẩn ERC-20. ERC-1155 ra đời năm 2018, cho phép một hợp đồng quản lý cả token thay thế được lẫn NFT và chuyển nhiều loại trong một giao dịch.

Tiêu chí ERC-20 ERC-721 ERC-1155
Tính chất token Thay thế được Không thay thế được Cả hai trong một hợp đồng
Cách ghi sở hữu Số dư theo địa chỉ tokenId trỏ tới một chủ Số dư theo địa chỉ và theo id
Chuyển nhiều loại một lần Không Không, mỗi lần một token Có, qua safeBatchTransferFrom
Uỷ quyền Theo số lượng Theo từng token hoặc toàn bộ Theo toàn bộ operator
Hợp với Điểm thưởng, stablecoin Tác phẩm độc bản, vé, tên miền Vật phẩm game, bộ sưu tập nhiều bản

Một biến thể hay gặp là ERC-721A, cách cài đặt tối ưu cho mint hàng loạt. Theo một tài liệu tổng hợp, nó giảm chi phí mint nhưng giữ nguyên giao diện chuyển từng token. Về phí thực thi giao dịch, xem bài phí gas.

Ví dụ thực tế dùng ERC-721 là gì?

  • CryptoKitties: dự án đầu tiên dùng bản nháp chuẩn này, mỗi chú mèo là một tokenId với bộ gen riêng.
  • Tên miền .eth của Ethereum Name Service: theo một bài viết tiếng Việt, mỗi tên miền .eth là một NFT ERC-721 thuộc về người thuê.
  • Vị thế thanh khoản: bảng tổng hợp chuẩn NFT ghi nhận Uniswap v3 và v4 dùng ERC-721 để đại diện cho vị thế thanh khoản. Vị thế mỗi người có khoảng giá riêng nên không thể thay thế cho nhau.
  • Vé sự kiện, thẻ thành viên, chứng chỉ: mỗi vé có ghế và số riêng. Nếu doanh nghiệp muốn thử dạng này, hãy xem thêm bài về định danh phi tập trung, vì chứng chỉ có thể cần gắn với danh tính.

Ví dụ minh hoạ, không phải dự án có thật: một đơn vị tổ chức hội thảo phát 300 vé là 300 tokenId. Ví của người tham dự giữ vé, còn hợp đồng chặn chuyển nhượng sau ngày sự kiện. Cách này cần quy tắc hạn chế chuyển nhượng viết trong mã, vì chuẩn gốc cho phép chuyển tự do.

Doanh nghiệp Việt Nam có thể dùng ERC-721 vào việc gì?

Chuẩn phù hợp khi từng đối tượng cần mã riêng, ghi nhận một chủ rõ ràng và cần chuyển nhượng được kiểm chứng công khai. Ba nhóm tình huống thường được cân nhắc:

  • Chứng nhận độc bản: chứng chỉ khoá học, giấy xác nhận tác quyền cho tác phẩm số. Token chỉ chứng minh địa chỉ ví đang giữ; việc ví đó thuộc về ai vẫn cần quy trình xác minh riêng.
  • Vé và thẻ thành viên: mỗi thẻ có quyền lợi khác nhau, có thể kiểm tra bằng cách đọc ownerOf tại cửa vào.
  • Đại diện cho tài sản thực: mỗi lô hàng hoặc mỗi căn hộ là một token. Đây là bài toán pháp lý nhiều hơn kỹ thuật, xem token hoá tài sản thực.

Về pháp lý, Luật Công nghiệp công nghệ số 71/2025/QH15 có quy định về tài sản số, nên token đại diện cho quyền tài sản cần được xem xét theo loại tài sản mà nó gắn vào. Bạn nên đối chiếu phân loại ở bài tài sản mã hoá và hỏi luật sư trước khi phát hành hoặc bán. Bài này không đưa ra tư vấn pháp lý cá nhân.

Rủi ro khi dùng token ERC-721 là gì?

Quyền uỷ quyền quá rộng

Hàm setApprovalForAll cho operator quyền chuyển mọi NFT của bạn trong một hợp đồng. Các sàn dùng nó để khớp lệnh, nhưng nếu bạn ký cho một địa chỉ lạ qua trang web giả mạo, tài sản có thể bị chuyển đi mà không cần khoá riêng của bạn. Hãy rà soát và thu hồi quyền cũ bằng cách gọi lại hàm với giá trị false, hoặc qua công cụ kiểm tra quyền của ví. Cách bảo vệ khoá được trình bày ở bài về ví blockchain.

Metadata có thể thay đổi hoặc mất

Như đã nêu, tokenURI trỏ ra ngoài chuỗi. Trước khi mua hoặc phát hành, hãy xem hợp đồng có cho đổi tokenURI không và tệp nằm ở máy chủ riêng hay kho lưu trữ phân tán.

Lỗi trong hợp đồng

Chuẩn chỉ là giao diện; cách cài đặt có thể có lỗi, ví dụ hàm mint không giới hạn quyền gọi. Tự viết hợp đồng thay vì dùng thư viện đã kiểm toán làm tăng rủi ro. Cơ chế chung của hợp đồng được giải thích ở bài hợp đồng thông minh.

Gửi nhầm tới hợp đồng

Dùng transferFrom với địa chỉ hợp đồng không hỗ trợ NFT có thể làm kẹt token. Đây chính là lý do safeTransferFrom tồn tại.

Giá trị và thanh khoản

Token độc bản không có giá niêm yết chung, nên khó bán lại khi thiếu người mua. Bài này không khuyến nghị mua bán hay đầu tư NFT.

Khi nào nên và không nên chọn ERC-721?

  • Nên cân nhắc: mỗi đối tượng cần một chủ duy nhất, cần tra cứu công khai bằng ownerOf, và cần tương thích sẵn với ví, sàn và công cụ lập chỉ mục trên mạng tương thích EVM.
  • Cân nhắc ERC-1155: bạn phát hành nhiều bản giống nhau hoặc cần chuyển nhiều loại trong một giao dịch.
  • Không cần blockchain công khai: nếu chỉ quản lý nội bộ một danh sách vé hay chứng chỉ, cơ sở dữ liệu thường rẻ và dễ sửa hơn. Xem bài so sánh blockchain và database.
  • Cần quyền thu hồi: chuẩn gốc không có cơ chế thu hồi hay đóng băng. Nếu nghiệp vụ cần, phải thêm vào hợp đồng và nói rõ với người dùng.

Câu hỏi thường gặp

ERC-721 có phải là NFT không?

Không hoàn toàn. ERC-721 là chuẩn kỹ thuật; NFT là token tạo ra theo chuẩn đó. Cũng có NFT theo chuẩn khác như ERC-1155.

ERC-721 chỉ chạy trên Ethereum phải không?

Chuẩn được viết cho Ethereum, nhưng nhiều mạng tương thích EVM, trong đó có các mạng Layer 2, cũng dùng cùng giao diện. Khái niệm này được giải thích ở bài Ethereum là gì.

Sở hữu NFT ERC-721 có nghĩa là sở hữu bản quyền tác phẩm không?

Không mặc định. Token chỉ ghi địa chỉ ví là chủ của tokenId. Quyền sử dụng hay bản quyền tác phẩm phụ thuộc vào điều khoản của người phát hành và pháp luật hiện hành.

Tại sao NFT của tôi mất ảnh dù vẫn còn trong ví?

Thường vì tokenURI trỏ tới tệp ngoài chuỗi đã bị gỡ hoặc đổi. Token vẫn tồn tại trên chuỗi nhưng nội dung nó trỏ tới không còn.

Một hợp đồng ERC-721 có tạo được token trùng tokenId không?

Không. Mỗi tokenId trong một hợp đồng phải là duy nhất. Tuy nhiên hai hợp đồng khác nhau có thể dùng cùng số tokenId, nên định danh đầy đủ của một NFT là địa chỉ hợp đồng kèm tokenId.

Làm sao biết tôi đã cấp quyền quá rộng cho sàn?

Gọi isApprovedForAll(địa chỉ của bạn, operator) trên hợp đồng, hoặc dùng công cụ kiểm tra quyền của ví. Nếu không còn dùng sàn đó, hãy thu hồi bằng setApprovalForAll với giá trị false.

blog công nghệ VBPO cập nhật tin tức và kiến thức công nghệ cho doanh nghiệp Việt Nam. Xem thêm các bài cùng chuyên mục Blockchain cơ bản.