用 Stable Diffusion 铸造你的 NFT

  • gelato
  • 发布于 2023-06-28 17:38
  • 阅读 23

本文介绍了如何使用 Gelato 的 Web3 Functions 结合 StabilityAI 的 Stable Diffusion 工具来创建 NFT。

在当前技术快速演进的时代,AI 和 web3 的融合呈现出一个有趣的叙事。与其说是 AI 和加密技术的竞争,不如说是这两个领域相互协同的故事。AI 有望加速去中心化网络的采用,通过使智能合约能够安全地与机器学习模型交互,从而扩展 web3 的设计可能性。

该领域一项卓越的进步是生成建模generative modeling),它是 AI 的一个方面,可以根据从现有信息中学习到的模式来创建新的数据。这个过程可以比作一个建筑师设计一座受不同建筑风格启发的独特建筑。

生成建模中一个值得注意的创新是扩散模型diffusion model),它可以被想象成一个拼图大师。它获取一堆随机且无意义的数据,称为“噪声”,并巧妙地将其重新排列成连贯且有价值的图像。这位拼图大师可以独立工作,生成没有任何明确方向的图像(无条件生成),或者它可以利用引导线索(例如文本提示)来塑造最终输出(有条件生成)。

在本实践教程中,我们将探索 AI 和区块链融合的实际应用。具体来说,我们将演示如何将 Gelato 的 Web3 函数StabilityAIStable Diffusion 工具相结合,以创建引人入胜的 NFT 创建体验。我们将使用 Stable Diffusion 生成 AI 创建的图像,这些图像将用作我们 NFT 的元数据。

Web3 函数是此过程的关键部分。它们将“链上”世界(即我们用于创建 NFT 的智能合约)与“链下”世界连接起来,在链下世界中我们可以访问像 Stable Diffusion 工具这样的 API。Gelato 的 Web3 函数弥合了这两个世界。它们会自动将 AI 创建的图像分配给 NFT。本教程将指导你使用这些函数来改进你的 NFT 创建过程。

工作流程

以下是我们将介绍的内容:

  1. GelatoNft 智能合约:你将学习如何使用此智能合约来铸造新的 NFT,直到最终揭示之前,保持一定程度的悬念。

  2. Stable Diffusion:StabilityAI 的这款 AI 工具会生成独特的图像,这些图像将成为你 NFT 的元数据。你将探索如何将 AI 驱动的图像集成到你的 NFT 中。

  3. Gelato 的 Web3 函数:这些函数充当你的 NFT 智能合约与链下Stable Diffusion API 之间的管道,自动将 AI 创建的图像分配给你的 NFT。在本教程结束时,你将掌握如何使用 Gelato 的 Web3 函数来简化你的 NFT 创建过程。

准备好开始一段对数字创新未来的深刻探索之旅吧!

先决条件

在开始之前,请确保你已具备以下条件:

完成设置后,我们就可以开始了!

设置你的开发环境

首先克隆 Gelato Web3 函数 lensgpt 存储库: git clone https://github.com/gelatodigital/W3F-NFT-AI

安装依赖项:

yarn install

代码结构

配置密钥

  • Alchemy ID
  • 私钥
  • Stable Diffusion 密钥
  • NFT.Storage 密钥

获取 Alchemy ID 和私钥:在你的根文件夹中找到 .env.template 文件,复制它并将副本重命名为 .env。只有在将你的智能合约部署到测试网/主网时才需要这些密钥。

以下是获取这些密钥的步骤: 获取 Alchemy ID

注册一个免费的 Alchemy 帐户

使用 Alchemy 创建帐户非常简单,请在此处免费注册 here

创建一个 Alchemy 应用程序

你需要一个 API 密钥来验证你的请求。你可以从仪表板创建 API 密钥。导航到“Create App”,填写详细信息以获取你的新密钥,并将其粘贴到 .env 中。

获取私钥

转到你的 Metamask 钱包并执行以下操作:

  • 点击“帐户地址”旁边的三个点
  • 然后点击“Account Details”
  • 导出私钥
  • 输入你的 Metamask 钱包密码
  • 复制私钥并将其粘贴到 .env 中

获取 Stable diffusion 和 NFT.Storage 密钥

在 web3-functions/stable-diffusion-nft 目录中找到 .env.template 文件。同样,创建一个副本并将其重命名为 .env

使用你的 GitHub 或电子邮件登录 NFTStorage 网站,导航到 API Keys 部分并生成一个新密钥。

对于 Stable Diffusion API 密钥,请访问 website,点击 My Profile 并从 API Keys 部分获取你的 API 密钥。获得密钥后,需要将这些密钥输入到新创建的 .env 文件中。

现在你已准备好开始!

代码解释

