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

2023-11-19


前言

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

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,此处会有逻辑错误,任何人都可以免费获得NFC
        tokenAmounts[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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 一篇文章学会使用摩斯密码,简单易懂,你也可以使用“降维打击”

    阅读之前 大家请先看一行符号 看看大家能不能猜出这段符号所代表的含义 相信能看出这段符号含义的人还是占少数 没关系 通过阅读久见菌的这篇文章保证让你能看懂这是什么意思 摩尔斯电码的发明 上面这一串符号就是使用摩尔斯电码打出来的英语单词 摩尔
  • Latex特殊符号大全(高清)

    Latex符号大全 转载内容供自己阅读 原文 Latex特殊符号大全 高清
  • Cmake学习

    Cmake学习 CMake调用boost的编译脚本 cmake minimum required VERSION 3 14 project boost python 设置支持C 11特性 set CMAKE CXX STANDARD 11

随机推荐

  • 鸟哥的Linux私房菜PDF在线阅读

    鸟哥的Linux私房菜在线阅读 我在网上查了好久都没有找到正经的关于鸟哥的linux私房菜的PDF版本 要么就是耍流氓的要钱 给了钱 也不一定能得到完整版的PDF 我也只找到了在线版的 在这里供献出来 仅供大家学习参考之用 至于PDF版的
  • 如何查看linux服务器是否为amd64架构还是x86_64架构

    前言 环境 centos 7 9 我们在下载软件时 软件包后面通常带有amd64的字样 那么如何知道我们的服务器是不是amd64架构呢 下面的这些命令可以查看linux的版本及其他信息 查看linux内核版本 root master cat
  • 计算机网络-应用层协议2(FTP)

    1 文件传输协议 FTP 原理 如图所示 FTP工作原理如下 用户或主机通过FTP用户接口与FTP客户进程交互 该用户首先提供远程主机的主机名 使本地主机的FTP客户进程建立一个到远程FTP服务器进程的TCP连接 紧接着该用户提供用户标识和
  • 各种Java加密算法

    如基本的单向加密算法 BASE64 严格地说 属于编码格式 而非加密算法 MD5 Message Digest algorithm 5 信息摘要算法 SHA Secure Hash Algorithm 安全散列算法 HMAC Hash Me
  • 华为Atlas200dk使用第三步------只用一根网线登录华为开发板

    华为开发板Atlas200DK ARES500DK开发板 开发板使用心得系列文章目录 第三章 一根线登录华为开发板 目录 前言 同时使用网线和串口线连接开发板有点多余 线多显得乱 串口连接开发板也比较繁琐 因此本文给大家提供两种使用一根网线
  • FLutter Error: ADB exited with exit code 1 Performing Streamed Install

    出现这个原因是模拟器存储空间满了没办法安装运行新的应用 打开模拟器界面将原先一些不要的应用卸载了就能安装了
  • C语言中的基本输入输出

    目录 1 字符输出函数putchar 2 字符输入函数getchar 3 格式化输出函数printf 4 格式化输入函数scanf 5 字符串接收函数gets 6 字符串接收函数fgets 7 字符串输出函数puts 8 格式化转换为字符串
  • R语言【数据集的导入导出】

    目录 一 从键盘输入数据 二 函数方法读取 1 读取数据文件 2 从屏幕读取数据 1 scan 2 readline 3 读取固定宽度数据文件 三 读取csv文件 四 读取表格数据文件 五 从网络中读取表格或者CSV数据文件 一 从键盘输入
  • ip地址段分解与合并

    1 为什么要分解和合并ip地址段 无他 工作需要嘛 谁没事去划分ip地址段 优点 可以节省大量的时间 减少算错的可能性 2 工具下载 下载链接 https github com zhanhb cidr merger github在国内使用不
  • 如何查询Oracle数据库的操作日志

    Oracle数据库里有一个专门存储操作的视图 v sqlarea 可以通过它查询历史操作 select t SQL TEXT t FIRST LOAD TIME from v sqlarea t where t SQL TEXT like
  • linux下vbox+chrome os安装体验

    1 安装虚拟机 VirtualBox sudo apt install virtualbox 2 下载chrome OS ISO 文件 http www getchrome eu download 3 过程
  • CUDA小白 - NPP(6) 图像处理 Geometry Transforms (1)

    cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化 具体的可以参考别的博主的介绍 都比较详细 还有一些cuda中的专有名词的含义 可以参考 详解CUDA的Context Stream Warp SM SP Kernel B
  • opencl入门

    openCL开发 绪论 知乎 OpenCL中文入门完整教程 opencl教程 其它文档类资源 CSDN下载 OpenCL中文入门完整教程 opencl教程 其它文档类资源 CSDN下载
  • 数据包的传输过程详解及TCP沾包问题

    目录 TCP沾包问题 5个基本知识点 封装报文是从上层到下层 应用层 gt 传输层 gt 网络层 gt 数据链路层 gt 物理层 解封装报文是从下层到上层 数据包传输的过程中 源IP和目标IP不会变 除非遇到NAT SNAT或DNAT 源M
  • mysql架构图

    MySQL 插件式的存储引擎架构将查询的处理和其它的系统任务以及数据的存储提取相分离 这种架构可以根据业务的需求和实际需要选择合适的存储引擎 连接层 最上层是一些客户端和连接服务 主要完成一些类似于连接处理 授权认证 及相关的安全方案 在该
  • swc的打包

    1 新建库项目 键入项目名称 2 新建类或者组件 并且键入包名 选择输出路径 3 编辑组件 4 打包一个好处在于复用 隐藏源码 5 使用的时候加载进来便可
  • mysql离散查询

    现有如下表 在刚开始学习where子句的时候 我想查找薪水30000和8000是哪些人时 我首先想到的是 select from employee where sal 30000 and sal 8000 结果mysql返回空给我 错误原因
  • 毛新生:一盘鱼香肉丝与SOA的故事

    将服务用一个业务流程组装在一起 在这里就体现了与以往IT一个巨大的不同 不只是在于它将下面这些服务整合起来成为一个业务流程 更重要的事情在哪里 是它终于让IT与业务人员有了共同的语言 那就是业务的活动和业务流程 而且在这里它是一个形式化的显
  • 解决ubuntu远程ssh连接不了问题

    安装openssh server sudo apt get install openssh server 在 etc ssh目录下 vim sshd config 发现该文件只可读 在终端输入命令 sudo passwd 然后输入当前用户的
  • 尚硅谷以太坊区块链学习之NFT智能合约(6)

    尚硅谷以太坊区块链学习之NFT智能合约 6 前言 一 NFT智能合约 1 智能合约代码 2 智能合约推送 3 具体调用 二 具体使用 三 NFT商家智能合约 前言 提示 服务外包区块链学习 5被ban了 也不知道怎么改能过 无所谓了 我以后