尚硅谷以太坊区块链学习之NFT智能合约(6)

  • 前言
  • 一、NFT智能合约
    • 1、智能合约代码
    • 2、智能合约推送
    • 3、具体调用
  • 二、具体使用
  • 三、NFT商家智能合约

前言

提示:服务外包区块链学习

5被ban了,也不知道怎么改能过,无所谓了,我以后能看的见就行,不知道这篇能不能过审

说明:从这篇博客开始就不用Ubuntu写区块链了,改用Windows,因为需要链接前面写的有关NFT系统的后台,而后台在Windows的主机上,即便用VMware设置了端口映射,主机的MataMask还是链接不上虚拟机上的,所以改用Windows,感觉都差不多,甚至Windows还要简单些。

只记录操作
尚硅谷以太坊区块链直达链接

一、NFT智能合约

1、智能合约代码

直接上代码了,需要详细理解的自己百度吧,因为我也不是很懂
反正原理就是NFT的详细实体不可能传上区块链,完全上去要耗费太多gas了
所以只能将实体保存在系统后台,将NFT的文件URI上传到区块链形成NFT

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";contract NFTMarket is ERC721,  ERC721Enumerable, ERC721URIStorage  {using Strings for uint256;using Counters for Counters.Counter;Counters.Counter private _tokenIds;address private owner;mapping (uint256 => string) private _tokenURIs;string private _baseURIextended;constructor () ERC721("NFTMarket", "NFTMKT") {owner = msg.sender;//currToken = IERC20(_currTokenAddress);}function setBaseURI(string memory baseURI_) external {_baseURIextended = baseURI_;}function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual override(ERC721URIStorage){require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");_tokenURIs[tokenId] = _tokenURI;}function _baseURI() internal view virtual override returns (string memory) {return _baseURIextended;}function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");string memory _tokenURI = _tokenURIs[tokenId];string memory base = _baseURI();if (bytes(base).length == 0) {return _tokenURI;}if (bytes(_tokenURI).length > 0) {return string(abi.encodePacked(base, _tokenURI));}return string(abi.encodePacked(base, tokenId.toString()));}function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {return super.supportsInterface(interfaceId);}function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal  override(ERC721, ERC721Enumerable) {super._beforeTokenTransfer(from, to, tokenId);}function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {super._burn(tokenId);}function burnNFT(uint256 tokenId) public returns (uint256) {require(msg.sender == ownerOf(tokenId),"Only the owner of this Token could Burn It!");_burn(tokenId);return tokenId;}function mintNFT(address _to,string memory tokenURI_) public returns (uint256){_tokenIds.increment();uint256 newItemId = _tokenIds.current();_mint(_to, newItemId);_setTokenURI(newItemId, tokenURI_);return newItemId;}function transNFT(address _from,address _to,uint256 tokenId) public returns (uint256) {require(msg.sender == ownerOf(tokenId),"Only the owner of this Token could transfer It!");transferFrom(_from,_to,tokenId);return tokenId;}function destroy() virtual public {require(msg.sender == owner,"Only the owner of this Contract could destroy It!");selfdestruct(payable(owner));}
}

2、智能合约推送

因为使用了别的合约中的方法,所以要选择推送的具体合约

每一个推送成功的合约地址和使用的命令最好用一个文档记起来,方便后续使用

3、具体调用

简单说一下一些方法的使用:
mintNFT(铸造NFT)
burnNFT(销毁NFT)
safeTransferFrom(发NFT给指定账号)
transNFT(交易NFT)
balanceOf(查看指定用户有多少个NFT)
ownerOf(查看指定tokenId的拥有者)
tokenByIndex(查看指定索引的NFT)
tokenOfOwner(查看指定地址的指定索引的NFT)
totalSupply(查看NFT总数)

二、具体使用

新建两个账号,再用MataMask导入账号


挖矿!


成功!

看自己有几个NFT了

call方法都是不用提交交易就可以调用的,所以不需要挖矿

NFT总数

刚刚铸造的NFT在我的账号里是第二个,所以它的索引是1(从0开始哈)


这个时候返回的就是这个NFT的tokenId了,有了tokenId既可以看这个NFT的tokenURI了

使用结束!

三、NFT商家智能合约

NFT商家智能合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";contract NFTStore is Context, ERC20 {address private owner;struct Mints {address minter;uint256 amount;}mapping(uint256 => Mints) public tokenToMint;mapping(uint256 => uint256) private tokenAmounts;/*** @dev Constructor that gives _msgSender() all of existing tokens.*/constructor (uint256 tokenNum) ERC20("NFTStore", "NFC") {owner = msg.sender;_mint(_msgSender(), tokenNum * (10 ** uint256(decimals())));}function mint(address _to,uint256 amount,uint256 tokenId) public {require(msg.sender == owner,"Only the owner of this Contract could mint!");  // 本文添加,否则函数 mint 会有逻辑错误_mint( _to, amount) ;    // 如果没有添加上一句 require,此处会有逻辑错误,任何人都可以免费获得NFCtokenAmounts[tokenId] = amount;Mints memory mintted = Mints({minter: _to,amount: amount});tokenToMint[tokenId]=mintted;}function getTokenAmount (uint256 tokenId) public view returns (uint256) {return tokenAmounts[tokenId];}function gettokenMints(uint256 tokenId) public view returns ( address, uint256){Mints memory mintted = tokenToMint[tokenId]; return (mintted.minter,mintted.amount);}function destroy() virtual public {require(msg.sender == owner,"Only the owner of this Contract could destroy It!");selfdestruct(payable(owner));}
}