“GelatoNft”合约代表 Polygon 区块链上的 NFT。用户可以通过调用 mint 函数来铸造新 token,并提供一个布尔值来指示该 token 代表夜晚还是日落。该合约会跟踪已铸造的 token 及其所有权。revealNft 函数由特定的 Gelato 消息发送者用于更新 token 元数据 URI。

GelatoNft 合约

  • mint():

“GelatoNft”合约中的 mint 函数允许用户创建并铸造一个新的 NFT。它会检查调用者是否已经铸造了一个 token,增加 token ID 计数器,将 token 铸造到调用者的地址,并将默认 URI 设置为 notRevealedUri

function mint(bool _isNight) external whenNotPaused {
        require(!hasMinted[msg.sender], "Already minted!");
        tokenIds.increment();
        uint256 newItemId = tokenIds.current();
        _mint(msg.sender, newItemId);
        _setTokenURI(newItemId, notRevealedUri);
        hasMinted[msg.sender] = true;
        tokenIdByUser[msg.sender] = newItemId;
        nightTimeByToken[newItemId] = _isNight;
        emit MintEvent(newItemId); }
  • revealNft()

revealNft 函数由 Gelato 的专用 msg.sender 用于更新特定 token 的元数据 URI。在此合约中,更新后的 URI 是使用 Stable Diffusion API 生成的,该 API 会创建 NFT 元数据图像。设置 URI 后,会发出 MetadataUpdate 事件以通知侦听器有关 token 的更新元数据。这是由 Web3 函数自动执行的函数,当用户铸造 NFT 时,Web3 函数将运行并调用 revealNft() 函数并更新 tokenURI。

    function revealNft(uint256 tokenId, string memory tokenURI) external
onlyGelatoMsgSender {
        _setTokenURI(tokenId, tokenURI);
        emit MetadataUpdate(tokenId);
    }

GelatoNft Web3 函数

Web3 函数处理“reveal”过程,其中最初隐藏的 NFT tokenURI 会被公开。

  • 导入必要的库和合约 ABI

这些 import 语句包括函数正常工作所需的各种实用程序。Web3Function 和 Web3FunctionContext 用于定义和与 Web3 函数交互。来自 ethers 库的 Contract 用于与智能合约交互。NFTStorage 用于存储 NFT 元数据,而 axios 用于发出 HTTP 请求。

import { Web3Function, Web3FunctionContext } from "@gelatonetwork/web3-functions-sdk";
import { Contract, utils } from "ethers";
import { NFTStorage, File } from "nft.storage";
import axios, { AxiosError } from "axios";
  • 验证用户参数和密钥 在本节中,该函数获取用户参数和密钥,其中包括合约地址和 API 密钥。nftAddress 是从用户参数中检索的,而 API 密钥是从密钥中获取的。如果这些值缺失或无效,该函数将抛出错误。
////// User Arguments
const nftAddress = userArgs.nftAddress as string;
console.log("nftAddress", nftAddress);

if (!nftAddress) throw new Error("Missing userArgs.nftAddress please provide");
  ////// User Secrets
  const nftStorageApiKey = await secrets.get("NFT_STORAGE_API_KEY");
  const stableDiffusionApiKey = await secrets.get("STABLE_DIFFUSION_API_KEY");

  if (!nftStorageApiKey || !stableDiffusionApiKey) {
    console.error("Error: Missing secrets");
    return {
      canExec: false,
      message: "Error: Missing Secrets",    };  }
  • 获取和处理 NFT

该函数获取当前和上次处理的 token ID。如果有任何新 token,该函数会批量处理它们,以保持在 RPC 调用限制内。该函数按顺序检查每个 NFT,并且仅选择那些尚未揭示的 NFT。

  • 生成元数据和创建图像

对于每个选定的 NFT,该函数会根据 NFT 合约中的夜晚或白天时间生成 NFT 属性和描述。该描述用作通过 Stable Diffusion API 生成图像的提示。Stable Diffusion API 返回生成的图像的 URL,然后将其存储以通过 NFT.Storage 上传到 IPFS。如果在该过程中发生错误,则会捕获该错误并返回相应的消息。

const isNight = await nft.nightTimeByToken(tokenId);
const nftProps = generateNftProperties(isNight);
// Generate NFT image with Stable Diffusion
let imageUrl: string;
const stableDiffusionResponse = await fetch("https://stablediffusionapi.com/api/v3/text2img", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",  },
  body: JSON.stringify({
    key: stableDiffusionApiKey,
    prompt: nftProps.description,
    // Other parameters for the API request...
}),});
const stableDiffusionData = await stableDiffusionResponse.json();

由 Stable Diffusion 从给定提示生成的图像

  • 上传到 IPFS 由 Stable Diffusion API 生成的图像与其余 NFT 元数据一起获取并上传到 IPFS,使用 NFTStorage 库。NFTStorage 提供了一个界面,可以轻松地将 NFT 数据存储在 IPFS 网络上。
