搜索
NFT元宇宙Web3
近期热门

你想建立你自己的PFP NFT项目?这里有一份简要教程

Founder

作者:Harry Denley,文章写于2021年9月23日

NFT(Non-Fungible Tokens)在去年有了一个流星般的崛起,许多项目已经发布,购买者围绕它们已经形成了坚定共识的社区。

为了显示对项目的忠诚或支持,许多用户(无论是否匿名)选择将他们的个人资料图片(或简称 “PFP”)改为他们收藏的一个NFT。这使得这些用户很容易被识别为社区成员,而拥有/展示具有不常见/罕见特征的NFT不仅可以增加该NFT的有形价值,还可以增加社会价值。

你想建立你自己的PFP NFT项目?这里有一份简要教程

事实上,OpenSea–一个受欢迎的NFTs交易市场–已经看到他们的用户群和销售量呈指数级增长,部分原因是基于艺术的PFP NFTs的崛起。

你想建立你自己的PFP NFT项目?这里有一份简要教程

很多人在推出自己的PFP NFT项目时都很开心,但如果你没有这方面的知识或技能,这可能很困难。

在本教程结束时,你应该了解如何利用图层(特别是没有内在效用/价值的NFT,作为PFP项目)以编程方式建立任何数量的图片,列出它们的特征,并将其全部 “上链”,开始建立你的社区。此外,我还会触及一些需要注意的诈骗手段和建立NFT项目时需要考虑的一般合约注意事项。

