> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# 上下文：Gateway、Storage、Secrets

> 通过 Node RPC 访问区块链，从 Storage 存取数据，并在 Secrets 中保存 API 密钥等敏感信息。

本指南概述了 `context` 对象，以及如何使用它在 Web3 Actions 中访问 Gateway、Storage 和 Secrets 等实用工具。

您还将了解如何通过 `context` 访问 [Node RPC](/node-rpc/overview)、如何使用 Secrets 管理和访问 API 密钥等私密数据、如何将数据持久化到 Storage，以及如何从您的应用程序中访问这些数据。

### Context

`context` 是一个对象，它可以让您在代码中访问 Storage 和 Secrets。Context 是您函数中需要指定的第一个参数，它使 Tenderly 运行您的代码时可以访问执行上下文。

```typescript title="example.ts" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
export const actionFun: ActionFn = async (context: Context, event: Event) => {
  // ...
  await context.storage.putJson(key, storedValue);
};
```

<Note>
  Storage 和 Secrets 在 Tenderly 项目中的所有 Actions 之间共享。
</Note>

#### Gateways

Gateways 实用工具（`context.gateways`）为您提供对 [Node RPC](/node-rpc/overview) 的访问，让您可以通过 Web3 Actions 发送事务或读取链上数据。

`gateways` 属性提供了一个名为 `getGateway()` 的方法，它需要一个参数 —— 您要访问的网络。例如，要访问 Mainnet，参数需要格式化为 `Network.MAINNET`。

存储在变量中的完整语句示例如下：

```jsx title="example.jsx" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
const defaultGatewayURL = context.gateways.getGateway(Network.MAINNET);
```

以下是 Node RPC 中每个受支持网络的 `getGateway()` 方法参数列表：

* `Network.MAINNET`
* `Network.GOERLI`
* `Network.SEPOLIA`
* `Network.POLYGON`
* `Network.MUMBAI`
* `Network.BOBA_ETHEREUM`

有关 `context.gateways` 工作原理的更多详情以及帮助您理解使用方法的示例代码片段，请阅读 [**Web3 Actions 上的 Node RPC 访问**](/node-rpc/overview) 文档页面。

### Storage

您可以使用 Storage 实用工具让您的 Web3 Actions 成为有状态的。Web3 Actions Storage 是一个基于键值对的存储。您可以通过自定义代码（函数）和 Tenderly Dashboard 将数据保存到 Storage。

以下代码片段展示了如何将 JSON 对象存入 Storage。

```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await context.storage.putJson(key, valueStored);
```

<Note>
  所有与 Storage 交互的函数都是异步的，因此您需要使用 `await` 运算符
  以避免意外行为。
</Note>

#### 保存和检索 Storage 中的数据

要将数据保存到 Storage，请使用以下函数，它们分别存储对应类型的值：

* `putBigInt`
* `putStr`
* `putNumber`
* `putJson`

要从 Storage 中检索数据，请使用以下函数获取特定的数据类型：

* `getBigInt`
* `getStr`
* `getNumber`
* `getJson`

以下是将 JSON 对象保存到 Storage 并从中获取的示例。

```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
await context.storage.putJson('BAR_BAZ', { bar: 'baz' });
//....
const barBaz = await context.storage.getJson('BAR_BAZ');
```

#### Storage 限制

| 限制        | 值      |
| --------- | ------ |
| 每个项目的最大键数 | 1,000  |
| 最大键大小     | 1 KB   |
| 最大值大小     | 100 KB |

如果超出限制，客户端将返回 `400 Bad Request` 错误，并在消息中指出违反的具体限制。

Storage 是项目范围的，项目中的所有 actions 共享同一个键池。

<Warning>
  Storage 不是数据库，它用于存储配置参数或计数器等小型有状态数据。对于大型数据集或高频操作，请使用外部数据库，并将凭据存储在 [**Secrets**](/monitoring/web3-actions/references/context#secrets) 中。
</Warning>

#### 通过 Tenderly Dashboard 访问 Storage

要通过 **Tenderly Dashboard** 查看保存到 Storage 的数据，从左侧菜单前往 **Actions**，并从页面菜单中点击 **Storage**。

<Frame caption="访问保存到 Storage 的 Web3 Action 数据">
  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/web3-actions/context-storage-and-secrets-1.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=aaa31ee245f276bef3671e2cee6f4c23" alt="Accessing Web3 Action data saved to Storage" width="2100" height="1112" data-path="images/web3-actions/context-storage-and-secrets-1.webp" />
</Frame>

### Secrets

Secrets 用于存储敏感信息，例如 Web3 Action 在执行期间可能调用的服务的私有 API 密钥。Secrets 以键值对的形式存储，由名称和密钥值组成。

#### 创建和存储 Secrets

创建 secrets 的唯一方式是通过 **Tenderly Dashboard**。从左侧菜单前往 **Actions**，并从页面菜单中点击 **Secrets**。

点击 **Add Secret** 按钮添加 Secret，并提供键名和值。

<Frame caption="为 Web3 Actions 创建 Secrets">
  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/web3-actions/context-storage-and-secrets-2.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=994f4277fd0079e7d69e75839adeff04" alt="Creating Secrets for Web3 Actions" width="3364" height="2262" data-path="images/web3-actions/context-storage-and-secrets-2.webp" />
</Frame>

#### 从代码内部获取 Secrets 数据

您可以使用 `context` 对象的 `get()` 方法从代码中获取 Secrets 数据。将您在 Tenderly Dashboard 中指定的确切键名作为参数传入。

```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
const fooApiKey = await context.secrets.get('FOO_API_KEY');
```