const imageBlob = (await axios.get(imageUrl, { responseType: "blob" })).data;
const nftStorage = new NFTStorage({ token: nftStorageApiKey });

const imageFile = new File([imageBlob], `gelato_nft_${tokenId}.png`, { type: "image/png" });
const metadata = await nftStorage.store({
  name: `GelatoNFT #${tokenId}`,
  description: nftProps.description,
  image: imageFile,
  attributes: nftProps.attributes,
  // Other properties for the metadata...
});
  • 执行合约的函数 然后,Web3 函数使用合约地址 token ID 和 token URI 为 revealNft 函数创建必要的调用数据,以更新 tokenURI。
const callDatas: Array<{ to: string; data: string }> = [];
  tokensData.forEach((token) => {
    callDatas.push({
      to: nft.address,
      data: nft.interface.encodeFunctionData("revealNft", [\
        token.id,\
        token.url, ]), });
  });
  return {
    canExec: true,
    callData: callDatas,
  };
});
  • 日志记录和状态更新 如果所有 NFT 都已揭示或者没有要处理的新 NFT,则该函数会记录此信息并在存储中更新“lastProcessedId”以跟踪进度。它还将返回一个 canExec 属性,该属性设置为 false 和一条相应的消息。

运行 Web3 函数

部署 GelatoNFT 智能合约

在 Mumbai 网络上部署 在项目目录的根目录中运行此命令: npx hardhat run deploy/deploy-contract.ts --network mumbai

复制上面的智能合约地址

部署 Web3 函数代码

web3-functions/stable-diffusion-nft 文件夹中的 userArgs.json 文件中,将 GelatoNFT 地址替换为你部署的地址。

然后运行命令来部署 Web3 函数。它们存储在 IPFS 上,用于编译你的 Web3 函数并将其部署到 IFPS,请使用

npx hardhat w3f-deploy W3FNAME

在本例中: npx hardhat w3f-deploy stable-diffusion-nft

上传后,Gelato 节点将代表你把文件固定在 IPFS 上。如果上传成功,你应该会得到返回的 Web3 函数的 IPFS CID。

✓ Web3Function deployed to ipfs. ✓ CID: <YOUR_IPFS_CID>

要创建一个每分钟运行你的 Web3 函数的任务,请访问:

https://beta.app.gelato.network/new-task?cid=&lt;YOUR\_IPFS\_CID>

通过 UI 创建 Web3 函数任务

  1. 转到链接:点击你设置 Web3 函数时获得的链接,IPFS CID 将已经在那里。这可以让你查看你的 Web3 函数的代码。
  2. 输入用户参数:输入你在 userArgs.Json 文件中输入的参数:nftAddress。
  3. 选择你的网络:选择你的任务要运行的网络。
  4. 添加你的密钥:输入你的 NFT 存储和 Stable Diffusion API 密钥。
  5. 赋予你的任务生命:最后但并非最不重要的一点是,你将被要求命名你的任务。点击“Create Task”按钮,使用你的钱包确认名称和任务创建,就这样!

监控你的任务性能

你可以从你的 Web3 函数任务仪表板上密切关注你的任务的运行情况。它拥有你所需的一切:

  • Executions:查看你的任务在特定日期运行了多少次。
  • Task Logs:查看 Web3 函数的代码发出的日志。
  • Code, Storage, & Secrets:查看你的代码、存储详细信息和你的密钥以获取更多信息。

有了这个仪表板,你将拥有关于你的任务的所有信息,触手可及。

结论

总之,AI 和区块链的创新融合正在迅速改变 NFT 创建和参与的格局。通过本教程,你已经学习了如何应用这些开创性技术,使用 GelatoNft Solidity 智能合约铸造新的 NFT,使用 StabilityAI 的 Stable Diffusion 工具为你的 NFT 创建独特的 AI 生成图像,并使用 Gelato 的 Web3 函数自动化 NFT 创建过程。

这个过程为 NFT 领域的创建者和开发者开启了一个令人兴奋的新可能性领域,提供了丰富而沉浸式的用户体验。

使用 Gelato 深入探索

Web3 函数为开发者提供了一个创新的解决方案,可以轻松地创建无服务器、去中心化的应用程序。

加入我们的社区并在 Discord 上进行开发者讨论。

Web3 函数现在以 私有 Beta 版 提供。有关更多信息,请查看 Web3 函数 documentation。要学习如何编写、测试和部署你自己的 Web3 函数,请查看我们的 in-depth tutorial

在此处申请 here 成为首批测试 Gelato 的 Web3 函数的人员之一!

  • 原文链接: gelato.cloud/blog/gelato...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
gelato
gelato
The Web3 Developer Cloud. Launch your own chain via our #1 Rollup-As-A-Service platform.