Skip to content

Commit

Permalink
Merge pull request #1244 from paris-10/main
Browse files Browse the repository at this point in the history
feat: add more detailed introduction and comparison for ERC721A
  • Loading branch information
jasonandjay authored Jan 9, 2025
2 parents 984d3a5 + c1edc18 commit b9aaf98
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 131 deletions.
61 changes: 61 additions & 0 deletions nft/ERC721A/Comparative.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
### **ERC721 与 ERC721A 的对比分析**

以下是 ERC721 和 ERC721A 的详细对比,从功能、性能、存储优化、复杂性等方面进行了深入分析:



| **特性** | **ERC721** | **ERC721A** |
|--------------------------|-------------------------------------------------|----------------------------------------------------------------------------------------------------|
| **批量铸造支持** | 不支持,需逐个调用 `_mint` | 支持批量铸造,通过优化算法,一次调用即可完成多 NFT 的铸造 |
| **算法复杂度** | \(O(N)\),逐个 NFT 铸造和存储操作 | \(O(1)\),批量更新持有人和存储信息,优化了大规模铸造的性能 |
| **存储机制** | 每个 `tokenId` 都存储独立的 `owner` 信息 | 仅存储第一个 `tokenId``owner` 信息,后续的 `tokenId` 默认为同一地址直到发生变更 |
| **Gas 成本** | 每个 NFT 的铸造成本较高,需更新多个存储变量 | 显著降低批量铸造的 Gas 成本,尤其是在生成大批量 NFT 时效果显著 |
| **转移性能** | 单个转移效率高,更新对应 `tokenId``owner` 信息 | 单个转移需额外处理稀疏存储区间(如更新下一个 `tokenId``owner`),但批量铸造后的稀疏存储优化了存储操作 |
| **批量转移** | 需要逐个转移,性能受限 | 支持批量转移,但性能与实现逻辑有关,无法完全达到批量铸造的优化效果 |
| **所有权查询** | 查询效率较高,直接访问 `_owners[tokenId]` | 查询需处理稀疏存储,通过递减遍历找到最近的 `owner` 信息 |
| **事件兼容性** | 满足 EIP721 的 `Transfer` 事件标准 | 满足标准,批量铸造时会为每个 `tokenId` 发出单独的 `Transfer` 事件 |
| **存储消耗** | 每个 `tokenId` 都记录独立的存储 | 减少了存储消耗,仅在必要时更新 `_owners``_balances` |
| **枚举方法(tokenOfOwnerByIndex)** | 基于全局 mapping 实现,性能较高 | 需遍历所有 `tokenId` 以确定归属,复杂度为 \(O(N)\) |
| **适用场景** | 适用于小批量、高频转移的 NFT 项目 | 适用于大批量生成的 NFT 项目,如 PFP 系列或游戏资产发行 |
| **实现复杂度** | 简单直接,适合新手开发 | 实现复杂度更高,需精确管理稀疏存储和动态查询逻辑 |

---

### **关键差异分析**

1. **批量铸造性能**
- **ERC721**:每次铸造需独立调用 `_mint` 方法,更新所有者信息和余额,性能受限,Gas 成本随着铸造数量线性增长。
- **ERC721A**:通过批量处理仅更新必要的存储信息,使得铸造复杂度降低为 \(O(1)\),在大批量铸造中优势显著。

2. **存储优化**
- **ERC721**:每个 `tokenId` 都需要独立存储 `owner` 信息,增加了存储成本。
- **ERC721A**:仅存储批量铸造中第一个 `tokenId``owner` 信息,后续 `tokenId` 使用稀疏存储机制,大幅减少存储消耗。

3. **转移操作**
- **ERC721**:直接更新对应的 `tokenId` 信息,操作简单高效。
- **ERC721A**:需在转移后处理稀疏存储的边界条件,例如更新下一个 `tokenId` 的所有者信息,增加了复杂性。

4. **所有权查询**
- **ERC721**:直接读取 `_owners[tokenId]`,查询效率较高。
- **ERC721A**:需通过递减遍历找到最近的 `owner` 信息,查询复杂度较高,但仍在可接受范围内。

5. **适用场景**
- **ERC721**:更适合小批量、高频转移的 NFT 项目,如独特艺术品或小规模发行的收藏品。
- **ERC721A**:更适合大规模、批量发行的 NFT 项目,如 PFP 系列(头像项目)或游戏资产,因其能显著节省 Gas 成本。



### **适用建议**

| 项目类型 | 推荐标准 |
|---------------------------------------|-----------------------------------|
| 独特艺术品或小批量 NFT 项目 | **ERC721**,因其简单直观且转移性能更优 |
| PFP 项目(头像项目)或大规模 NFT 项目 | **ERC721A**,因其批量铸造性能更优 |
| 需要高频转移和复杂逻辑的项目 | **ERC721**,便于实现和维护 |
| 关注 Gas 成本和存储优化的项目 | **ERC721A**,能显著降低铸造成本 |



### **总结**

ERC721A 的设计显著优化了批量铸造场景的性能和存储成本,特别适用于需要大量生成 NFT 的项目。然而,其实现复杂性和高频操作场景的性能限制需要在实际开发中仔细权衡。开发者可根据项目特点选择适合的标准,并结合两者的优点构建更高效的解决方案。
Loading

0 comments on commit b9aaf98

Please sign in to comment.