量化對沖搬磚交易系統開發(開發策略)丨量化對沖搬磚交易系統開發原始碼

xiaofufu發表於2023-04-05

  區塊鏈是分散式資料儲存、點對點傳輸、共識機制、加密演演算法等計算機技術的新型應用模式。


  區塊鏈(Blockchain),它本質上是一個去中心化的資料庫,


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


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


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


  是一串使用密碼學方法相關聯產生的資料塊,每一個資料塊中包含了一批次BTC幣網路交易的資訊,用於驗證其資訊的有效性(防偽)和生成下一個區塊。


  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)()]


  該NFT轉移後,由於破壞了擁有者0x2的連續性,所以我們需要重寫tokenId=4的對應資料,程式碼如下:


  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-2943943/,如需轉載,請註明出處,否則將追究法律責任。

相關文章