NFT数字盲盒是使用区块链技术制造的数字藏品铸造系统,以盲盒的形式发售。每个盲盒内都有一款数字藏品。
NFT数字盲盒的制造和交易过程都是去中心化的,每个数字藏品都拥有独一无二的标识,防止伪造和篡改。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract GameItem is ERC721URIStorage {
using Counters for Counters.Counter;
// 自增的tokenId
Counters.Counter private _tokenIds;
// 是否可以开盲盒
bool public canOpen = false;
constructor() ERC721("GameItem", "ITM") {}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
// 判断是否可以开盲盒
require(canOpen, 'can not open now');
// 确保已被 mint
require(_exists(tokenId), 'token not minted');
string memory baseURI = _baseURI();
if (bytes(baseURI).length > 0) {
// 拼接 json 文件地址
string memory path = string.concat(baseURI, Strings.toString(tokenId));
return string.concat(path, '.json');
} else {
return ''
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
contract RoboNFT is VRFConsumerBaseV2 {
// 协调器
VRFCoordinatorV2Interface COORDINATOR;
struct ChainlinkParams {
// 订阅 ID
uint64 subId;
// 要使用的 gas 通道
// 回调的 gas 限制,其值取决于要获取的随机数的数量
// 获取一个随机数需要 20000 wei
uint32 gasLimit;
// 请求确认的次数 - 设置为3即可
uint16 requestConfirms;
// 每次请求获得的随机数数量
uint32 numWords;
}