用ChatGPT驱动你的dApp

  • gelato
  • 发布于 2023-06-28 15:59
  • 阅读 18

本文深入探讨了AI与区块链的结合如何解决现有挑战并带来新机会,特别是通过Gelato的Web3功能,智能合约可以与OpenAI的API连接,实现自动化内容生成。文章详细介绍了代码结构、关键功能及其在社交媒体上的应用,展示了高效的自动化内容发布流程。

AI 和 web3 的结合有潜力应对 AI 领域现有的挑战,同时在 web3 中释放众多的创新机会。通过将 AI 带到区块链上,智能合约获得了基于动态链上数据做出自主决策和预测的能力,从而产生各种新的功能,所有这些都无需人工输入。AI 可以在推动去中心化网络的应用方面发挥重要作用,AI 代理可能会利用加密基础设施进行支付,并访问存储、计算和带宽等数字资源。

例如,一个被编程为为公司编写代码的 AI。这个 AI,24/7 全天候工作,可以通过基于区块链的智能合约来使用,并且它会因其成功合并的每个拉取请求而自动获得报酬。这不仅是一个真实的例子,也是软件开发新时代的标志,展示了 AI 和区块链交叉领域可能出现的令人兴奋的可能性。

这种强大的结合正在各个领域产生影响。在 DeFi 中,机器学习被用于预测分析、动态参数调整和交易历史分析。在游戏领域,它通过创建实时游戏内容和自适应角色来增强用户体验。在社交媒体中,AI 通过自动化发布和个性化内容过滤来改变格局。这些仅仅是 AI 和 web3 融合所揭示的可能性中的冰山一角。

在本教程中,我们将探讨 Gelato 的 Web3 Functions 如何使智能合约能够利用 AI 的力量,通过将它们连接到 OpenAI ChatGPT API,根据给定的提示生成创造性内容。Gelato 的 Web3 Functions 使智能合约能够无缝地与任何类型的链下数据进行交互。在我们的应用程序中,Gelato 的 Web3 Functions 帮助我们连接链下 Open AI API 以生成创造性内容,并将其自动化以每 8 小时安排一次。

支持 AI 的内容发布

让我们深入研究我们的应用程序的工作流程,该流程从 LensGelatoGPT 智能合约开始。该合约处理使用 AI 自动创建内容的提示的管理。它与 Lens Protocol 主合约 LensHub.sol 通信,以确保所有操作都由合法的 profile 所有者执行,并跟踪每个 profile 的提示。

LensHub.sol 充当系统的核心,与 Lens Protocol 中的所有交互进行接口。

然后,Gelato 的 Web3 Functions 代码调用 OpenAI API 以生成创造性内容,这些内容由从 LensGPT 智能合约获得的提示所指导。在此之后,使用 LensClient 获取并验证 Lens 发布元数据。验证后,内容将封装在元数据中,并使用 Web3Storage API 上传到 IPFS。

最后,创建 postData 对象,然后将其编码为 LensHub 合约的“post”函数的调用数据,然后在 Lens Protocol 上发布。

整个过程的最终结果是你的内容出现在 Lenster 上,Lenster 是一个使用 Lens Protocol 构建的社交媒体 Web 应用程序。从内容创建到发布的这个复杂的链下流程,得益于 Gelato 的 Web3 Functions,得以无缝执行!

前提条件

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

  • 注册了 Gelato Web3 Functions beta 版。
  • 安装了 Node.js v16+、NPM 和 Git。
  • 在你的浏览器中设置了一个 Web3 钱包,例如 MetaMask。
  • 在 Alchemy、Web3 storage 和 Open AI 上创建了帐户

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

你的开发环境

首先克隆 Gelato Web3 Functions lensgpt 仓库: git clone https://github.com/gelatodigital/lensgpt-tutorial.git

安装依赖项:

yarn install

代码结构

代码结构应如下所示:

配置密钥

Alchemy ID 私钥 一个 OpenAI 密钥 一个 Web3.Storage 密钥

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

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

获取 Alchemy ID

注册一个免费的 Alchemy 帐户 使用 Alchemy 创建帐户非常简单,可以免费注册

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

获取私钥

  • 转到你的 Metamask 钱包并执行以下操作:
  • 单击“帐户地址”旁边的三个点
  • 然后单击“帐户详细信息”
  • 导出私钥
  • 输入你的 Metamask 钱包密码
  • 复制私钥并将其粘贴到 .env 中

获取 OpenAI 和 Web3.Storage 密钥 在 web3-functions/lens-ai 目录中找到 .env.template 文件。同样,制作一份副本并将其重命名为 .env 并放入 API 密钥。

使用你的 GitHub 或电子邮件登录 Web3 Storage 网站,导航到你的帐户部分并生成一个新的 API Token。

