---
title: "如何在 Optimism 上使用 webhook"
description: "什么是 Optimism Webhook，以及如何在 Web3 中使用它们"
---

# 如何在 Optimism 上使用 webhook

如果你希望自己的 web3 应用能与第三方应用或服务通信,你会喜欢上 webhook。在本教程中,我们将学习如何在 [Optimism](https://www.alchemy.com/layer2/optimism/?a=a40402f9aa) 上设置和使用 webhook,然后演示如何为 Optimism 上 ETH 的收发设置 Slack 自动通知。

## 什么是 webhook?

[**Webhook**](https://www.alchemy.com/overviews/what-is-a-webhook) 是 web3 开发者用来让第三方应用或服务在事件发生时与应用通信的工具。相比通过 API 持续轮询节点来检查某个状态是否发生变化,这种技术效率更高,因为 webhook 可以让服务器在事件发生时主动向应用推送通知。

[Alchemy webhooks](https://www.alchemy.com/docs/reference/notify-api-quickstart) 在提升用户体验、提高 web3 应用和服务的参与度方面有很大潜力,比如在 Discord 频道中追踪 NFT 销售,或将钱包活动发送到 Slack 频道。

## 哪些 Optimism 事件可以通过 webhook 追踪?

**通过 Alchemy webhooks,我们可以接收三种类型的 Optimism 事件通知:**

1. Mined transactions - 交易完成
1. Dropped transactions - 交易失败或从 mempool 中被丢弃
1. Address Activity - 代币被接收或转移

在本教程中,我们将追踪 _Address Activity_ 事件,接收 Optimism 上 ETH 收发的 Slack 通知。

## 如何设置 Optimism webhook

以下是设置 Optimism webhook 并将通知自动发送到 Slack 的 10 个步骤。这一流程同样适用于 Zapier 支持的许多其他第三方平台,比如 Discord、Twitter 等!

### 1. 创建一个 Ethereum 钱包

我们需要一个 Ethereum 钱包来收发交易。本教程使用 **[MetaMask](https://www.alchemy.com/dapps/metamask)**,一个基于浏览器的数字资产钱包,用于管理 Ethereum 账户。[下载 MetaMask](https://metamask.io/download.html) 并创建一个免费账户。

### 2. 登录 Alchemy

为了方便操作,[注册一个免费的 Alchemy 开发者账户](https://dashboard.alchemy.com/signup),这样你就可以与 Ethereum 链通信,而无需自己运行节点。

### 3. 创建 API 密钥

接下来,创建一个新应用以生成 API 密钥,并[连接到 Optimism 测试网络](https://www.alchemy.com/docs)。

在 Alchemy Dashboard 中,将鼠标悬停在导航栏的 _Apps_ 上,点击 _Create App_,进入 _Create App_ 页面。

<ImageBlock
  src="https://media.alchemy.com/1704209670-create-api-key-alchemy.jpg"
  alt="Alchemy 控制台：创建新应用以生成 Optimism API 密钥"
  width={1600}
  height={912}
/>

为你的应用命名(我们选择了 "optimism_webhooks"),并写一段简短的描述。

接下来,为你的链选择 _Optimism_,为网络选择 _Optimism Goerli_。

然后,点击 _Create app_。

现在,点击 _Apps_ 下新创建的应用链接,再点击 _Add to Wallet_。

此时你应该已经在 Metamask 上连接到了 Optimism Goerli 测试网!

<ImageBlock
  src="https://media.alchemy.com/1704209686-alchemy-optimism-webhooks.png"
  alt="Alchemy 控制台：新建的 Optimism Goerli 应用及 Add to Wallet 按钮"
  width={1600}
  height={469}
/>

### 4. 从 Goerli faucet 获取测试网 ETH

要将智能合约部署到 Optimism 测试网络,需要[从 Goerli faucet 获取 ETH](https://www.alchemy.com/overviews/goerli-faucet)。

首先,将 MetaMask 的网络切换为 Ethereum Goerli,然后点击 _Claim_。

之后,你应该会在 Goerli 测试网的 MetaMask 账户中看到 0.05 ETH。

### 5. 将 Goerli ETH 桥接到 Optimism-Goerli 测试网

目前还没有公开的桥用于将 Goerli ETH 转移到 Optimism,但可以使用 [Cast from Foundry](https://github.com/foundry-rs/foundry/tree/master/cast)(一个用于 Ethereum 应用开发的工具包)来完成。

**使用以下代码片段:**

`cast send --legacy --rpc-url=$ALCHEMY-OPT-GOERLI-ENDPOINT --value=0.001ether --private-key= 0x636Af16bf2f682dD3109e60102b8E1A089FedAa8`

现在你已经在 Opt-Goerli 测试网上拥有了 Goerli ETH。

### 6. 创建一个 zap 和一个 Optimism webhook URL

现在,[创建你的 Zapier 账户](https://zapier.com/sign-up),如果你已经有 Zapier 账户,直接登录即可。

接下来,在 dashboard 左上角点击 _Create Zap_。

现在我们要创建 webhook URL,用于将 webhook 响应从 Alchemy 发送到 Zapier。

在 _Trigger_ 下,搜索并选择 _Webhooks by Zapier_ 作为应用事件/触发器。

对于 _Trigger Event_,选择 _Catch Hook_,因为 Zapier 会等待 Alchemy 的 address activity webhook 在每次转账发生时将事件数据发送到该 URL。

点击 _Continue_ 进入 _Set up trigger_ 部分,并复制 _Custom Webhook URL_。

<ImageBlock
  src="https://media.alchemy.com/1704209746-zap-and-optimism-webhook-url.png"
  alt="Zapier Zap 编辑器：从 Catch Hook 触发器复制自定义 webhook URL"
  width={1600}
  height={634}
/>

### 7A. 创建一个 Optimism webhook

现在,我们需要创建 address activity webhook 来追踪转账事件,并将数据发送到 Zapier 的 webhook URL。

我们将演示两种设置 webhook 的方式:第一种是在 dashboard 的 **Notify 标签页**中操作,第二种是通过 **Alchemy 的 Notify API** 以编程方式实现(推荐用于处理 10 个以上地址的 address activity webhook)。

1. 确认你在 Alchemy dashboard 左上角处于 _Ethereum + L2_ 生态系统中
1. 进入 Notify 标签页,在 *Address Activity* 部分点击 _+ Create Webhook_ 按钮
1. 将 _Chain_ 选择为 _Optimism_
1. 将 _Network_ 选择为 *Goerli*
1. 粘贴你在上一步从 Zapier 复制的 webhook URL
1. 将你的 MetaMask 钱包地址粘贴到 _Ethereum Addresses_ 部分。

注意:如果你想在确认创建前测试 Alchemy webhook 是否成功向 Zapier 的 webhook URL 发送请求,可以点击 webhook URL 旁边的 _Test Webhook_。如果你已经创建了 webhook 但想再次测试,可以点击 webhook 旁边的三个点,选择 _Send Test Notification_。

现在,返回 Zapier,进入 _Test trigger_ 部分,点击 _Test trigger_。

如果你看到 "We found a request message",恭喜你!

### 7B. 使用 notify API 创建 Optimism webhook

如果你想为多个 Optimism 地址创建 webhook,可以使用 [Notify API](https://www.alchemy.com/docs/reference/webhooks-overview)。首先,从 Notify dashboard 右上角的 _AUTH TOKEN_ 按钮处复制你的 Alchemy 身份验证令牌(X-Alchemy-Token)。

<ImageBlock
  src="https://media.alchemy.com/1704209787-alchemy-auth-token.png"
  alt="Alchemy 控制台：Notify API 的 Auth Token 复制位置"
  width={1600}
  height={152}
/>

然后,进入命令行并输入以下内容:

`*curl https://dashboard.alchemy.com/api/create-webhook \`

`*-X POST \`

`*-H "X-Alchemy-Token":"your-X-Alchemy-Token" \`

`-d '\{"network":"OPT_KOVAN","webhook_type":"ADDRESS_ACTIVITY","webhook_url":"your-Zapier-Webhook-URL", "addresses":["your-Ethereum-Address"]\}'``
`

记得使用你自己的 _your-X-Alchemy-Token_、_your-Zapier-Webhook-URL_ 和 _your-Ethereum-Address_(也就是你粘贴的钱包地址),你可以按需添加任意数量的 Ethereum 地址来追踪它们的转账事件。

刷新之后,你应该会在 Notify dashboard 中看到新创建的 address activity webhook,以及你指定的所有参数。

### 8. 在 zapier 中解析 Optimism webhook 响应

针对 Alchemy 的 webhook 响应,我们需要在 Zapier 中解析它,以创建一个动作:每当我们的 Optimism 地址成功发送交易时发出提醒。

在 _Action_ 部分,选择右侧的 _Filter_ 选项。

在 _Filter setup & testing_ 中,我们希望当 _Event Activity From Address_(你也可以直接搜索 _fromAddress_)_(Text) Exactly matches_ 我们的 Optimism 地址时(将其粘贴到最后一个文本字段中)才继续。

如果你点击 _Continue_ 后看到 "Your Zap would not have continued",不用担心!因为测试通知并非来自该钱包,出现这条消息是正常的。

<ImageBlock
  src="https://media.alchemy.com/1704209834-optimism-webhook-responses-zapier.png"
  alt="Zapier 过滤器设置：将 webhook 的 fromAddress 与 Optimism 钱包地址匹配"
  width={1600}
  height={912}
/>

### 9. 将你的 Optimism webhook 与 slack 集成

首先,让我们创建一个 Slack 账户和工作区。在 [Slack](https://slack.com/) 上创建一个账户,如果你已经有账户则直接登录。然后创建一个新的工作区。我们将其命名为 _Optimism Wallet Alerts_,你也可以发挥自己的创意!

#### 处理发送代币的提醒

接下来,我们希望在我们的钱包作为**转账事件**的发送方时发送一条消息。

1. 点击底部的 "+"
1. 在新的 _Action_ 部分中搜索并选择 _Slack_
1. 对于 _Action Event_,选择 _Send Channel Message_
1. 点击 _Continue_ 后,登录你的 Slack 账户
1. 在 _Set up action_ 部分填写用于发送消息的字段
1. 选择你想让提醒发送到的频道(我们选择的是 _Optimism-Wallet-Alerts_)。

在消息文本中,你可以自由发挥,选择想要发送的字段和值。

我们选择了以下字段:

<ImageBlock
  src="https://media.alchemy.com/1704209860-alerts-for-sending-tokens.png"
  alt="Zapier Slack 操作：为 Optimism 代币转账提醒选择的消息字段"
  width={864}
  height={133}
/>

其他部分保持默认选项即可。

点击 _continue_,然后点击 _test and continue_。

如果没有报错弹出,说明一切正常!这时你的账户应该已经收到一条 Slack 消息。现在,发布这个 Zap。

恭喜!现在,每当你的 Optimism 钱包发出一笔交易,我们的 Zap 就会发送一条详细描述该交易的消息。

你也可以在 Zapier dashboard 的 Zap History 页面查看该 Zap 的运行详情。

### 10. 发送消息以处理 Optimism 上的代币接收

我们还希望在钱包作为 Optimism 交易接收方时发送提醒。

首先,编辑 _continue only if_ 动作。

点击 _Filter Setup & Testing_,按下 "+ or" 按钮,填入 _Event Activity To Address_(你也可以直接搜索 _fromAddress_)以及 _(Text) Exactly matches_ 我们的 Optimism 地址(粘贴到最后一个文本字段中)。

很好,现在当钱包作为接收方时,我们的 Zap 也会运行!

接下来,让我们在 _Only continue if…_ 和 _Send Channel Message in Slack_ 这两个动作之间创建一个 _Code by Zapier_ 动作。

你可以选择 _Run Python_ 或 _Run Javascript_。我们将选择后者,但逻辑对 Python 同样适用。

点击 _Continue_ 后,我们将按如下方式在 _Set up action_ 中设置输入数据:

<ImageBlock
  src="https://media.alchemy.com/1704209961-run-javascript-code-zapier.png"
  alt="Code by Zapier 操作：设置 JavaScript 步骤的输入数据"
  width={1600}
  height={862}
/>

我们之所以要再次解析 webhook 响应,是因为目前的通知只针对钱包**发送** ETH 的情况编写。因此,我们需要为钱包**接收** ETH 的情况进行定制。

在代码块中,粘贴以下代码(阅读注释以了解每一行的含义):

`// Since JavaScript is case-sensitive, we will be comparing addresses in upper case const address = "Wallet-Address".toUpperCase\(\);
// Define Account 1 \(Our wallet\)
let account\_1 = "";
// Define Account 2 \(the user our wallet is sending to / receiving from\)
let account\_2 = "";
// Define to use "to" or "from" in message
let t\_or\_f = "";
let f\_or\_t = "";
if \(inputData.fromAddress.toUpperCase\(\) == address\) \{
    // If Wallet is sending, then it is the fromAddress
    account\_1 = inputData.fromAddress;
    account\_2 = inputData.toAddress;
    t\_or\_f = "from";
    f\_or\_t = "to";
\} else if \(inputData.toAddress.toUpperCase\(\) == address\) \{
    // If Wallet is receiving, then it is the toAddress
    account\_1 = inputData.toAddress;
    account\_2 = inputData.fromAddress;
    t\_or\_f = "to";
    f\_or\_t = "from";
\}`
`//` Output the fields to be used in email
`output = \[\{account\_1: account\_1, account\_2: account\_2, t\_or\_f: t\_or\_f, f\_or\_t: f\_or\_t\}\];`

同样,记得将 **Wallet-Address 替换**为你的 MetaMask 钱包地址。测试该动作时,如果没有为输出变量赋任何值,不必担心。

最后,进入 _Send Channel Message in Slack_ 动作,点击 _Set up action_ 部分。

现在,我们将用 Javascript 代码生成的更灵活的输出,替换消息文本中来自 webhook 响应的通用字段,这些输出会根据我们钱包是发送还是接收代币而有所不同:

<ImageBlock
  src="https://media.alchemy.com/1704209901-send-channel-message.png"
  alt="Slack 的 Send Channel Message 操作，点击 Set up action 部分"
  width={876}
  height={173}
/>

点击 _Continue_ 并测试该动作,然后发布!

恭喜!你已经完成了 Optimism webhook 的创建!
