本文介绍了如何使用 Gelato 的 Web3 Functions 结合 StabilityAI 的 Stable Diffusion 工具来创建 NFT。
在当前技术快速演进的时代,AI 和 web3 的融合呈现出一个有趣的叙事。与其说是 AI 和加密技术的竞争,不如说是这两个领域相互协同的故事。AI 有望加速去中心化网络的采用,通过使智能合约能够安全地与机器学习模型交互,从而扩展 web3 的设计可能性。
该领域一项卓越的进步是生成建模(generative modeling),它是 AI 的一个方面,可以根据从现有信息中学习到的模式来创建新的数据。这个过程可以比作一个建筑师设计一座受不同建筑风格启发的独特建筑。
生成建模中一个值得注意的创新是扩散模型(diffusion model),它可以被想象成一个拼图大师。它获取一堆随机且无意义的数据,称为“噪声”,并巧妙地将其重新排列成连贯且有价值的图像。这位拼图大师可以独立工作,生成没有任何明确方向的图像(无条件生成),或者它可以利用引导线索(例如文本提示)来塑造最终输出(有条件生成)。
在本实践教程中,我们将探索 AI 和区块链融合的实际应用。具体来说,我们将演示如何将 Gelato 的 Web3 函数 与 StabilityAI 的 Stable Diffusion 工具相结合,以创建引人入胜的 NFT 创建体验。我们将使用 Stable Diffusion 生成 AI 创建的图像,这些图像将用作我们 NFT 的元数据。
Web3 函数是此过程的关键部分。它们将“链上”世界(即我们用于创建 NFT 的智能合约)与“链下”世界连接起来,在链下世界中我们可以访问像 Stable Diffusion 工具这样的 API。Gelato 的 Web3 函数弥合了这两个世界。它们会自动将 AI 创建的图像分配给 NFT。本教程将指导你使用这些函数来改进你的 NFT 创建过程。
以下是我们将介绍的内容:
GelatoNft 智能合约:你将学习如何使用此智能合约来铸造新的 NFT,直到最终揭示之前,保持一定程度的悬念。
Stable Diffusion:StabilityAI 的这款 AI 工具会生成独特的图像,这些图像将成为你 NFT 的元数据。你将探索如何将 AI 驱动的图像集成到你的 NFT 中。
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 和私钥:在你的根文件夹中找到 .env.template
文件,复制它并将副本重命名为 .env
。只有在将你的智能合约部署到测试网/主网时才需要这些密钥。
以下是获取这些密钥的步骤: 获取 Alchemy ID
使用 Alchemy 创建帐户非常简单,请在此处免费注册 here。
你需要一个 API 密钥来验证你的请求。你可以从仪表板创建 API 密钥。导航到“Create App”,填写详细信息以获取你的新密钥,并将其粘贴到 .env 中。
转到你的 Metamask 钱包并执行以下操作:
在 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 函数允许用户创建并铸造一个新的 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 函数由 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);
}
Web3 函数处理“reveal”过程,其中最初隐藏的 NFT tokenURI 会被公开。
这些 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";
////// 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", }; }
该函数获取当前和上次处理的 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 从给定提示生成的图像
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...
});
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,
};
});
在 Mumbai 网络上部署 在项目目录的根目录中运行此命令: npx hardhat run deploy/deploy-contract.ts --network mumbai
复制上面的智能合约地址
在 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=<YOUR\_IPFS\_CID>
你可以从你的 Web3 函数任务仪表板上密切关注你的任务的运行情况。它拥有你所需的一切:
有了这个仪表板,你将拥有关于你的任务的所有信息,触手可及。
总之,AI 和区块链的创新融合正在迅速改变 NFT 创建和参与的格局。通过本教程,你已经学习了如何应用这些开创性技术,使用 GelatoNft Solidity 智能合约铸造新的 NFT,使用 StabilityAI 的 Stable Diffusion 工具为你的 NFT 创建独特的 AI 生成图像,并使用 Gelato 的 Web3 函数自动化 NFT 创建过程。
这个过程为 NFT 领域的创建者和开发者开启了一个令人兴奋的新可能性领域,提供了丰富而沉浸式的用户体验。
Web3 函数为开发者提供了一个创新的解决方案,可以轻松地创建无服务器、去中心化的应用程序。
加入我们的社区并在 Discord 上进行开发者讨论。
Web3 函数现在以 私有 Beta 版 提供。有关更多信息,请查看 Web3 函数 documentation。要学习如何编写、测试和部署你自己的 Web3 函数,请查看我们的 in-depth tutorial。
在此处申请 here 成为首批测试 Gelato 的 Web3 函数的人员之一!
- 原文链接: gelato.cloud/blog/gelato...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!