对于 OpenAI API 密钥,请访问 OpenAI 网站,通过填写提供的表格创建一个新的密钥,并记下显示的密钥。获得后,需要将这些密钥输入到新创建的 .env 文件中。

现在你已准备好开始!

代码解释

LensGelatoGPT 智能合约在管理 AI 自动创建内容的提示方面起着至关重要的作用,它可以与 LensHub 合约无缝交互。

一个重要的功能是在设置或删除提示时与 LensHub 通信以验证 profile 所有权。它确保只有合法的 profile 所有者才能设置提示,这些提示充当 AI 生成内容的刺激。

在 LensGelatoGPT 合约中,LensHub 的 getDispatcher 函数在 setPrompt 函数中使用。这是为了确定 profile 的 dispatcher 是否设置为专用的 msg.sender 代理合约。这确认只有授权实体才能在 profile 上设置 AI 生成内容的提示。

专用的 msg.sender 代理合约是 Web3 Functions 的一项独特功能,它充当事务中间件,将它们路由到指定的目标合约。

现在,让我们看一下 LensGelatoGPT 合约的主要功能:

LensGelatoGPT 合约

  • setPrompt:此函数允许 profile 所有者为其 profile 设置提示。提示充当 AI 内容生成器的输入。它使用 LensHub 合约验证所有权,并确保交易费用正确。
        function setPrompt(
        uint256 _profileId,
        string calldata _prompt
    ) external payable onlyProfileOwner(_profileId) {
        require(msg.value == fee, "LensGelatoGPT.setPrompt: fee");
        require(
            bytes(_prompt).length <= 160,
            "LensGelatoGPT.setPrompt: length"
        );
        require(
            lensHub.getDispatcher(_profileId) == dedicatedMsgSender,
            "LensGelatoGPT.setPrompt: dispatcher"
        );
        _profileIds.add(_profileId);

        promptByProfileId[_profileId] = _prompt;
    }
  • stopPrompt: 此函数允许 profile 所有者从其 profile 中删除提示,从而有效地停止 AI 内容生成。所有权再次通过 LensHub 验证。
 function stopPrompt(
       uint256 _profileId
   ) external onlyProfileOwner(_profileId) {
       require(
           _profileIds.contains(_profileId),
           "LensGelatoGPT.stopPrompt: 404"
       );
       _profileIds.remove(_profileId);
       delete promptByProfileId[_profileId];  }
  • getPaginatedPrompts:此函数用于获取分页的提示列表。它返回一个 Prompt 结构数组,其中包含 profile ID 和关联的提示。

-collectFee:此函数允许收集设置提示所产生的费用。它只能由合约的 ProxyAdmin 执行。

function collectFee(address payable _to) external onlyProxyAdmin {
        _to.sendValue(address(this).balance);
    }

LensGelatoGPT Web3 Function

它从智能合约中获取提示,使用 OpenAI 基于这些提示生成文本,将生成的内容上传到 IPFS,然后将内容发布到 Lens。

让我们分解 index.ts 文件的关键部分,并检查它们在整个工作流程中的作用:

导入必要的库和合约 ABI

这些 import 语句包括函数正常工作所需的各种实用程序。Web3Function 和 Web3FunctionContext 是定义函数并与之交互所必需的。ethers 库中的 Contract 和 utils 用于与 Ethereum 智能合约和通用实用程序(如地址验证)进行交互。OpenAI API 用于生成内容。lensHubAbi 文件包含 LensHub 合约的应用程序二进制接口 (ABI),该接口定义了如何与其交互。

import { Web3Function, Web3FunctionContext } from "@gelatonetwork/web3-functions-sdk";
import { Contract, utils } from "ethers";
import { Configuration, OpenAIApi } from "openai";
import { v4 as uuidv4 } from "uuid";
import { Web3Storage, File, CIDString } from "web3.storage";
import { lensHubAbi } from "../../../helpers/lensHubAbi";
验证用户参数和密钥

在本节中,该函数获取执行该函数所需的密钥(API 密钥)和用户参数(合约地址)。如果这些密钥中的任何一个无效或丢失,该函数将返回错误。

查看以了解有关 userArgs 和密钥的更多信息。


const WEB3_STORAGE_API_KEY = await secrets.get("WEB3_STORAGE_API_KEY");
const OPEN_AI_API_KEY = await secrets.get("OPEN_AI_API_KEY");
const lensGelatoGPTAddress = userArgs.lensGelatoGPT as string;
const lensHubAddress = userArgs.lensHubAddress as string;
                        const collectModuleAddress = userArgs.collectModule as string;
从 LensGelatoGPT 合约中获取提示

该函数使用 getPaginatedPrompts 函数从 LensGelatoGPT 合约中获取一组提示。该函数返回指定范围的提示。

