量化交易機器人開發運營版丨量化機器人系統開發(成熟技術)丨量化機器人系統原始碼

xiaofufu發表於2023-04-05

  目前區塊鏈發展的最大掣肘,在於各個區塊裡的資料不統一。很多網際網路是局域型的,內外網並不互通。“從私鏈走向公鏈”的過程,就是打破區域網和建立資料標準化的過程,另外,雖然發展區塊鏈的意義重大,不是一有區塊鏈之後,以前的商業就出現翻天覆地的變化。“區塊鏈”要發揮巨大作用,有賴於從區塊鏈技術發展出來的通證經濟。


  區塊鏈的部分價值,早以“網際網路+資料庫”的形式發展了很多年。在“網際網路+資料庫”的模式下,“+”到一定程度,就到私有鏈的水平了。然後每一個私鏈進行合併,當私鏈具備了更多共通性和可交換性之後,就變成了公鏈。


  關於區塊鏈專案技術開發唯:MrsFu123,代幣發行、dapp智慧合約開發、鏈遊開發、單雙幣質押、多鏈錢包開發、NFT盲盒遊戲、公鏈、鏈上游戲開發


  Uniswap博餅、交易所開發、量化合約開發、合約對沖、互助遊戲開發、Nft數字藏品開發、眾籌互助開發、元宇宙開發、swap開發、DAO智慧合約、


  夾子合約、鏈上合約開發、ido開發、商城開發等,開發過各種各樣的系統模式,更有多種模式、制度、案例、後臺等,成熟技術團隊,歡迎實體參考。


  burn銷燬的核心函式為_burn函式,由於銷燬事實上相當於將NFT轉移給0地址,所以其大量邏輯與transfer類似。


  _burn函式定義如下:


  function _burn(uint256 tokenId,bool approvalCheck)internal virtual


  1


  引數含義如下:


  tokenId待銷燬NFT的tokenId


  approvalCheck是否檢測函式呼叫者的許可權


  大致流程如下:


  獲取待銷燬NFT擁有者的資訊


  如果設定approvalCheck為true則檢測函式呼叫者的相關許可權


  清空待銷燬NFT的授權approve資料


  減少擁有者的balance


  在_packedOwnerships中寫入銷燬資訊


  恢復代幣連續性


  釋放事件


  接下來,我們詳細分析具體的程式碼實現:


  uint256 prevOwnershipPacked=_packedOwnershipOf(tokenId);


  address from=address(uint160(prevOwnershipPacked));


  (uint256 approvedAddressSlot,address approvedAddress)=_getApprovedSlotAndAddress(tokenId);


  此處程式碼與transferFrom函式的開始部分基本一致,但在from處理方面進行了簡化。


  接下來,我們檢查呼叫者的相關許可權並清空授權,程式碼如下:


  if(approvalCheck){


  if(!_isSenderApprovedOrOwner(approvedAddress,from,_msgSenderERC721A()))


  if(!isApprovedForAll(from,_msgSenderERC721A()))_revert(TransferCallerNotOwnerNorApproved.selector);


  }


  assembly{


  if approvedAddress{


  //This is equivalent todelete _tokenApprovals[tokenId].


  sstore(approvedAddressSlot,0)


  }


  }


  此部分程式碼與transferFrom函式完全一致,不再詳細介紹。


  _packedAddressData[from]+=(1<<_BITPOS_NUMBER_BURNED)-1;


  _packedOwnerships[tokenId]=_packOwnershipData(


  from,


  (_BITMASK_BURNED|_BITMASK_NEXT_INITIALIZED)|_nextExtraData(from,address(0),prevOwnershipPacked)


  );


  此處使用_packedAddressData[from]+=(1<<_BITPOS_NUMBER_BURNED)-1;程式碼將balance-=1和numberBurned+=1合併一起執行。


  其中_BITPOS_NUMBER_BURNED的值為128,為方便讀者理解,我們再次給出_packedAddressData的格式:


  //Bits Layout:


  //-[0..63]balance


  //-[64..127]numberMinted


  //-[128..191]numberBurned


  //-[192..255]aux


  mapping(address=>uint256)private _packedAddressData;


  if(prevOwnershipPacked&_BITMASK_NEXT_INITIALIZED==0){


  uint256 nextTokenId=tokenId+1;


  if(_packedOwnerships[nextTokenId]==0){


  if(nextTokenId!=_currentIndex){


  _packedOwnerships[nextTokenId]=prevOwnershipPacked;


  }


  }


  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2943942/,如需轉載,請註明出處,否則將追究法律責任。

相關文章