nft數藏平臺系統開發技術方案丨數藏nft系統ai繪畫定製開發技術流程

Tg_StPv888發表於2023-03-03

  根據一個Token ID返回Metadata的URL:uri(uint256 id)


  查詢一個地址擁有的Token ID數量:balanceOf(address account,uint256 id)


  授權或取消授權一個地址有權轉移NFT:setApprovalForAll(address operator,bool approved)


  轉移一個NFT:safeTransferFrom(address from,address to,uint256 id,uint256 amount,bytes calldata data)


  EIP-1155定義的介面和實現都可以在OpenZeppelin上找到,我們只需要在ERC1155的基礎上修改即可。ERC1155的核心程式碼其實就是一個對映,記錄Token ID到持有地址、再到持有數量:


  contract ERC1155{     搭建‘I8O28578624'


  //Mapping from token ID to account balances


  mapping(uint256=>mapping(address=>uint256))private _balances;


  }


  我們做的主要修改是增加一個Token ID到URL的對映。因為我們準備將NFT的圖片和Metadata資料都放到IPFS上,所以增加一個Token ID到IPFS檔案雜湊的對映:


  contract ERC1155{


  mapping(uint256=>string)private _metadataHashes;


  string private _uriPrefix=“”;


  //返回”QmasWH…re2Ych?filename=metadata.json”


  //如果使用伺服器API返回則可以固定uri為”{id}”


  function uri(uint256 id)public view returns(string memory){


  return _concat(_uriPrefix,_metadataHashes[id],“?filename=metadata.json”);


  }


  }


  第二個修改是增加一個mint()方法來鑄造NFT:


  function mint(uint256 amount,string memory metadataHash)public returns(uint256){


  //如果只允許合約部署者鑄造,加上判斷:


  //require(msg.sender==owner,“Not contract owner”);


  nextTokenId++;


  uint256 tokenId=nextTokenId;


  _metadataHashes[tokenId]=metadataHash;


  _mint(msg.sender,tokenId,amount,“”);


  return tokenId;


  }


  最後一步是在isApprovedForAll()中判斷下當前轉移操作的發起者是不是OpenSea的代理合約:


  function isApprovedForAll(address account,address operator)public view returns(bool){


  //Whitelist OpenSea proxy contract for easy trading.


  ProxyRegistry proxyRegistry=ProxyRegistry(proxyRegistryAddress);


  if(address(proxyRegistry.proxies(account))==operator){


  return true;


  }


  return _operatorApprovals[account][operator];


  }


  這麼做的目的是將來在OpenSea售賣的時候,不需要授權操作,節省了gas費,缺點是無條件信任了OpenSea的代理合約,降低了一點安全性。


  NFT鑄造流程


  理解NFT的鑄造流程是非常重要的。首先,一個NFT關聯了一個特定的資源,如圖片、影片、3D模型、VR等。假定我們的NFT就是一個圖片,鑄造NFT的第一步是將圖片上傳並獲得一個固定的URL。這裡我們選擇IPFS,上傳成功後返回的URL類似:w開發StPv888


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

相關文章