写NFT合约要实现哪些功能
比如你要发行一套NFT,开发对接v+hkkf5566,你要怎么写合约呢?
这个合约要实现至少以下几个功能:
1、“铸造”(mint)功能。
NFT是非同质化代币,也就是一种“币”(token)了。
根据我前面的NFT科普文章,所谓铸造,就是在区块链上记载了一个token的ID和其拥有者的地址。
2、转移功能。
要能让拥有者把一个token转移给另外一个人。
3、查询功能。
要能查询某个token在谁手里,一个人有多少token,等等这种类似功能。
4、元数据功能。
元数据这个术语,其实就是描述某事物各种属性的信息。由于图片一般比较大,所以图片本身都不放在以太坊上,而是放在web上或者IPFS上,链上只是存储了一个链接信息。
合约有了元数据功能,提供了tokenURI函数,人们就可以通过该函数的调用,获取某个token的元数据链接,然后读取元数据,并最终取得其图像。
5、合约元数据功能。
如果你想把你的NFT放在OpenSea上作为一个Collection(收藏集)出现,就要让OpenSea能获取关于你Collection的一些基本设置。
6、其他功能
比如团队分账功能(团队成员按一定的比例获取收益)、白名单预售功能(只有白名单里的人才能在预售阶段mint)等等。
import` `"@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; …… contract MyNFT is Ownable, ERC721Enumerable, PaymentSplitter { …… function setBaseURI(string memory _newBaseURI) public` `onlyOwner {` ` baseURI = _newBaseURI; }` `function _baseURI() internal view virtual override returns (string memory) {` ` return baseURI; }` ` { "name": "", "description": "NFT", "image": " "external_link": " "seller_fee_basis_points": 100, # Indicates a 1% seller fee. "fee_recipient": "0xA97F337c39cccE66adfeCB2BF99C1DdC54C2D721"` `}` `import` `"@openzeppelin/contracts/security/ReentrancyGuard.sol"; pragma solidity ^0.4.22;contract SimpleStorage{ uint storedDate;` ` ` ` function set (uint x) public{ storedDate = x;` ` } function get() public view returns(uint){ return` `storedDate;` ` }} pragma solidity ^0.4.22;contract SolidityTest{ constructor() public{` ` } function getResult() public view returns(uint){ //这是单行注释` ` /* *这是多行注释` ` *类似其他语言的注释 */` ` uint a = 1; uint b = 2;` ` uint result = a + b; return` `result;` ` }}``