插件 - OpenZeppelin 文档

本文档介绍了OpenZeppelin Relayer插件,它允许Relayer操作者通过TypeScript函数扩展Relayer的功能。文档详细说明了如何编写、配置、调用和调试插件,并提供了一个完整的示例,包括插件代码、调用方式和响应结果,方便开发者理解。

插件

概述

OpenZeppelin Relayer 支持插件来扩展 relayer 的功能。

插件是运行在 Relayer 服务器中的 TypeScript 函数,可以包含 Relayer 运营者定义的任何自定义逻辑。

它还包括一个简单的 Plugin 库来与 Relayer 交互,允许发送交易,并且 可以扩展以支持未来的新功能。

配置

编写插件

插件在 plugins 目录下声明,并且应该是 TypeScript 文件(.ts 扩展名)。

openzeppelin-relayer/
├── plugins/
│   └── my-plugin.ts    # 插件代码
└── config/
    └── config.json     # 配置文件中的插件

插件代码必须包含以下结构:

/// 必须的导入。
import { runPlugin, Plugin } from "./lib/plugin";

/// 在这里你可以定义自定义参数,当插件被调用时,这些参数将作为请求的一部分被包含进来。
type MyCustomParams = {
  foo: string,
  bar: number
}

/// 插件函数体。
async function myPlugin(api: Plugin, params: MyCustomParams) {
    // 你可以使用 `params` 来访问传递给插件的自定义参数。
    console.log(params.foo);
    console.log(params.bar);

    // Api 用法来发送交易:
    let relayer = api.relayer('my-relayer');
    const tx = await relayer.sendTransaction({
        to: "0x1234567890123456789012345678901234567890",
        value: ethers.parseEther("1"),
    });
}

/// `runPlugin` 是插件的入口点。
runPlugin(myPlugin);

在配置文件中声明

插件在 ./config/config.json 文件中的 plugins 键下配置。

该文件包含一个插件列表,每个插件都有一个 id 和路径。

插件路径是相对于 /plugins 目录的

例子:

"plugins": [\
  {\
    "id": "my-plugin",\
    "path": "my-plugin.ts"\
  }\
]

调用

插件通过访问 api/v1/plugins/{plugin-id}/call 端点来调用。

该端点接受一个带有以下主体的 POST 请求:

{
  "params": {
    "foo": "bar",
    "bar": 1
  }
}

然后插件将被调用,并将 params 作为插件函数的第二个参数传递。

调试

当调用插件时,响应将包括:

  • logs: 插件执行的日志。

  • return_value: 插件执行的返回值。

  • error: 如果插件执行失败,则会显示错误消息。

  • traces: 插件和 Relayer 实例之间发送的消息列表。这包括通过 api 对象传递的所有 payload。

例子

  1. 示例插件代码:
import { runPlugin, Plugin } from "./lib/plugin";
import { ethers } from "ethers";

type MyCustomParams = {
  foo: string,
}

async function myPlugin(api: Plugin, params: MyCustomParams) {
    console.log("Hello, world!");

    // 例如,要发送一笔交易:
    let relayer = api.relayer('my-relayer');
    const tx = await relayer.sendTransaction({
        to: "0x1234567890123456789012345678901234567890",
        value: ethers.parseEther("1"),
    });

    console.log("Foo ", params.foo);

    return `Successfully sent transaction with id: ${tx.id}`;
}

runPlugin(myPlugin);
  1. 示例调用:
curl -X POST http://localhost:3000/api/v1/plugins/my-plugin/call \
-H "Content-Type: application/json" \
-d '{"params": {"foo": "bar"}}'
  1. 示例响应:
{
  "success": true,
  "message": "Plugin called successfully",
  "logs": [\
    {\
      "level": "log",\
      "message": "Hello, world!"\
    },\
    {\
      "level": "log",\
      "message": "Foo bar"\
    }\
  ],
  "return_value": "Successfully sent transaction with id: 1234567890",
  "error": "",
  "traces": [\
    {\
      "relayer_id": "my-relayer",\
      "method": "sendTransaction",\
      "payload": {\
        "to": "0x1234567890123456789012345678901234567890",\
        "value": "1000000000000000000"\
      }\
    }\
  ]
}

其中: - logs 指示插件的终端日志(console.log, console.error 等)。 - traces 是插件和 Relayer 实例之间发送的消息。 - 如果插件失败,error 将包含错误消息。 - return_value 将包含插件执行的返回值。

← Solana 集成

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

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。