DEFI - Web3函数 - Gelato

  • gelato
  • 发布于 2023-02-22 18:46
  • 阅读 32

本文介绍了Gelato的Web3 Functions,它允许开发者在去中心化环境中运行serverless函数,从而扩展智能合约的功能。通过Typescript编写,存储在IPFS上,并由Gelato执行,这些函数可以与链上和链下数据交互,并自动执行交易。文中详细说明了如何编写、测试和部署Web3 Functions,并创建相应的任务。

如何使用 Web3 Functions 构建无服务器 web3 应用

使用链下计算能力来增强你的 web3 智能合约!

我们将智能合约称为“智能”合约,因为它们确切地知道如何执行我们要求它们执行的任务。拥有按预期执行的不可变代码是一个很好的起点,但问题是它们不知道何时执行——而时机在处理金融系统时往往至关重要。

自成立以来,Gelato 一直为 web3 用户提供基于链上条件执行任务的能力。这已经非常强大了;使开发人员能够自动化和中继交易。现在,Gelato 更进一步,为 web3 用户提供在去中心化环境中运行无服务器函数的能力**。这些函数可以在链上和链下进行通信,运行任何自定义逻辑,并在链上发送交易。

查看这篇博文 以了解有关 Web3 Functions 的更多信息!

去中心化的无服务器函数

你可以将 web3 Functions 视为去中心化的云函数,其工作方式类似于 AWS Lambda 或 Google Cloud Functions——但适用于 web3。它们使开发人员能够基于任意链下数据(例如 API、子图等)和计算来执行链上交易。这些函数用 Typescript 编写,存储在 IPFS 上,并由 Gelato 运行。 如需进一步阅读,你可以查看文档

创建 Web3 Functions

为了实现我们创建无服务器、去中心化的 Web3 Function 的目标,我们将把工作分为两个阶段:

  1. 编写、测试和部署函数本身
  2. 创建将执行 Web3 Function 调用的任务

编写、测试和部署 Web3 Function

按照以下简单步骤启动并运行你的 Web3 Function。

克隆我们的 Web3 Functions 模板仓库:

git clone https://github.com/gelatodigital/web3-functions-template

Cd 进入目录并安装依赖项:

cd web3-functions-template
yarn

将 .env.example 文件复制到 .env 文件,并添加 PROVIDER_URL,即在你的项目中用于本地测试的 RPC。只有当你希望以编程方式创建任务时,才需要私钥。

部署后,你的 Web3 Function 将使用 Gelato 的 RPC——PROVIDER_URL 仅用于你的本地测试

cp .env.example .env

编辑你的 .env 文件:

PROVIDER_URL="" # 你的 provider URL(例如 https://eth-mainnet.alchemyapi.io/v2/YOUR_ALCHEMY_ID)
PRIVATE_KEY="" # 可选:仅当你希望从 CLI 而不是 UI 创建任务时才需要

编写 Web3 函数

我们现在可以开始用 Typescript 编写我们的函数了。让我们看一下 ìndex.ts

import {
  Web3Function,
  Web3FunctionContext,
} from "@gelatonetwork/web3-functions-sdk";
// 填写你的 Web3 Function 逻辑
Web3Function.onRun(async (context: Web3FunctionContext) => {
  const { userArgs, gelatoArgs, provider } = context;
  // 返回执行调用数据
  return {
    canExec: true,
    callData: "YOUR_EXECUTION_PAYLOAD",
  };
});

我们将在 Web3Functions.onRun() 中添加我们的自定义逻辑。我们可以检查链上合约、链下数据并查询子图。一旦我们确定满足执行交易的条件,我们可以返回要传递到链上的 calldata。如果未满足条件,我们返回:

  return {
    canExec: false,
    message: "Condition not met",
  };

一个非常基本的示例是向链下询问 0 到 100 之间的随机数 API,并检查链上我们的智能合约是否处于活动状态。如果数字大于 75 且活动合约调用返回 true,我们将在合约中执行交易。

Web3Function.onRun(async (context: Web3FunctionContext) => {
  const { userArgs, gelatoArgs, provider } = context;

  let abi = [\
  "function active() view returns (bool)",\
  "function setMockString(string) external",\
]
  ];
  let contractAddress = "0x67C982310a687e43bA2A659b1117f6c5B73bB662";

  let contract = new ethers.Contract(contractAddress, abi, provider);
  let active = await contract.active();

  if (!active) {
    return { canExec: false, message: "Contract not active" };
  }

  let randomApi = `http://www.randomnumberapi.com/api/v1.0/random?min=0&max=100&count=1`;

  // 我们使用轻量级的 ky 库进行 get 请求
  let randomApiRes: any = await ky.get(randomApi).json();

  if (!randomApiRes) throw Error("Get random number api failed");
  let random = randomApiRes[0] as number;

  if (random <= 75) {
    // 我们告诉执行者不需要执行任何交易
    return { canExec: false, message: "Number <= 75" };
  } else {
    let rString = randomString(10)
    const {data} = await contract.populateTransaction.setMockString(rString);

    return { canExec: true, callData: data! };
  }
});

