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