Meta2032质押挖矿开发说明,Meta2032质押挖矿系统开发(运营版)及源码方案
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.
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。
区块链(Blockchain),它本质上是一个去中心化的数据库,
是一串使用密码学方法相关联产生的数据块,详细唯:yy625019,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。
uint256 prevOwnershipPacked=_packedOwnershipOf(tokenId);
from=address(uint160(uint256(uint160(from))&_BITMASK_ADDRESS));
if(address(uint160(prevOwnershipPacked))!=from)_revert(TransferFromIncorrectOwner.selector);
通过_packedOwnershipOf函数获得NFT拥有者地址,使用address(uint160(uint256(uint160(from))&_BITMASK_ADDRESS))进行数据类型转化。如果我们发现调用参数中的from与NFT拥有者不同,则直接抛出错误。
接下来,我们使用以下代码校验NFT转移的相关权限问题:
(uint256 approvedAddressSlot,address approvedAddress)=_getApprovedSlotAndAddress(tokenId);
if(!_isSenderApprovedOrOwner(approvedAddress,from,_msgSenderERC721A()))
if(!isApprovedForAll(from,_msgSenderERC721A()))_revert(TransferCallerNotOwnerNorApproved.selector);
满足以下条件则继续运行:
函数调用者为NFT拥有者或被授权者或函数调用者存在isApprovedForAll权限。
如果上述条件全不满足,则抛出异常。
该部分中最复杂的函数为_getApprovedSlotAndAddress:
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns(uint256 approvedAddressSlot,address approvedAddress)
{
TokenApprovalRef storage tokenApproval=_tokenApprovals[tokenId];
assembly{
approvedAddressSlot:=tokenApproval.slot
approvedAddress:=sload(approvedAddressSlot)
}
}
该函数会返回两个底层数据,即授权地址在storage中的位置approvedAddressSlot和授权地址的值approvedAddress。
理解此代码需要对EVM的存储结构有一定了解,推荐阅读Understanding Ethereum Smart Contract Storage
当函数调用者满足条件后,我们进入真正的NFT转移程序。首先清除待转移NFT的原有授权,代码如下:
assembly{
if approvedAddress{
sstore(approvedAddressSlot,0)
}
}
直接将_tokenApprovals中NFT对应的值清空。
接下来,我们进入了最复杂的NFT转移阶段,该阶段的逻辑大致如下:
修正转移双方的balance参数
--_packedAddressData[from];
++_packedAddressData[to];
1
2
更新tokenId对应的_packedOwnerships数据:
_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的连续性,所以我们需要重写tokenId=4的对应数据,代码如下:
if(prevOwnershipPacked&_BITMASK_NEXT_INITIALIZED==0){
uint256 nextTokenId=tokenId+1;
if(_packedOwnerships[nextTokenId]==0){
if(nextTokenId!=_currentIndex){
_packedOwnerships[nextTokenId]=prevOwnershipPacked;
}
}