这是一个非常基本的示例,几乎没有触及 Web3 Function 功能的表面!

测试

Web3 Functions 模板安装了 gelatonetwork/web3-functions-sdk,它公开了我们 Web3 Function 的测试方法:

npx w3f test src/web3Functions/display-string/index.ts

部署到 IPFS

一旦 Web3 Function 经过测试并且我们的测试日志显示了我们期望的内容,我们必须使用以下命令将 Web3 Function 部署到 IPFS:

npx w3f deploy src/web3Functions/display-string/index.ts

完成到 IPFS 的部署后,我们将收到我们代码的 CID,稍后在创建任务时需要它。

创建运行 Web3 Function 的任务

因此,我们部署了我们的 Web3 Function,准备好执行了。现在我们将创建任务,该任务将查询 IPFS 上的代码,执行代码,并且——如果满足条件——执行目标合约。

在撰写此博客时,Web3 Functions 服务仍处于私测阶段,因此只有列入白名单的地址才能创建任务。请联系我们以将其列入白名单。

我们在此处创建我们的任务。

在私测期间,Gelato 会补贴测试网交易。

  1. 一旦你的地址被列入白名单,我们将前往此链接以创建任务:

  2. 我们将输入 CID、用户参数、目标智能合约所在的网络、智能合约地址和要运行的方法:

  1. 我们可以通过单击检查源代码来查看我们的 Web3 Function 的代码

  2. 我们命名我们的任务,我们就准备好了……Gelato 将为我们完成艰苦的工作!

演示应用程序

我们创建了一个演示应用程序,以帮助你快速熟悉 Web3 Functions 的开发和部署过程。

我们的演示应用程序集成了我们项目所需的三种技术:

  • 带有我们的 Web3 Functions 代码的 Web3 Functions 文件夹
  • 带有我们的合约和我们的部署脚本的 hardhat 文件夹
  • React 前端

此演示包括一个合约,允许用户在 active 变量为 true 时更改字符串变量。

它还包括一个无服务器 Web3 Function(如上所示的示例),用于检查合约上的 active 变量是否为 true,调用外部 API 以获取 0 到 100 之间的随机数,并且如果该数字大于 75,则创建一个随机字符串并执行交易以更改它。

出于演示目的和为了获得更好的开发体验,我们包含了一个基本的 react 应用程序,你可以在其中查询合约并更新 active 变量。

你可以在此处找到该仓库。请按照自述文件进行操作。

部署的应用程序可在 https://web3-functions-demo.gelato.network/ 上找到

我们可以在 Web3 Functions 应用程序中查看任务日志:

示例 在克隆的模板中,有一个 examples folder,其中包含一些 Web3 Function 的其他示例。我们希望你喜欢它,如果你有任何问题,请随时在 Discord 上与我们联系!

资源

Gelato Network

Gelato Web3 Functions 文档

Web3 Function Oracle 示例

Web3 Function Storage 示例

Web3 Function Secrets 示例

Web3 Function Event Listener 示例

关于 Gelato

Gelato 是一个 Web3 云平台,使开发人员能够创建自动化的、无 gas 的且具有链下感知能力的 Layer 2 链和智能合约。 400 多个 web3 项目多年来一直依赖 Gelato 来促进 DeFi、NFT 和游戏中的数百万笔交易。

  • Gelato RaaS: 一键部署你自己的量身定制的 ZK 或 OP L2 链,其中包含原生的帐户抽象和所有 Gelato 中间件。

  • Web3 Functions: 通过运行去中心化的云函数,将你的智能合约连接到链下数据和计算。

  • Automate: 以可靠、对开发者友好和去中心化的方式自动执行交易,从而自动化你的智能合约。

  • Relay: 通过易于使用的 API,让你的用户可以访问可靠、强大且可扩展的无 gas 交易。

  • Account Abstraction SDK: Gelato 与 Safe 合作构建了一个完整的 Account Abstraction SDK,结合了 Gelato 行业最佳的无 gas 交易能力,以及行业最安全的智能合约钱包。

订阅我们的时事通讯并打开你的 Twitter 通知,以获取有关 Gelato 生态系统的最新更新! 如果你有兴趣成为 Gelato 团队的一员并构建互联网的未来,请浏览空缺职位并在此处申请 here

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

0 条评论

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