欢迎光临散文网 会员登陆 & 注册

Meta2032质押挖矿开发说明,Meta2032质押挖矿系统开发(运营版)及源码方案

2023-04-05 10:26 作者:bili_53879993861  | 我要投稿

  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;


  }


  }


Meta2032质押挖矿开发说明,Meta2032质押挖矿系统开发(运营版)及源码方案的评论 (共 条)

分享到微博请遵守国家法律