系列文章目录
使用Pinata在IPFS上存储NFT图片的实践🚪
scaffold-eth-2使用详细教程🚪
NFT铸造与上架🚪
NFT版税与历史记录🚪
文章目录
前言
在以太坊的NFT生态中,版税(Royalty
)和历史交易记录是两个重要的组成部分。版税机制允许创作者在NFT的二级市场交易中获得持续收益,而历史交易记录则帮助用户追溯NFT的交易轨迹,确保透明度和可信度。本文将深入探讨其具体实现方式,特别是基于ERC721Royalty
标准的版税机制实现,以及基于事件的交易历史记录方案。
本篇博客中的版税与历史交易记录的实现方案,基于我开发的一个开源项目 NFTMarket🚪 ,该项目不仅涵盖了版税和交易记录的实现,还包括了NFT的铸造交易、碎片化、盲盒、空投、忠诚度奖励等功能。通过本项目,你可以学习到如何使用智能合约和前端结合来实现一个完整的NFT市场。在本篇文章中,我们将重点讲解NFT的版税机制及历史交易记录的功能,感兴趣的读者可以访问该项目,查看完整的源码和实现。
接下来,我们将详细讲解如何通过智能合约实现NFT版税机制,并讨论如何利用链上事件追踪NFT的交易历史。
一、NFT 版税机制
1. 版税的定义与作用
NFT版税是指当NFT被二次销售时,创作者仍能从中获得一定比例的收益。这种机制为艺术家和内容创作者提供了一种持续的收入来源,推动了数字艺术市场的繁荣。然而,不同的NFT市场在执行版税时存在差异:一些市场强制执行版税,而其他市场则允许买家选择是否支付版税。
2. EIP-2981 版税标准
EIP-2981
是以太坊提出的一项NFT版税标准,旨在为NFT创作者提供一个通用且可查询的版税信息方案。其主要功能包括:
_setTokenRoyalty(tokenId, receiver, feeNumerator)
方法:用于设置NFT的版税接收者和版税比例。royaltyInfo(tokenId, salePrice)
方法:返回指定tokenId
在salePrice
价格下的版税金额和接收者。- 版税信息的存储方式。
- 兼容性与市场集成。
3. 在智能合约中实现版税
在实际应用中,NFT版税通常通过继承ERC721Royalty
合约来实现,该合约已经实现了EIP-2981
标准。
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol";
contract MyNFT is ERC721Royalty {
...
}
版税机制的实现通常包括以下几个关键步骤:
- 版税设置
在NFT
铸造时,我们需要设置版税信息。版税比例通常表示为分数,例如:
_setTokenRoyalty(tokenId, to, royaltyFeeNumerator);
// 250 代表 2.5%
// 500 代表 5%
// 1000 代表 10%
通常版税比例不超过10%
,在前端应用中,我们可以对用户输入的数字进行处理,比如输入10%
时,实际设置的值为1000
- 版税计算和支付
在NFT交易过程中,我们需要判断是否需要支付版税。核心逻辑如下:
uint256 royaltyAmount = 0;
address royaltyReceiver;
// 获取版税接收者地址
(royaltyReceiver, ) = royaltyInfo(tokenId, msg.value);
// 如果当前卖家不是版税接收者,则收取版税
if (item.owner != royaltyReceiver) {
(royaltyReceiver, royaltyAmount) = royaltyInfo(tokenId, msg.value);
if (royaltyAmount > 0) {
(bool royaltySuccess, ) = payable(royaltyReceiver).call{value: royaltyAmount}("");
require(royaltySuccess, "Transfer to royalty receiver failed");
}
}
在前端上架NFT时,可以判断当前上架用户是否为该NFT的创作者,并进行相应提示:
购买后,用户可以看到版税收取人和版税金额:
4. NFT 版税的市场支持与争议
目前,许多 NFT 交易市场(如 OpenSea、Blur、LooksRare)都支持 EIP-2981
标准,但不同平台的版税执行机制有所不同。部分平台允许买卖双方自行决定是否支付版税,因此创作者需要综合考虑不同市场的规则。此外,一些交易平台引入了去中心化自治组织 DAO投票,决定是否对特定类型的 NFT
强制执行版税。
虽然NFT
版税为创作者提供了可持续收入,但也引发了一些争议。例如,一些买家认为版税增加了交易成本,降低了NFT
的流动性。未来,可能会出现更灵活的版税机制,如动态版税(根据NFT
的持有时间或市场价值调整版税比例)
二、NFT 交易记录的存储与查询
1. NFT 交易记录的重要性
NFT 交易记录是追踪每个 NFT 在区块链上所有交易历史的关键,确保 NFT 的真实性、溯源能力以及防止潜在的欺诈行为。通过这些交易记录,用户不仅能确认某个 NFT 是否属于知名创作者,还能判断它是否经过了异常交易,从而保障市场的公平性和透明度。
2. 基于链上事件的实现方案
在所有可用的历史记录追踪方案中(包括合约存储、链上事件、链下数据库和The Graph等),基于链上事件的实现方案具有特殊优势。这种方案既保证了数据的可信度,又能够大幅节省gas成本。具体实现如下:
- 事件定义
event NftBought(uint256 indexed tokenId, address indexed seller, address indexed buyer, uint256 price, address royaltyReceiver, uint256 royaltyAmount);
- 事件触发在NFT交易完成时,触发事件:
emit NftBought(tokenId, seller, msg.sender, price, royaltyReceiver, royaltyAmount);
3. 其他追踪方案的比较分析
虽然本实现选择了基于事件的方案,但了解其他方案的优劣势也很重要:
-
合约内部存储
优势:数据检索便捷
劣势:存储成本高,gas消耗大 -
链下数据库
优势:查询性能好,成本低
劣势:需要额外的数据同步机制 -
The Graph
优势:提供强大的查询能力
劣势:需要部署和维护子图
4. 查询 NFT 历史交易记录
在我们基于事件Event的历史交易记录中,我们可以使用scaffold-eth-2框架🚪的useScaffoldEventHistory
钩子去获取链上事件的数据。最终,利用 map 遍历存储的记录,展示历史交易。
import { useScaffoldEventHistory } from "~~/hooks/scaffold-eth";
// 历史记录事件
const { data: buyEvents } = useScaffoldEventHistory({
contractName: "myNFT", // 合约名
eventName: "NftBought", // 事件名
fromBlock: 0n, // 从第0个区块开始监听事件
filters: { tokenId: BigInt(tokenId) }, // 过滤特定NFT的历史记录
blockData: true, // 获取区块数据以获取时间戳
watch: true, // 轮询更新
});
在完成 NFT 购买后,购买详情页会显示以下历史交易记录:
总结
本文详细探讨了以太坊 NFT 版税机制和交易记录的存储与查询实现。首先,介绍了 EIP-2981
标准及其在智能合约中的应用,说明了如何通过设置版税信息和计算版税来确保创作者在二级市场交易中的收益。接着,分析了 NFT 交易记录的重要性,并提供了基于链上事件的存储方案,这种方案不仅确保了数据的可信性,还大幅降低了 gas 成本。此外,本文还比较了不同的追踪方案,包括合约内部存储、链下数据库和 The Graph,帮助开发者根据需求选择合适的方案。
在实现交易记录查询时,我们展示了如何通过 scaffold-eth-2
框架的 useScaffoldEventHistory
钩子来获取历史交易记录,并将其在前端展示。最后,文章讨论了 NFT 版税机制在市场中的应用与争议,展望了未来版税机制可能的发展趋势。
希望本文能帮助你深入理解 NFT 的版税和交易记录的实现方式,提供更清晰的思路和解决方案。如果你对这些话题有任何问题或想法,欢迎在评论区与我们分享讨论 🌹