Meta2032質押挖礦開發(fā)說明,Meta2032質押挖礦系統(tǒng)開發(fā)(運營版)及源碼方案
Conscientious Value Network(CVN)is a blockchain 3.0 underlying public chain that is positioned as a new generation of public chain infrastructure,a universal distributed database(storage)cloud,and high-performance decentralized"fast broadcasting".It aims to provide high-speed,secure,and easy-to-use one-stop decentralized solutions for all users.CVN achieves ledger consensus and storage proof consensus through layering the consensus principle of PoST on the VRF consensus main chain,building a fast and stable underlying blockchain.
區(qū)塊鏈是分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式。
區(qū)塊鏈(Blockchain),它本質上是一個去中心化的數(shù)據(jù)庫,
是一串使用密碼學方法相關聯(lián)產(chǎn)生的數(shù)據(jù)塊,詳細唯:yy625019,每一個數(shù)據(jù)塊中包含了一批次比特幣網(wǎng)絡交易的信息,用于驗證其信息的有效性(防偽)和生成下一個區(qū)塊。
uint256 prevOwnershipPacked=_packedOwnershipOf(tokenId);
from=address(uint160(uint256(uint160(from))&_BITMASK_ADDRESS));
if(address(uint160(prevOwnershipPacked))!=from)_revert(TransferFromIncorrectOwner.selector);
通過_packedOwnershipOf函數(shù)獲得NFT擁有者地址,使用address(uint160(uint256(uint160(from))&_BITMASK_ADDRESS))進行數(shù)據(jù)類型轉化。如果我們發(fā)現(xiàn)調用參數(shù)中的from與NFT擁有者不同,則直接拋出錯誤。
接下來,我們使用以下代碼校驗NFT轉移的相關權限問題:
(uint256 approvedAddressSlot,address approvedAddress)=_getApprovedSlotAndAddress(tokenId);
if(!_isSenderApprovedOrOwner(approvedAddress,from,_msgSenderERC721A()))
if(!isApprovedForAll(from,_msgSenderERC721A()))_revert(TransferCallerNotOwnerNorApproved.selector);
滿足以下條件則繼續(xù)運行:
函數(shù)調用者為NFT擁有者或被授權者或函數(shù)調用者存在isApprovedForAll權限。
如果上述條件全不滿足,則拋出異常。
該部分中最復雜的函數(shù)為_getApprovedSlotAndAddress:
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns(uint256 approvedAddressSlot,address approvedAddress)
{
TokenApprovalRef storage tokenApproval=_tokenApprovals[tokenId];
assembly{
approvedAddressSlot:=tokenApproval.slot
approvedAddress:=sload(approvedAddressSlot)
}
}
該函數(shù)會返回兩個底層數(shù)據(jù),即授權地址在storage中的位置approvedAddressSlot和授權地址的值approvedAddress。
理解此代碼需要對EVM的存儲結構有一定了解,推薦閱讀Understanding Ethereum Smart Contract Storage
當函數(shù)調用者滿足條件后,我們進入真正的NFT轉移程序。首先清除待轉移NFT的原有授權,代碼如下:
assembly{
if approvedAddress{
sstore(approvedAddressSlot,0)
}
}
直接將_tokenApprovals中NFT對應的值清空。
接下來,我們進入了最復雜的NFT轉移階段,該階段的邏輯大致如下:
修正轉移雙方的balance參數(shù)
--_packedAddressData[from];
++_packedAddressData[to];
1
2
更新tokenId對應的_packedOwnerships數(shù)據(jù):
_packedOwnerships[tokenId]=_packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED|_nextExtraData(from,to,prevOwnershipPacked)
);
由于轉移過程必須進行初始化,所以此處將轉移的NFT的nextInitialized設置為True
考慮下一個NFT是否被初始化,
如轉移下圖中tokenId=3的NFT:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wKsxnwNP-1675684640935)(https://files.catbox.moe/20sjdu.svg)]
該NFT轉移后,由于破壞了擁有者0x2的連續(xù)性,所以我們需要重寫tokenId=4的對應數(shù)據(jù),代碼如下:
if(prevOwnershipPacked&_BITMASK_NEXT_INITIALIZED==0){
uint256 nextTokenId=tokenId+1;
if(_packedOwnerships[nextTokenId]==0){
if(nextTokenId!=_currentIndex){
_packedOwnerships[nextTokenId]=prevOwnershipPacked;
}
}