Compared to paper collections,digital collections are formed by digitizing traditional paper media using IT technology.目前,数字藏品主要有网络、移动媒体、大型的图书和数据库等。数字藏品的基本特点是可量测、可存储、可携带,这些特点可以被视为数字藏品在技术层面的最大优势。
//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;