prompts.push(
  ...(await lensGelatoGpt.getPaginatedPrompts(
    nextPromptIndex,
    nextPromptIndex + NUMBER_OF_POSTS_PER_RUN
  ))
);
生成 AI 文本并将其发布到 LensHub

此脚本运行提示列表,使用 OpenAI API 根据每个提示生成内容。然后,该代码生成内容的元数据,并使用 LensClient 对其进行验证。然后,经过验证的元数据使用 Web3Storage 存储在 IPFS 上。然后,该代码创建一个名为 postData 的数据结构,其中包含所有必要的数据,包括 profileId、contentURI(IPFS 上内容的 URL)和其他模块相关数据。最后,它使用 lensHubAbi 创建一个接口实例,并将一个新对象推送到 callDatas 数组,该对象包含 lensHubAddress 和用于发布数据的编码函数数据。

for (const prompt of nonEmptyPrompts) {
    // ...
    const response = await openai.createCompletion({ /* ... */ });
    text = response.data.choices[0].text as string;
    // ...
    cid = await storage.put([myFile]);
    contentURI = `https://${cid}.ipfs.w3s.link/publication.json`;
    // ...
    callDatas.push({
      to: lensHubAddress,
      data: iface.encodeFunctionData("post", [postData]),
    });
}
更新执行状态

此部分在每次执行后更新存储状态。它跟踪上次运行的开始时间以及下一个提示的索引。这用于确定是否是再次运行该函数的时间,以及下一个运行中应处理哪些提示。

if (lastIntervalRunFinished) {
  await storage.set("lastRunStartTime", blockTime.toString());
}
if (isLastRun) {
  await storage.set("nextPromptIndex", "0");
} else {
  await storage.set(
    "nextPromptIndex",
    (nextPromptIndex + NUMBER_OF_POSTS_PER_RUN).toString()
  );}

总之:该函数从智能合约中获取提示,根据这些提示生成 AI 编写的文本,将此文本发布到 LensHub,并更新其状态以供下次运行。

运行 Web3 函数

LensGelatoGPT 智能合约

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

复制上面的智能合约地址。

部署 Web3 函数代码

web3-functions/lensChatGPT 文件夹中的 userArgs.json 文件中,将 lensGelatoGPT 地址替换为你部署的地址

然后运行此命令以部署 Web3 函数(它存储在 IPFS 上),要编译你的 Web3 函数并将其部署到 IPFS,请使用:

npx hardhat w3f-deploy W3FNAME

在我们的例子中:

npx hardhat w3f-deploy lensChatGPT

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

✓ Web3Function deployed to ipfs. ✓ CID: QmRVJPL5MSyxRxJWoYGYBGEifBwrUA4pAfhAspwQ9j7mnb

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

https://beta.app.gelato.network/new-task?cid=QmRVJPL5MSyxRxJWoYGYBGEifBwrUA4pAfhAspwQ9j7mnb

通过 UI 创建 Web3 函数任务

  1. 转到链接:单击设置 Web3 函数时获得的链接,IPFS CID 将已存在于该处。这使你可以查看 Web3 函数的代码。

  2. 输入用户参数:键入你在 userArgs.Json 文件中输入的参数:lensGelatoGPT、lensHubAddress 和 CollectModule

  3. 选择你的网络:选择你的任务要工作的网络。

  4. 添加你的密钥:放入你的 Web3 存储和 OpenAI API 密钥。

  5. 赋予你的任务生命:最后但并非最不重要的一点是,系统会要求你命名你的任务。点击“创建任务”按钮,使用你的钱包确认名称和任务创建,瞧!

监控你的任务表现

你可以从 Web3 Functions 任务仪表板上密切关注你的任务的执行情况。它拥有你需要的一切:

  • 执行:检查你的任务在特定日期运行了多少次。

  • 任务 日志:查看 Web3 Function 的代码已发送的日志。

  • 代码、存储和密钥:查看你的代码、存储详细信息和你的密钥以获得更多见解。

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

结论

在本详尽的指南中,我们探讨了如何通过 OpenAI、Web3 Storage、Lens Protocol 和 Gelato 的集成来利用 AI 和区块链的力量。这代表着在利用 AI 和 Web3 潜力方面向前迈出的重要一步。

当我们继续见证 AI 和区块链的融合时,想象这种协同作用为各个行业带来的可能性令人兴奋。我们希望本教程为你提供了进一步探索这些潜力的知识。

编码愉快,欢迎来到未来的互联网!

深入研究 Gelato

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

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

Web3 Functions 今天以 private beta 形式提供。有关更多信息,请查看 Web3 Functions documentation。要了解如何编写、测试和部署你自己的 Web3 函数,请查看我们的 in-depth tutorial

在此处申请申请成为首批测试 Gelato Web3 Functions 的人之一!

  • 原文链接: 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.