Web3社区对于非同质化详细带币(NFT)充满了期待。开发搭建(134-1633-5319),尽管还没有杀手级应用的出现,但是这项技术已经重塑了数字资产所有权,身份体系,创新范式和社区运作方式。
因为NFT是可以被买卖交易的数字资产,而NFT交易所收集了NFT的信息并且撮合了买家和卖家,所以NFT交易所是生态中一个必不可少的部分。
这个教程讲解了如何用Solidity来搭建NFT交易所的“后端”,如何开发承载交易所业务逻辑的智能合约。在代码中,我们会创建一个NftMarketplace.sol智能合约和一个兼容ERC-721(NFT)标准的代币合约,然后将这个NFT展示在我们的交易所上。
在项目目录下,创建contracts文件夹。在文件夹中,然后创建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){}
尽管看起来很简单,但智能合约还有很多必要的检查,现在深入研究一下。我们要保证智能合约不被重入攻击,重入攻击一般是对重复执行本来不该执行的代码来获利,通常是重复执行通证转账操作。
在实现这个交易所的逻辑时,我们需要使用下列的属性和数据架构:
1个结构体:Listing用来存储价格和卖房资产变量
3个事件:ItemListed,ItemCanceled和ItemBought。
2个mapping:s_listings和s_proceeds,它们存储在区块链上的状态变量。
3个函数修饰器。
别着急,继续看下面的智能合约的时候,你就会明白上面的东西。
让我们先声明智能合约。
可以看到,我们从OpenZeppelin中引入了两个文件,OpenZeppelin提供了开源且经过审计的,智能合约合约模版。我们的智能合约继承了它的ReentrancyGuard智能合约(在Github上查看),这个智能合约中有我们需要用到的修饰符和方法,用来防止重入攻击。
我们还引入了IERC721.sol文件,这个接口我们马上就会用到。然而,我们的交易所智能合约不会继承ERC-721通证标准,因为交易所合约不是一个通证合约。