量化對沖搬磚系統開發詳細需求方案丨量化對沖搬磚開發原始碼模式

xiaofufu發表於2023-04-05

  隨著區塊鏈架構體系的不斷髮展,越來越多的研究對區塊進行改造從而實現了對空間屬性的支援。因此,區塊鏈技術可以為資料打上時空標籤,透過在區塊中加入資料的時間和空間資訊,將同樣內容的資料集標識為不同的資料集個體,從而解決了資料要素流通中資料集可以被無限複製而無法辨識的難題,實現資料來源可確認。


  區塊鏈的可追溯性來源於區塊鏈資料結構的特殊性。在區塊鏈系統中,它的鏈式結構是從創世區塊開始的,其後系統產生的所有區塊都透過父區塊的雜湊值前後相連,並最終能追溯到創世區塊。



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


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


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


  由於每個區塊都包含一段時間內系統進行的所有交易資料,因此完整的區塊鏈資料包含了自創世區塊以來,系統所有進行的交易及交易前後的關聯資訊。同時,得益於區塊鏈資訊的不可篡改特性,使得這種可追溯性是可靠可信的。



 區塊鏈透過時間戳保證每個區塊依次順序相連,而這個時間戳就像資料的生產日期,證明這個資料在什麼時間點就已經存在,時間戳是區塊後設資料的一部分,這使得區塊具有天然的時間屬性。

  function _checkContractOnERC721Received(


  address from,


  address to,


  uint256 tokenId,


  bytes memory _data


  )private returns(bool){


  try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(),from,tokenId,_data)returns(


  bytes4 retval


  ){


  return retval==ERC721A__IERC721Receiver(to).onERC721Received.selector;


  }catch(bytes memory reason){


  if(reason.length==0){


  _revert(TransferToNonERC721ReceiverImplementer.selector);


  }


  assembly{


  revert(add(32,reason),mload(reason))


  }


  }


  }


  我們在深入解析Safe多籤錢包智慧合約:Fallback合約內已經對onERC721Received的相關內容進行了分析,讀者可自行閱讀理解。此處,我們主要對try/catch這一少見的solidity關鍵詞進行分析。


  try關鍵詞後必須為一個外部函式呼叫,在此處為


  ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(),from,tokenId,_data),即呼叫了外部ERC721A__IERC721Receiver的onERC721Received函式。return會將外部呼叫的返回值封裝為特定的函式名,此處為retval。


  如果外部呼叫和返回值封裝沒有出現錯誤,就會執行第一個語句塊的語句,此處為


  return retval==ERC721A__IERC721Receiver(to).onERC721Received.selector;


  該語句塊較為簡單,不再具體分析。


  catch用來捕獲錯誤,solidity提供了以下catch語句:


  catch Error(string memory reason){...}用於捕獲revert("reasonString")或require(false,"reasonString")等語句造成的錯誤


  catch Panic(uint errorCode){...}用於捕獲panic型別錯誤,如assert、除以0等錯誤


  catch(bytes memory lowLevelData){...}用於直接捕獲底層錯誤資訊,涵蓋所有型別錯誤


  在真實場景下,顯然我們無法保證呼叫的合約使用solidity編寫,所以使用最後一張catch方法是有必要的。


  顯然,此處使用的是最後一種catch語句。在捕獲到底層錯誤後,我們首先使用if語句判斷此錯誤資訊是否長度為0,如果長度為0,則意味著我們沒有具體的錯誤資訊,採取直接丟擲TransferToNonERC721ReceiverImplementer.selector的策略。


  此處使用了_revert函式,此函式是對revert包裝,定義如下:


  function _revert(bytes4 errorSelector)internal pure{


  assembly{


  mstore(0x00,errorSelector)


  revert(0x00,0x04)


  }


  }


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

相關文章