NFT数字藏品盲盒挖矿生态游戏系统开发智能合约源代码部署

简介: NFT数字藏品盲盒挖矿生态游戏系统开发智能合约源代码部署

NFT盲盒是什么意思?

正如玩家所说,你永远猜不到盒子里面是什么。这就是魅力所在。迎合了大众的心理,追求未知的刺激。现在盲盒也开始转移到线上,再次掀起浪潮。

就拿现在的NFT项目与盲盒结合举例来说,盲盒与挖矿的结合保证了项目的稳定发展和社区的持续活力。项目通过DeFi生态系统上流动性、产量矿池和NFT的独特性将其与盲盒游戏模式结合。

盲盒游戏软件开发的最大特点是写在智能合约上,保证公开透明,盲盒一旦满足相应的开奖条件后,点击立即开奖,开奖结果便已经生成,无法纂改。因为智能合约本身与其执行过程都是可观察的,支持监管和可信,智能合约中涉及的所有各方都确信该合同是以100%中立和无偏见的方式执行的,不会有欺诈、操纵或未经授权的修改风险。

合约部分

首先将本次合约部分的源码直接粘贴在remix中进行编译。源码如下:

pragma solidity ^0.8.10;
   
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
   
contract NftMeta is ERC721Enumerable, Ownable {
    using Strings for uint256;
   
    // 是否准许nft开卖-开关
    bool public _isSaleActive = false;
    // 初始化盲盒,等到一定时机可以随机开箱,变成true
    bool public _revealed = false;
   
    // nft的总数量
    uint256 public constant MAX_SUPPLY = 10;
    // 铸造Nft的价格
    uint256 public mintPrice = 0.3 ether;
    // 铸造的钱包最多只能有一个nft数量
    uint256 public maxBalance = 1;
    // 一次mint的nft的数量
    uint256 public maxMint = 1;
   
    // 盲盒开关打开后,需要显示开箱的图片的base地址
    string baseURI;
    // 盲盒图片的meta,json地址,后文会提到
    string public notRevealedUri;
    // 默认地址的扩展类型
    string public baseExtension = ".json";
   
    mapping(uint256 => string) private _tokenURIs;
   
    // 构造器
    constructor(string memory initBaseURI, string memory initNotRevealedUri)
        ERC721("Nft Meta", "NM") // 实现了ERC721的父类构造器,是子类继承的一种实现方式
    {
        setBaseURI(initBaseURI);
        setNotRevealedURI(initNotRevealedUri);
    } 
    // 外部地址进行铸造nft的函数调用
    function mintNftMeta(uint256 tokenQuantity) public payable {
        // 校验总供应量+每次铸造的数量<= nft的总数量
        require(
            totalSupply() + tokenQuantity <= MAX_SUPPLY,
            "Sale would exceed max supply"
        );
        // 校验是否开启开卖状态
        require(_isSaleActive, "Sale must be active to mint NicMetas");
        // 校验铸造的钱包地址中的nft的数量 + 本次铸造的数量 <= 该钱包最大拥有的nft的数量
        require( 
            balanceOf(msg.sender) + tokenQuantity <= maxBalance,
            "Sale would exceed max balance"
        );
        // 校验本次铸造的数量*铸造的价格 <= 本次消息附带的eth的数量
        require(
            tokenQuantity * mintPrice <= msg.value,
            "Not enough ether sent"
        );
        // 校验本次铸造的数量 <= 本次铸造的最大数量
        require(tokenQuantity <= maxMint, "Can only mint 1 tokens at a time");
        // 以上校验条件满足,进行nft的铸造
        _mintNftMeta(tokenQuantity);
    }
   
    // 进行铸造
    function _mintNftMeta(uint256 tokenQuantity) internal {
        for (uint256 i = 0; i < tokenQuantity; i++) {
            // mintIndex是铸造nft的序号,按照总供应量从0开始累加
            uint256 mintIndex = totalSupply();
            if (totalSupply() < MAX_SUPPLY) {
                // 调用erc721的安全铸造方法进行调用
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
   
    // 返回每个nft地址的Uri,这里包含了nft的整个信息,包括名字,描述,属性等
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
   
        // 盲盒还没开启,那么默认是一张黑色背景图片或者其他图片
        if (_revealed == false) {
            return notRevealedUri;
        }
   
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
   
        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return
            string(abi.encodePacked(base, tokenId.toString(), baseExtension));
    }
   
    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
   
    //only owner
    function flipSaleActive() public onlyOwner {
        _isSaleActive = !_isSaleActive;
    }
   
    function flipReveal() public onlyOwner {
        _revealed = !_revealed;
    }
   
    function setMintPrice(uint256 _mintPrice) public onlyOwner {
        mintPrice = _mintPrice;
    }
   
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }
   
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }
   
    function setMaxBalance(uint256 _maxBalance) public onlyOwner {
        maxBalance = _maxBalance;
    }
   
    function setMaxMint(uint256 _maxMint) public onlyOwner {
        maxMint = _maxMint;
    }
   
    function withdraw(address to) public onlyOwner {
        uint256 balance = address(this).balance;
        payable(to).transfer(balance);
    }
}
相关文章
|
8月前
|
数据采集 人工智能 大数据
演讲实录:中小企业如何快速构建AI应用?
AI时代飞速发展,大模型和AI的应用创新不断涌现,面对百花齐放的AI模型,阿里云计算平台大数据AI解决方案总监魏博文分享如何通过阿里云提供的大数据AI一体化平台,解决企业开发难、部署繁、成本高等一系列问题,让中小企业快速搭建AI应用。
|
7月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
213 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
7月前
|
人工智能 编解码 自然语言处理
AI智能混剪核心技术解析(一):字幕与标题生成的三大支柱-字幕与标题生成-优雅草卓伊凡
AI智能混剪核心技术解析(一):字幕与标题生成的三大支柱-字幕与标题生成-优雅草卓伊凡
254 4
AI智能混剪核心技术解析(一):字幕与标题生成的三大支柱-字幕与标题生成-优雅草卓伊凡
|
机器学习/深度学习 移动开发 JavaScript
介绍一下HTML5的新技能:神经网络
介绍一下HTML5的新技能:神经网络
202 5
|
运维 监控 安全
构建高效运维体系
本文将探讨如何通过科学的方法与先进的技术,实现高效、稳定、安全的IT运维管理。我们将从运维流程优化、自动化工具应用、监控告警机制、故障应急处理以及团队建设等方面,全面解析高效运维体系的构建方法与实践。
314 20
|
监控 网络协议 安全
SYN洪水攻击
【8月更文挑战第21天】
498 1
|
10月前
|
人工智能 小程序 数据挖掘
2025年企业CRM选型指南:销售易、金蝶、纷享销客对比
销售易、金蝶和纷享销客是国内知名的CRM解决方案,各自具备独特优势。销售易功能全面,涵盖销售、客户、营销管理及AI赋能,适合中大型企业;金蝶与ERP无缝集成,财务管理强大,适合传统企业;纷享销客连接能力强,用户体验佳,性价比高,适合中小企业。本文从功能、体验、价格、评价及适用场景对比三者,助力企业选择合适的CRM系统,推动数字化转型。
|
11月前
|
安全 Android开发 数据安全/隐私保护
《鸿蒙Next原生应用的独特用户体验之旅》
鸿蒙Next在界面设计、操作逻辑、动效体验等方面与iOS类似,强调简洁一致性,悬浮效果提升空间感。其操作便捷,动效流畅,性能优化使流畅度提升30%,媲美iOS。智能交互方面,鸿蒙Next的小艺助手和跨设备互联功能表现出色,支持识屏对话等深度交互。安全隐私保护机制细致,应用体积小,节省流量和存储空间。相比安卓和iOS,鸿蒙Next在用户体验上展现出独特优势,为用户带来更优质、便捷和安全的使用感受。
791 9
基于电压矢量变换的锁相环simulink建模与仿真
本课题基于电压矢量变换的锁相环(PLL)在MATLAB2022a中进行Simulink建模与仿真。该模型通过ab坐标变换和低通滤波,实现对三相电网电压的快速准确锁相,尤其在电压不平衡条件下表现优异。系统仿真结果显示,PLL能有效提取基波正序电压分量,适用于负序电压前馈控制及双序电流环控制策略。相比传统单相PLL,该方法更稳健地应对电网不平衡和频率突变,广泛应用于电力质量监测、三相PFC电路控制及分布式发电系统的并网控制等领域。
|
11月前
|
JSON 监控 API
京东商品列表 API 接口系列(京东 API)
本简介介绍了使用 Python 调用京东商品搜索和详情 API 的方法。首先需安装 `requests` 库,`hashlib` 和 `time` 为内置库无需安装。API 支持按关键词、类别等条件搜索商品,返回 JSON 格式的商品列表,包括 ID、名称、价格等信息。通过商品 ID 可获取详细信息如描述、规格等。示例代码展示了如何生成签名并发送请求。应用场景包括市场调研、竞品监测和价格预警等,为企业决策提供数据支持。