对于这篇文章,如果你想跟读,请参考409H/sample_nft_project资料库(
https://github.com/409H/sample_nft_project#sample-nft-project)。

你想建立你自己的PFP NFT项目?这里有一份简要教程

1. 构建图层

首先,我们需要描述我们的项目中需要哪些层/特质,这样我们就知道要制作什么样的图形。在这个例子中,我们将创建一个简单的项目,有一些基本的不同的层/特质。

  • 头部形状
  • 头部颜色
  • 眼睛的颜色
  • 眼睛的形状
  • 嘴的颜色
  • 嘴的形状

我们将从建立不同类型的头像开始:圆形、方形和三角形的选择,以及颜色的变化。

要开始,你需要一个图形创作软件。在这个项目中,我使用 “8bit painter(
https://apps.apple.com/gb/app/8bit-painter/id894301273)”,画布尺寸为16×16(启用网格)。

参考0,0的坐标(水平线和垂直线在中心相遇的地方)作为脸的中间。这样我们就可以在画布上创建相对于头部(图形中的主要层)有间隔的其他层。

你想建立你自己的PFP NFT项目?这里有一份简要教程

在上面的图片中,你会注意到三个目录(层)。00head, 01eyes, 和 02mouth. 头部将是图形的基础层,眼睛和嘴巴将以编程方式叠加在头部层之上,因此我们不必手动创建每个图像的所有不同层。

请记住,这是一个样本项目–我没有对艺术做太多的处理,使其看起来很花哨,也没有准备许多不同的特征类型–这一切只是为了让你了解我们能完成什么。

请注意,每一层(除了头部)都有一个透明的背景和相同的画布尺寸,所以图像可以很容易地统一叠加在一起,如图所示。

一旦所有不同的图层和变化都完成了,我们就可以开始写代码来建立最终的图像,并记录每张图像各自的特征映射。请注意,我们将每个图层命名为<layer>_<trait_shape>_<trait_color>.png – 这是有意为之,因为这将有助于以编程方式建立每个图形的特质映射。如果你用同样的代码建立你自己的项目,确保运行`composer run test`来对你的图片文件名进行测试。

2. 合并图层

现在我们的项目包含了输出最终图形所需的图层,我们需要写一些代码将这些图层组合在一起,并在项目中强制执行某种稀有性–例如,一些项目喜欢将僵尸/骷髅变体的角色作为 “稀有”,这意味着只有一小部分最终图像会有这些 “皮肤”。在我们的案例中,我们不会强制要求任何类型的稀有性,图层将被随机挑选。

为此,我们将编写一些PHP代码,并使用图像处理的GD库进行图像处理。最终的代码可能看起来并不漂亮(我期待着使用PHP的pitchforks),但它将按计划工作,建立图像。

我们一共有4种头部类型、4种头部颜色、3种眼睛颜色、2种眼睛类型、2种嘴部颜色和1种嘴部类型,并且可以自由编写代码来描述它们的稀有性–但首先,让我们把代码合并到每个层。

一旦代码将各层合并到我们的规则集(只是随机选择各层进行n次迭代),代码将生成接口(如OpenSea)所需的JSON对象,以显示每张图片的特征,这将从合同层存储在baseURI中的端点获取。

你想建立你自己的PFP NFT项目?这里有一份简要教程

3. 创建NFT智能合约

在大多数情况下,NFT合约使用广泛接受的EIP-721标准,这是一套关于一些代码的规则。这些规则概述了函数名称、函数参数和函数返回类型,然后允许合约的实施/消费顺利进行,因为产品只需要按照这些标准编写代码,不必担心任何项目特定的调用来渲染图形(或询问合约的信息,如 “这个合约上的地址
0x11b6A5fE2906F3354145613DB0d99CEB51f604C9拥有多少NFT?” )。

有各种框架和工具协助将合约部署到基于EVM的区块链上;我们将使用Remix来部署NFT合约,并设置合约以允许购买NFT。由于它符合EIP-721标准,它将与OpenSea等二级市场开箱即用。

为了定制合约逻辑,我们可以使用OpenZepplin Wizard(
https://docs.openzeppelin.com/contracts/4.x/wizard)和Remix(https://remix.ethereum.org/)。为了将该项目部署到Rinkeby测试网,我们将遵循Andrew B Coathup(https://forum.openzeppelin.com/t/create-an-nft-and-deploy-to-a-public-testnet-using-remix/6358)的这个伟大的教程。(然后,一旦我们确定要在这上面花真金白银,我们就会部署到主网上)。

你想建立你自己的PFP NFT项目?这里有一份简要教程

由于我们希望允许用户用一些NFT来铸造一些价值,我们可以在合约中添加一个函数(删除EIP-721函数是不允许的,但我们可以自由地在整个合约中添加我们想要的数量)。

我们需要修改向导生成的代码,对mint()的调用次数设置一个限制–不应该有超过我们之前创建的唯一图形数量的mints。注意:由于基于零的索引(意味着数字从0开始,而不是1),我们需要从数字中减去1。

sol

uint immutable maxSupply;

constructor(uint _maxSupply) ERC721("Sample NFT Project", "SNP") {

maxSupply = _maxSupply - 1;

}
你想建立你自己的PFP NFT项目?这里有一份简要教程

当合约被部署时,我们必须在构造函数参数中输入可以被铸造的最大供应量(我们之前输出的唯一图像的数量)。这意味着,每做一个mint()就会有一个图像和属性。

NFT的铸币功能最常由铸币的用户支付,这意味着铸币者需要向合约发送一些ETH,以便收到他们的NFT。为了允许这一点,我们将在我们的合约中添加一个新的功能,以0.01ETH的成本来进行挖矿。这些ETH将被放置在合约中,直到合约的所有者调用另一个新方法:`withdraw()`。请注意,你可以将其设置为你想要的任何价格–有些项目甚至允许免费铸币,而矿工只需支付gas费即可

sol

function mint() public payable {
require(_tokenIdCounter.current() <= maxSupply, "Sold out"); // NFT project sold out
require(msg.value == 0.01 ether, "Incorrect amount"); // Cost to mint 1 NFT is 0.01 ETH (10000000000000000 wei)

_safeMint(msg.sender, _tokenIdCounter.current());
_tokenIdCounter.increment();
}

function withdraw() public onlyOwner { // Owner can withdraw all the eth that was paid to mint NFTs

address payable recipient = payable(address(msg.sender));
recipient.transfer(address(this).balance);
}

一旦我们把合约和我们的初始参数部署到Rinkeby,我们就可以调用mint()来铸造一个NFT。

  • Creation of contract: https://rinkeby.etherscan.io/tx/0x46ce4ad1cacae757ee12252b5e214509d829bcc0626aaf325965ae99b5249f74
  • Minting an NFT: https://rinkeby.etherscan.io/tx/0x4d4102264edfe4aee9a58d1cbc405b0e5b308708c92ffce5413d80459e0e7c1c
  • Claiming ETH: https://rinkeby.etherscan.io/tx/0xb6eb339e065c9cb573af2496cef3d2ca67e9b9852c08b2492e9eaed11cbc3bbd

现在我们有了链上合约(
0xab9d2c623ec60a60a08a87e22adc83b91a486f2c),并且一个NFT已经被铸造(索引为0),我们可以通过使用OpenSea的验证端点验证元数据。

然后我们就可以在OpenSea上查看NFT的所有特征了!

你想建立你自己的PFP NFT项目?这里有一份简要教程

4. 验证合约

区块浏览器,如Etherscan,现在将显示我们的合约,因为它已被部署,但只显示字节码,直到我们验证合约。有时这是一个手动过程,但在部署过程中也有自动工具可以做到这一点。由于我们的合约从OpenZeppelin资源库中导入其他合约,我们将通过使用一个名为truffle-plugin-verify的伟大工具来节省时间。

验证合约将使它更容易被人阅读,因为Solidity代码将被公布在区块资源管理器上,人们可以更容易地验证合约的逻辑。这与社区和开发者建立了内在的信任,因为每个人对项目背后的代码都有相同的看法。

我们将需要创建一个新的.env文件,并为Etherscan和QuickNode添加API密钥,以及提供一个[仅供测试使用!!]秘密恢复短语,这样我们就可以在Rinkeby测试网上部署合约,并通过两个命令验证合约。

shell

truffle migrate --network rinkeby # Deploy contract to Rinkeby with Truffle

truffle run verify SampleNftContract --network rinkeby # Verify contract source code on Etherscan

5. 部署前注意事项

如果你是跟着sample_nft_project资源库走,那么:

图形相关

  • 在images_raw目录下添加更多的图层图形,并正确命名这些文件。
  • 阅读PHP脚本,确保最终的图形和特质是按照你的要求建立的,因为目前没有强制执行稀有性/唯一性。
  • 最重要的是要安全地托管你的图像元数据。如果它被托管在你自己的域名上(就像这个例子,数据被托管在harrydenley.com上),那么就有可能出现图形不永恒的情况。一些项目提倡使用将数据存储在IPFS上。

智能合约相关

  • 确保你把元数据的静态端点改成你托管元数据的地方。
  • 确保你把合约名称和符号改成与你的项目有关的东西。
  • 确保你对每个NFT的成本感到满意,如果你不满意,就改变数值。
  • 部署合约时,确保将maxSupply设置为images_processed目录中最高数字的整数。
  • 考虑使用Remix部署,将JavascriptVM或注入的web3提供商指向Rinkeby,这样你就不会用真金白银来测试了。

5. 部署后注意事项

由于我们可以添加/编辑合约的功能,包括改变BaseURI(元数据存放的地方),如果你想把所有东西都指向一个服务器并更新 “揭示你的NFT “事件的端点,最好(为社区着想)把这个值设置为静态的,或者至少以后调用renounceOwnership()。特别要注意的是,如果元数据在一个集中的服务器上(也就是说,一个不是 “不可变 “的服务器,如IPFS、Arweave等),那么任何能够访问该服务器的人都可以改变NFT的特征和外观。

一旦铸币供应量达到其最大值(部署合约时在构造器中设置的值),并且你已经从合约中提取了ETH,要考虑调用renounceOwnership()。你将不再需要合约上的任何所有权,因为有一个静态的NFT供应。

这个NFT智能合约,在没有修改的情况下,会要求用ETH支付来换取NFT,这可能会引起 “气体战争”,特别是当你的NFT收集投放有高度预期的时候。有不同的方法来处理这个问题,我们最近强调了这一点。

我们也注意到了创作者如何接收为NFT支付的ETH。我们没有在mint()调用中添加逻辑将ETH付款转发给合约所有者,而是添加了另一个方法供所有者调用,即withdraw(),这样他们可以随时调用。这意味着用户铸造NFT的气量限制(反过来也是交易成本)会降低。

买卖NFT可能很有趣,但建立你自己的NFT项目可能是令人生畏的。希望这能给你带来一些关于这个过程的启示,并让你有信心去建立!

编辑于 2022-05-15 04:36
「 真诚赞赏,手留余香 」
赞赏

发表评论已发布0

手机APP 意见反馈 返回顶部 返回底部