NFT数字藏品开发运营版丨NFT数字藏品系统开发(开发源码)丨成熟及技术
数字藏品的特征完全符合数字出版物的核心形态,同时也体现出数字版权的核心要素。数字藏品利用区块链技术,锚定作品生成链上唯一的所有权或使用权的数字凭证,不可篡改、不可拆分、限量发行,目的是实现作品真实可信的数字化发行、收藏、使用和流转。
Compared to paper collections,digital collections are formed by digitizing traditional paper media using IT technology.目前,数字藏品主要有网络、移动媒体、大型的图书和数据库等。开发案例威:MrsFu123,数字藏品的基本特点是可量测、可存储、可携带,这些特点可以被视为数字藏品在技术层面的最大优势。
//The next token ID to be minted.
uint256 private _currentIndex;
//The number of tokens burned.
uint256 private _burnCounter;
//Token name
string private _name;
//Token symbol
string private _symbol;
//Mapping from token ID to ownership details
//An empty struct value does not necessarily mean the token is unowned.
//See{_packedOwnershipOf}implementation for details.
//
//Bits Layout:
//-[0..159]`addr`
//-[160..223]`startTimestamp`
//-[224]`burned`
//-[225]`nextInitialized`
//-[232..255]`extraData`
mapping(uint256=>uint256)private _packedOwnerships;
//Mapping owner address to address data.
//
//Bits Layout:
//-[0..63]`balance`
//-[64..127]`numberMinted`
//-[128..191]`numberBurned`
//-[192..255]`aux`
mapping(address=>uint256)private _packedAddressData;
//Mapping from token ID to approved address.
mapping(uint256=>TokenApprovalRef)private _tokenApprovals;
//Mapping from owner to operator approvals
mapping(address=>mapping(address=>bool))private _operatorApprovals;
与其他简单参数相比,我们主要关注复杂的参数:
_packedOwnerships类似常规NFT实现中的_ownerOf,我们通过此映射查询某tokenID的拥有者,但此结构是打包方式的,即我们并不指定每一个tokenID对应的拥有者而是仅记录开头
_packedAddressData类似常规NFT实现中的_balanceOf,用于查询某一用户所拥有的NFT的相关数据。此处的aux是指附加信息,比如用户当前使用的NFT铸造白名单数量,请根据自身项目酌情修改
此处,我们简单介绍数据读取的部分函数,关于在uint256压缩数据结构内进行数据读取的具体方法,我们已在深入解析AAVE智能合约:存款介绍过类似的uint256压缩数据提取方法。简单来说,就是使用&操作的特性实现数据提取。我们给出balanceOf的代码实现:
function balanceOf(address owner)public view virtual override returns(uint256){
if(owner==address(0))_revert(BalanceQueryForZeroAddress.selector);
return _packedAddressData[owner]&_BITMASK_ADDRESS_DATA_ENTRY;
}
基于1&1=1、0&1=0和0&0=0,我们可以通过将待提取位数(此处为0至63位置为1即可)。此处的_BITMASK_ADDRESS_DATA_ENTRY与我们设想的类似:
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY=(1<<64)-1;