defi/dapp/nft/ulab質押挖礦借貸理財持幣生息系統開發詳細及案例丨原始碼部署

xiaofufu發表於2023-04-12

  區塊鏈技術一般用於構建交易系統,而且要保證交易的資訊真實可信,可追蹤且不可篡改。每一次交易的資訊被確認後儲存在一個區塊中,區塊資訊透過雜湊技術加密,以保證資訊不被篡改。這些區塊按時間順序構成鏈條。Each node maintains complete blockchain information,and the information of individual nodes is damaged without affecting the blockchain information.This type of information recording method is called distributed ledger.


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


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


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


  The most common explanation for blockchain is a decentralized distributed ledger database,in which everyone can be a data logger and no one can actively delete this data.Information is centralized and stored on the Internet in the form of a network.Each node will synchronously share and copy the data of the entire ledger,laying a very good foundation for data networking and bringing great changes to future life.


  Blockchain technology is a type of database technology,where each block is like a hard disk,storing all information and encrypting it through cryptographic techniques.The stored data cannot be tampered with.


  區塊鏈是一種特殊的分散式資料庫,開發邏輯威:MrsFu123,任何伺服器都可以成為區塊鏈中的一個節點,且節點之間是平等的,無中心化,區塊鏈中的資料是經過加密儲存,已經儲存的資料無法修改,可以保證資料的準確性。


  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 to`delete _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;


  為方便理解,我們將原有程式碼進行重寫:


  _packedAddressData[from]=_packedAddressData[from]+(1<<128)-1


  1


  如此來看,我們首先使用加法完成了numberBurned的更新,然後使用減法完成了balance的更新。


  對於_packOwnershipData函式,最重要的是分析以下部分:


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


  1


  我們將burned和_BITMASK_NEXT_INITIALIZED置為True並寫入extraData部分。


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

相關文章