pragma solidity 0.6.6;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
contract AdvancedCollectible is ERC721, VRFConsumerBase {
uint256 public tokenCounter;
enum Breed{PUG, SHIBA_INU, BRENARD}
// add other things
mapping(bytes32 => address) public requestIdToSender;
mapping(bytes32 => string) public requestIdToTokenURI;
mapping(uint256 => Breed) public tokenIdToBreed;
mapping(bytes32 => uint256) public requestIdToTokenId;
event requestedCollectible(bytes32 indexed requestId);
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash)
public
VRFConsumerBase(_VRFCoordinator, _LinkToken)
ERC721("Dogie", "DOG")
tokenCounter = 0;
keyHash = _keyhash;
fee = 0.1 * 10 ** 18;
function createCollectible(string memory tokenURI, uint256 userProvidedSeed)
public returns (bytes32){
bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
requestIdToSender[requestId] = msg.sender;
requestIdToTokenURI[requestId] = tokenURI;
emit requestedCollectible(requestId);
function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override {
address dogOwner = requestIdToSender[requestId];
string memory tokenURI = requestIdToTokenURI[requestId];
uint256 newItemId = tokenCounter;
_safeMint(dogOwner, newItemId);
_setTokenURI(newItemId, tokenURI);
Breed breed = Breed(randomNumber % 3);
tokenIdToBreed[newItemId] = breed;
requestIdToTokenId[requestId] = newItemId;
tokenCounter = tokenCounter + 1;
function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
require(
_isApprovedOrOwner(_msgSender(), tokenId),
"ERC721: transfer caller is not owner nor approved"
_setTokenURI(tokenId, _tokenURI);
我们使用 Chainlink VRF 从 PUG、SHIBA_INU、BRENARD 列表中创建一个随机品种。当我们这次调用 createCollectible
时,我们实际上向链下的 Chainlink VRF 节点发起了一个请求,并返回一个随机数,以使用这 3 个品种之一创建 NFT。
在你的 NFT 中使用真正的随机性是创造真正稀缺性的好方法,使用 Chainlink oracle 随机数意味着你的数字可以证明是随机的,并且不会受到矿工的影响。
您可以在文档中了解有关 Chainlink VRF 的更多信息。
https://docs.chain.link/docs/chainlink-vrf/
Chainlink 节点通过调用 fulfillRandomness
函数进行响应,并根据随机数创建收藏品。然后我们仍然需要调用 _setTokenURI
来为我们的 NFT 提供它需要的外观。
我们没有在这里给出我们的 NFT 属性,但属性是让我们的 NFT 进行交互的好方法。您可以在此 龙与地下城
示例中看到具有属性的 NFT 的一个很好的示例。
https://github.com/PatrickAlphaC/dungeons-and-dragons-nft
来自 IPFS 的元数据
我们使用 IPFS 来存储两个文件:
我们使用 IPFS 是因为它是一个免费的去中心化平台。我们可以通过下载 IPFS 桌面并点击导入按钮将我们的 tokenURI 和图像添加到 IPFS。
然后,我们可以通过点击要共享的文件旁边的 3 个点、点击共享链接并复制给定的链接来共享 URI。然后我们可以将此链接添加到我们的 set_tokenuri.py
文件中以更改我们想要使用的 tokenURI
。
但是,如果 tokenURI 仅在我们的节点上,这意味着当我们的节点关闭时,没有其他人可以查看它。所以我们希望其他人 pin
我们的 NFT。我们可以使用 Pinata
之类的 pin
服务来帮助我们的数据保持活动状态,即使我们的 IPFS 节点已关闭。
我想未来会有越来越多的元数据存储在 IPFS 和去中心化存储平台上。集中式服务器可能会宕机,这意味着这些 NFT 上的艺术将永远丢失。请务必检查您使用的 NFT 的 tokenURI 所在的位置!
我也希望更多的人会使用像 Filecoin 这样的 dStorage 平台,因为使用 pin
服务也没有像它应该的那样去中心化。
现在,您已经具备了制作漂亮有趣、可定制、交互式 NFT 的技能,并让它们在市场上呈现。
NFT 是一种有趣、强大的方式,可以补偿艺术家们所做的辛勤工作。
欢迎添加下方二维码加入社群
一起探讨Python与区块链开发技术
点击下方阅读原文加入社区会员
在本文中,我们将学习如何使用 Brownie、Python 和 Chainlink 来制作非同质化的 NFT 作品,并在 OpenSea NFT 市场上展示和销售我们的成果。在学习本文前,...
2、启动ganache,并将监听端口设置成8545。
3、打开cmd,进入到此文件夹目录下,并预先安装truffle。
4、执行truffle compile指令,随后执行truffle migrate指令。
5、进入文件夹的app目录下,执行npm run dev指令。
6、浏览器中打开127.0.0.1/8080。
### 回答1:
你可以使用下面的Python代码来绘制NFT:import numpy as npimport matplotlib.pyplot as plt# Create data pointsx = np.arange(-10, 10, 0.1)# Create NFT functiony = np.sin(x) / x# Plot the NFTplt.plot(x, y)# Show the plotplt.show()
### 回答2:
当然可以给你一段能够绘画出NFT(Non-Fungible Tokens,非同质化代币)的Python代码。
首先,你需要安装Python的绘图库,如matplotlib。使用以下命令安装:
pip install matplotlib
接下来,我们可以编写一个简单的Python函数,用于绘制NFT的图形。代码如下:
```python
import matplotlib.pyplot as plt
def draw_nft():
# 创建一个图形窗口
fig = plt.figure()
# 创建一个子图
ax = fig.add_subplot(111)
# 绘制NFT的图形
ax.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
# 设置图形标题和坐标轴标签
ax.set_title('My NFT')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
# 显示图形
plt.show()
# 调用函数绘制NFT
draw_nft()
在这个例子中,我们首先导入了`matplotlib.pyplot`库,并定义了一个名为`draw_nft`的函数。函数内部创建了一个图形窗口和一个子图。我们使用`ax.plot()`函数绘制了一条简单的线段,此处仅作为示例。
然后,通过`ax.set_title()`、`ax.set_xlabel()`和`ax.set_ylabel()`设置了图形的标题和坐标轴标签。最后,使用`plt.show()`函数显示绘制的NFT图形。
通过运行这段代码,你将得到一幅简单的NFT图形,其中的样式和具体图案可以根据你的需求进行自定义,例如绘制更复杂的几何图形、插入图像等。
希望这段代码能满足你的需求,并帮助你在Python中绘制出独特的NFT图形!
### 回答3:
当然可以给你一个简单的例子来绘制NFT(Non-Fungible Token)的Python代码。
```python
import random
from PIL import Image
# 创建新的NFT图像
def create_nft(width, height):
# 创建一个空白的RGB图像
img = Image.new("RGB", (width, height))
# 生成随机像素颜色
pixels = []
for _ in range(width * height):
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
pixels.append((r, g, b))
# 将像素设置到图像中
img.putdata(pixels)
# 保存图像
img.save("nft.png")
print("NFT图像已保存")
# 测试创建一个256x256的NFT图像
create_nft(256, 256)
上述代码利用Python的PIL库(Pillow)创建一个指定宽度和高度的空白图像,然后在该图像上生成随机像素颜色,并将其保存为PNG文件。这个简单的例子只是为了展示如何使用Python基本的图像处理库来生成NFT。当然,在实际应用中,你可以根据自己的需求添加更多的图像处理算法和NFT的特征。
请注意,这只是一个简单的示例,生成的NFT图像可能与实际的NFT要求以及安全性要求不符,请在实际应用中使用更完善的图像处理算法和安全机制。