这个我还没怎么使用过,有兴趣的小伙伴可以自己进行尝试。
明天写Java的区块链框架Web3j的使用

Over

尚硅谷以太坊区块链学习之NFT智能合约(6)相关推荐

  1. 尚硅谷以太坊区块链学习(4)

    尚硅谷以太坊区块链学习(4) 前言 一.安装环境 1.安装Golang 2.安装Geth 二.初始化区块链 1.创建创世区块 2.区块链初始化 三.Geth客户端操作 1.启动Geth客户端 前言 提 ...

  2. 区块链学习笔记21——智能合约

    二十一.智能合约 智能合约是以太坊的精髓,也是以太坊和比特币一个最大的区别. 什么是智能合约? 智能合约的本质是运行在区块链上的一段代码,代码的逻辑定义了智能合约的内容 智能合约的账户保存了合约当前的 ...

  3. 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    ☞ ░ 前往老猿Python博文目录 ░ 一.智能合约的定义 通俗来说,智能合约就是一种在计算机系统上,当一定条件满足的情况下可被自动执行的合约,智能合约体现为一段代码及其运行环境.例如银行信用卡的自 ...

  4. 以太坊区块链浏览器(二)开发

    以太坊区块链浏览器开发,包括合约信息及链上信息展示,web3j的对应API. 更多区块链技术与应用分类: 区块链应用    区块链开发 以太坊 | Fabric | BCOS | 密码技术 | 共识算 ...

  5. 以太坊区块链Java(EthereumJ)学习笔记:概述

    本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...

  6. java以太坊源码分析_以太坊区块链Java(EthereumJ)学习笔记:区块链结构-Go语言中文社区...

    本文对EthereumJ的区块链相关的代码做一个简单的介绍. 以太坊区块链 以太坊区块链是在Bitcoin区块链的基础上发展起来的.区块链的数据结构既保留了Bitcoin区块链验证数据的真实性和完整性 ...

  7. 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点

    以太坊区块链同步 by Lukas Lukac 卢卡斯·卢卡奇(Lukas Lukac) Ethereu M 69:如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to ...

  8. 用以太坊区块链保证Asp.Net Core的API安全(上)

    去中心化应用程序(DApp)的常见设计不仅依赖于以太坊区块链,还依赖于API层.在这种情况下,DApp通过用户的以太坊帐户与智能合约进行交互,并通过交换用户凭据而发布的JWT token与API层进行 ...

  9. 如何才能招聘到合适的以太坊区块链开发者

    对优质区块链开发人员的需求很大,这是有充分理由的.区块链和ICO领域在过去几年中爆炸式增长.越来越多的人试图进入并在该领域中扬名立万.但是,为了获得成功,他们拥有一支强大而健全的团队至关重要.区块链开 ...

最新文章

  1. 美国三院院士「迈克尔•乔丹」长文论述:为什么说「人工智能革命」尚未发生...
  2. 【网络编程】之十、重叠IO Overlapped IO
  3. 网络技术 几项技术!
  4. c语言标准库内存分配监控,C语言的本质(25)——C标准库之内存管理
  5. 【HamonyOS嵌入式】BearPi-HM_Nano控制DS18B20温度传感器(注释版)
  6. 诡异大阳飙升动因何在
  7. 怎么查计算机的ip,教你如何查询电脑ip地址的方法
  8. MatLab SimuLink国产代替
  9. Java——名片管理系统
  10. c语言判断获取位置字符,C语言 · 判定字符位置
  11. Vue3 +ts 打包后访问是空白页面
  12. 【C语言】程序结构、基本语法、数据类型
  13. iOS拍摄视频,自定义拍摄界面,高清压缩,添加水印
  14. 计算机视觉(特征检测)- DoG 和 SIFT 进行特征提取描述
  15. 计算机英语词典 txt,英汉词典TXT格式英汉词典TXT格式.doc
  16. 光速入门消息队列Kafka
  17. android项目开发之多媒体开发
  18. Photoshop CS6 实例之用通道抠取人像
  19. SQL2005安装步骤
  20. python实现多张多格式图片转PDF并打包成exe

热门文章

  1. Python小白的数学建模课-A3. 12个新冠疫情数模竞赛赛题与点评
  2. 百度地图api之创建自定义控件
  3. 伦敦旅游必玩的密室逃脱体验——《神探夏洛克:官方现场游戏》
  4. 对话知道创宇丨如何守住内容安全生命线?
  5. 【python学习】matplotlib图例分开显示
  6. 青少年机器人等级考试四级考什么
  7. 破解 geetest(极验)的滑块验证码
  8. python tutorial什么意思中文_Python 2.7 Tutorial 中文版
  9. 专访富数科技吴海斌:隐私计算头部效应明显,2022年落地才是硬道理
  10. php能抓抖音短视频教程,初学者必须要掌握的抖音短视频拍摄的小技巧