本文介绍了Gelato的Web3 Functions,它允许开发者在去中心化环境中运行serverless函数,从而扩展智能合约的功能。通过Typescript编写,存储在IPFS上,并由Gelato执行,这些函数可以与链上和链下数据交互,并自动执行交易。文中详细说明了如何编写、测试和部署Web3 Functions,并创建相应的任务。
使用链下计算能力来增强你的 web3 智能合约!
我们将智能合约称为“智能”合约,因为它们确切地知道如何执行我们要求它们执行的任务。拥有按预期执行的不可变代码是一个很好的起点,但问题是它们不知道何时执行——而时机在处理金融系统时往往至关重要。
自成立以来,Gelato 一直为 web3 用户提供基于链上条件执行任务的能力。这已经非常强大了;使开发人员能够自动化和中继交易。现在,Gelato 更进一步,为 web3 用户提供在去中心化环境中运行无服务器函数的能力**。这些函数可以在链上和链下进行通信,运行任何自定义逻辑,并在链上发送交易。
查看这篇博文 以了解有关 Web3 Functions 的更多信息!
去中心化的无服务器函数
你可以将 web3 Functions 视为去中心化的云函数,其工作方式类似于 AWS Lambda 或 Google Cloud Functions——但适用于 web3。它们使开发人员能够基于任意链下数据(例如 API、子图等)和计算来执行链上交易。这些函数用 Typescript 编写,存储在 IPFS 上,并由 Gelato 运行。 如需进一步阅读,你可以查看文档。
创建 Web3 Functions
为了实现我们创建无服务器、去中心化的 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 创建任务时才需要
我们现在可以开始用 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
一旦 Web3 Function 经过测试并且我们的测试日志显示了我们期望的内容,我们必须使用以下命令将 Web3 Function 部署到 IPFS:
npx w3f deploy src/web3Functions/display-string/index.ts
完成到 IPFS 的部署后,我们将收到我们代码的 CID,稍后在创建任务时需要它。
因此,我们部署了我们的 Web3 Function,准备好执行了。现在我们将创建任务,该任务将查询 IPFS 上的代码,执行代码,并且——如果满足条件——执行目标合约。
在撰写此博客时,Web3 Functions 服务仍处于私测阶段,因此只有列入白名单的地址才能创建任务。请联系我们以将其列入白名单。
我们在此处创建我们的任务。
在私测期间,Gelato 会补贴测试网交易。
一旦你的地址被列入白名单,我们将前往此链接以创建任务:
我们将输入 CID、用户参数、目标智能合约所在的网络、智能合约地址和要运行的方法:
我们可以通过单击检查源代码来查看我们的 Web3 Function 的代码
我们命名我们的任务,我们就准备好了……Gelato 将为我们完成艰苦的工作!
我们创建了一个演示应用程序,以帮助你快速熟悉 Web3 Functions 的开发和部署过程。
我们的演示应用程序集成了我们项目所需的三种技术:
此演示包括一个合约,允许用户在 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 上与我们联系!
Web3 Function Event Listener 示例
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!