TP錢包/ImToken錢包/MetaMask小狐狸錢包/去中心化錢包系統開發成熟技術丨原始碼案例

xiaofufu發表於2023-04-12

  


  首先,使用者透過Web介面或者收集App將運算元據傳送到一個傳統的業務伺服器,該業務伺服器時傳統網際網路中心化的伺服器,但是與傳統系統不同的是,該系統沒有像傳統網際網路設計那樣將資料放入中心化的資料庫儲存,而是透過一個Web3.0介面,將資料傳送到以太坊區塊鏈公鏈上。


  該介面是一個JSON RPC協議,該協議由很多程式碼實現。目前的是執行在Web容器中的Web.js3模組。Solidity程式語言經過編譯之後,除了交易需要的合約初始化程式碼之外,還有ABI介面等描述檔案



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


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


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


  以太坊採用了Solidity作為智慧合約語言,Solidity是一門為實現智慧合約而建立的程式語言,開發搭建威:MrsFu123,能在允許以太坊程式的節點上執行。該語言吸收了C++、JavaScript的一些特性,例如它是靜態型別語言,支援繼承庫等。


  智慧合約是一種只有透過區塊鏈才能實現的新技術。智慧合約是數字化的,儲存在區塊鏈中,並使用加密程式碼強制執行協議。智慧合約與區塊鏈的結合,普遍被認為是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智慧合約技術的平臺--以太坊的誕生,被認為是開啟了"區塊鏈2.0"時代。


  函式定義如下:


  function transferFrom(


  address from,


  address to,


  uint256 tokenId


  )public payable virtual override


  該函式的引數為:


  from待轉移NFT的擁有者地址


  to待轉移NFT的接收者地址


  tokenId待轉移NFT的tokenId


  根據上述流程,我們將逐個解析其中使用的函式。


  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)


  }


  }


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

相關文章