关键词:ERC-721、NFT、safeTransferFrom、ownerOf、tokenURI、Metadata、Receiver、Enumerable、URIStorage
📚 作者:Henry 🧱 系列:《ERC 系列标准全景图解》 · 第 6 篇 👨💻 受众:Web3 前端工程师 / 区块链开发者 / Web3入门者 👉 系列持续更新中,建议收藏专栏或关注作者
自 CryptoKitties 火爆以来,ERC-721 成为 NFT 项目的事实标准。
它定义了“唯一资产所有权
”在以太坊链上的表达方式,为数字艺术、游戏道具、链上凭证等提供了统一接口。
本篇将围绕 ERC-721 的接口行为、安全逻辑与模块扩展,进行系统解析。
ERC-721 标准中,每一个 tokenId
都是唯一的,映射到一个特定所有者:
function ownerOf(uint256 tokenId) external view returns (address);
Transfer
事件,可用于链上溯源与历史跟踪function balanceOf(address owner) external view returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address);
function transferFrom(address from, address to, uint256 tokenId) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address);
function isApprovedForAll(address owner, address operator) external view returns (bool);
safeTransferFrom(...)
?传统的 transferFrom(...)
不检查接收方是否有处理能力,容易导致 NFT 被锁死在合约中。
safeTransferFrom
检查流程:msg.sender
是否是 owner 或授权人function onERC721Received(...) returns (bytes4);
0x150b7a02
,否则转账回滚📌 这个机制防止 NFT 被转入不支持处理 NFT 的合约地址
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
NFT 元数据通常为 JSON,包含:
{
"name": "CryptoCat #1",
"description": "A collectible cat",
"image": "ipfs://Qm.../cat.png",
"attributes": [
{ "trait_type": "Color", "value": "Blue" }
]
}
方式 | 优点 | 缺点 |
---|---|---|
off-chain(如 IPFS) | 成本低、更新方便 | 依赖外部链接,不可验证性 |
on-chain Base64 JSON | 完全链上、无需依赖外部 | 成本高,合约代码大,部署复杂 |
Hybrid:BaseURI + tokenId | 灵活,节省空间 | 仍需托管元数据 |
扩展模块 | 功能 |
---|---|
ERC721Enumerable | 支持按索引查询:tokenByIndex(i) 、tokenOfOwnerByIndex(...) |
ERC721Burnable | 支持销毁 NFT |
ERC721URIStorage | 自定义每个 token 的 URI(使用 storage 映射) |
ERC721Royalty (ERC2981) | 支持版权分成 |
继承示例:
contract MyNFT is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {}
项目 | 特性分析 |
---|---|
CryptoPunks | 非标准实现,不兼容 ERC-721,需要桥接层处理 |
Loot | 完全链上文字生成 + SVG 生成,使用 Base64 + tokenURI |
OpenSea 集成 | 需支持 ERC-721 Metadata + Transfer 事件才能识别展示 |
BAYC | 支持 reveal 机制,合约中实现批量 URI 更新 |
场景 | 推荐做法 |
---|---|
NFT 被锁在合约地址 | 使用 safeTransferFrom 并确保接收方合约实现 onERC721Received |
动态更新 URI | 搭配 ERC721URIStorage + setTokenURI(...) |
查询 NFT 总量 / 索引访问 | 必须继承 ERC721Enumerable |
OpenSea 扫描不到 NFT | 检查 Transfer 事件是否正确触发 + Metadata 是否响应 |
safeTransferFrom
防止资产误转如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!