Web3社區(qū)對于非同質(zhì)化詳細帶幣(NFT)充滿了期待。開發(fā)搭建(134-1633-5319),盡管還沒有殺手級應用的出現(xiàn),但是這項技術已經(jīng)重塑了數(shù)字資產(chǎn)所有權,身份體系,創(chuàng)新范式和社區(qū)運作方式。
因為NFT是可以被買賣交易的數(shù)字資產(chǎn),而NFT交易所收集了NFT的信息并且撮合了買家和賣家,所以NFT交易所是生態(tài)中一個必不可少的部分。
這個教程講解了如何用Solidity來搭建NFT交易所的“后端”,如何開發(fā)承載交易所業(yè)務邏輯的智能合約。在代碼中,我們會創(chuàng)建一個NftMarketplace.sol智能合約和一個兼容ERC-721(NFT)標準的代幣合約,然后將這個NFT展示在我們的交易所上。
在項目目錄下,創(chuàng)建contracts文件夾。在文件夾中,然后創(chuàng)建NftMarketplace.sol文件(文件路徑應該是../<<root>>/contracts/NftMarketplace.sol)。
在NftMarketplace這個智能合約中,需要完成之前提到的不同的操作。這些方法如下所示:
function listItem(
address nftAddress,
uint256 tokenId,
uint256 price
) {}
function cancelListing(address nftAddress, uint256 tokenId){}
function buyItem(address nftAddress, uint256 tokenId){}
function updateListing(
address nftAddress,
uint256 tokenId,
uint256 newPrice
){}
function withdrawProceeds(){} // method caller should be withdrawer
function getListing(address nftAddress, uint256 tokenId){}
盡管看起來很簡單,但智能合約還有很多必要的檢查,現(xiàn)在深入研究一下。我們要保證智能合約不被重入攻擊,重入攻擊一般是對重復執(zhí)行本來不該執(zhí)行的代碼來獲利,通常是重復執(zhí)行通證轉(zhuǎn)賬操作。
在實現(xiàn)這個交易所的邏輯時,我們需要使用下列的屬性和數(shù)據(jù)架構:
1個結構體:Listing用來存儲價格和賣房資產(chǎn)變量
3個事件:ItemListed,ItemCanceled和ItemBought。
2個mapping:s_listings和s_proceeds,它們存儲在區(qū)塊鏈上的狀態(tài)變量。
3個函數(shù)修飾器。
別著急,繼續(xù)看下面的智能合約的時候,你就會明白上面的東西。
讓我們先聲明智能合約。
可以看到,我們從OpenZeppelin中引入了兩個文件,OpenZeppelin提供了開源且經(jīng)過審計的,智能合約合約模版。我們的智能合約繼承了它的ReentrancyGuard智能合約(在Github上查看),這個智能合約中有我們需要用到的修飾符和方法,用來防止重入攻擊。
我們還引入了IERC721.sol文件,這個接口我們馬上就會用到。然而,我們的交易所智能合約不會繼承ERC-721通證標準,因為交易所合約不是一個通證合約。