NFT數(shù)字藏品開發(fā)運(yùn)營(yíng)版丨NFT數(shù)字藏品系統(tǒng)開發(fā)(開發(fā)源碼)丨成熟及技術(shù)
數(shù)字藏品的特征完全符合數(shù)字出版物的核心形態(tài),同時(shí)也體現(xiàn)出數(shù)字版權(quán)的核心要素。數(shù)字藏品利用區(qū)塊鏈技術(shù),錨定作品生成鏈上唯一的所有權(quán)或使用權(quán)的數(shù)字憑證,不可篡改、不可拆分、限量發(fā)行,目的是實(shí)現(xiàn)作品真實(shí)可信的數(shù)字化發(fā)行、收藏、使用和流轉(zhuǎn)。
Compared to paper collections,digital collections are formed by digitizing traditional paper media using IT technology.目前,數(shù)字藏品主要有網(wǎng)絡(luò)、移動(dòng)媒體、大型的圖書和數(shù)據(jù)庫(kù)等。開發(fā)案例威:MrsFu123,數(shù)字藏品的基本特點(diǎn)是可量測(cè)、可存儲(chǔ)、可攜帶,這些特點(diǎn)可以被視為數(shù)字藏品在技術(shù)層面的最大優(yōu)勢(shì)。
//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;
與其他簡(jiǎn)單參數(shù)相比,我們主要關(guān)注復(fù)雜的參數(shù):
_packedOwnerships類似常規(guī)NFT實(shí)現(xiàn)中的_ownerOf,我們通過(guò)此映射查詢某tokenID的擁有者,但此結(jié)構(gòu)是打包方式的,即我們并不指定每一個(gè)tokenID對(duì)應(yīng)的擁有者而是僅記錄開頭
_packedAddressData類似常規(guī)NFT實(shí)現(xiàn)中的_balanceOf,用于查詢某一用戶所擁有的NFT的相關(guān)數(shù)據(jù)。此處的aux是指附加信息,比如用戶當(dāng)前使用的NFT鑄造白名單數(shù)量,請(qǐng)根據(jù)自身項(xiàng)目酌情修改
此處,我們簡(jiǎn)單介紹數(shù)據(jù)讀取的部分函數(shù),關(guān)于在uint256壓縮數(shù)據(jù)結(jié)構(gòu)內(nèi)進(jìn)行數(shù)據(jù)讀取的具體方法,我們已在深入解析AAVE智能合約:存款介紹過(guò)類似的uint256壓縮數(shù)據(jù)提取方法。簡(jiǎn)單來(lái)說(shuō),就是使用&操作的特性實(shí)現(xiàn)數(shù)據(jù)提取。我們給出balanceOf的代碼實(shí)現(xiàn):
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,我們可以通過(guò)將待提取位數(shù)(此處為0至63位置為1即可)。此處的_BITMASK_ADDRESS_DATA_ENTRY與我們?cè)O(shè)想的類似:
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY=(1<<64)-1;