Monitor - OpenZeppelin 文档

本文介绍了OpenZeppelin Defender的Monitor模块,该模块允许用户全面了解智能合约的风险和行为。用户可以检测威胁,获取威胁和异常警报,并自动响应和解决问题。Monitor可以监控关键事件、潜在危险的交易或操作问题,并与各种通知渠道集成。

监控

监控器使你可以充分了解智能合约的风险和行为。你可以检测威胁,获取关于威胁和异常的警报,并自动响应和解决问题。

用例

  • 监控关键事件和授权功能,如所有权转移、暂停或铸造。

  • 警报潜在的危险交易或运营问题。

  • 将通知集成到 Slack、Telegram、Discord、电子邮件、PagerDuty、Opsgenie 或自定义 API。

  • 使用预构建的模板快速轻松地设置监控。

  • 与其他 Defender 模块结合使用,以监控触发器执行链上交易。

监控器

可以从头开始创建监控器,也可以从模板创建,这些模板是为常见用例设计的。模板会自动预先填充一个监控器,因此你可以轻松修改和重新调整它们。

监控器模板

监控器根据它们监控的风险类型分为五类:

  • Governance(治理)

  • Access Control(访问控制)

  • Suspicious Activity(可疑活动)

  • Financial(金融)

  • Technical(技术)

你还可以指定严重级别,你的团队可以使用该级别来分组或筛选监控器。

  • High Severity(高严重性)

  • Medium Severity(中严重性)

  • Low Severity(低严重性)

配置监控器

监控器会监视所有链上合约交易,并在交易与参数、过滤器或事件匹配时发出通知。

目前,除了 Fantom 之外,所有 网络 都支持监控器。

基本信息

  • Name(名称):分配给监控器的名称。

  • Risk Category(风险类别):监控器的风险类别,可用于过滤或分组。

  • Contracts(合约):要监控的智能合约。监控依赖于底层的 ABI,因此每个监控器可能只有一个 ABI。如果是多个智能合约,则监控器必须遵守相同的 ABI/接口。

  • Confirmation Blocks(确认区块):如果你希望仅在确信交易被接受后才收到通知,建议使用更高的确认区块级别;但如果你希望尽快收到通知,并能容忍重组,则较低的确认区块级别更好。在接受安全和最终区块标签的链中,你也可以选择它们作为确认区块级别。

匹配规则

为了触发通知,交易必须满足所有以下条件:

  • 交易必须具有与配置地址匹配的 To(至)、From(自)或 Address(地址)(来自日志)。

  • 如果指定了交易过滤器

  • 交易必须交易过滤器匹配。

  • 如果选择了 Events(事件)

  • 交易必须发出任何选定的事件,并与事件条件(如果有)匹配。

  • 如果选择了 Functions(函数)

  • 交易必须直接调用任何选定的函数(目前无法检测到合约调用),并与函数条件(如果有)匹配。

交易过滤器

交易过滤器允许缩小被监控的交易范围。这些过滤器以属性表达式或 Javascript 代码的形式输入,提供了极大的灵活性。为了适应校验和地址和非校验和地址的比较,比较是不区分大小写的。

要接收涉及所选事件/函数的所有交易,不应指定交易条件。
  • 条件可以使用 ANDORNOT()

  • 条件可以使用 ==<>>=<= 进行比较

  • 数字值可以用十六进制 (0xabc123) 或十进制 (10000000000) 表示

  • 字符串值只能通过 == 进行比较

  • 包括基本数学运算符:+-*/^

如果指定了交易过滤器条件,则交易必须满足此条件才能触发通知。

交易条件可以引用以下属性

  • to 是交易的 to 地址

  • from 是交易的 from 地址

  • gasPrice 是交易中发送的 gas 价格。在 EIP1559 交易中,它等于或低于 maxFeePerGas

  • maxFeePerGas 是交易愿意为交易支付的最高价格。仅存在于 EIP1559 交易中。

  • maxPriorityFeePerGas 是交易愿意为包含在内而支付给矿工的超过 BASE_FEE 的最高 wei 金额。仅存在于 EIP1559 交易中。

  • gasLimit 是交易中发送的 gas 限制

  • gasUsed 是交易中使用的 gas 量

  • value 是交易中发送的值

  • nonce 是特定交易的 nonce

  • status 是一个派生值,可以与 "success""failed" 进行比较

示例条件

已恢复的交易

status == "failed"

排除来自 0xd5180d374b6d1961ba24d0a4dbf26d696fda4cad 的交易

from != "0xd5180d374b6d1961ba24d0a4dbf26d696fda4cad"

同时具有高于 50 gwei 的 gasPrice 高于 20000 的 gasUsed 的交易

gasPrice > 50000000000 and gasUsed > 20000

自定义过滤器

自定义过滤器支持用于过滤交易的自定义代码。如果指定了自定义过滤器,将使用给定区块的匹配列表调用它。这允许监控器使用其他数据源和自定义逻辑来评估交易是否匹配。

只有满足其他条件(事件、函数、交易)的交易才会调用自定义过滤器。
每次调用最多可以包含 25 个交易。
请求模式

请求正文将包含以下结构。来自 defender-sdk-action-client 包的 MonitorConditionRequest 类型可用于 Typescript 中的自定义过滤器。

{
  "events": [\
  {\
    "hash": "0xab..123",                          // 交易哈希
    "timestamp": "1699857792",                    // 交易的时间戳(区块)
    "blockNumber": 18561272,                      // 交易的区块号
    "blockHash": "0xab..123",                     // 看到此交易的区块哈希
    "transaction": {                              // eth_getTransactionReceipt 响应正文
      ...                                         // 参见 https://eips.ethereum.org/EIPS/eip-1474
      "cumulativeGasUsed": "0xc3614",\
      "effectiveGasPrice": "0x6e214d78",\
      "gasUsed": "0x6075",\
      "logs": [\
        { ... }\
      ],\
      "logsBloom": "0x4..0",\
      "status": "0x1",\
      "from": "0xab..123",\
      "to": "0xab..123",\
      "transactionHash": "0xab..123",\
      "transactionIndex": "0x9",\
      "type": "0x2"\
    },\
    "matchReasons": [                             // 监控器触发的原因
      {\
        "type": "event",                          // event, function, or transaction(事件、函数或交易)
        "address": "0x123..abc",                  // 发出事件合约的地址
        "signature": "...",                       // 事件/函数的签名
        "condition": "value > 5",                 // 条件表达式(如果有)
        "args": ["5"],                            // 按索引的参数(未命名的存在)
        "params": { "value": "5" }                // 按名称的参数(未命名的不存在)
      }\
    ],\
    "matchedAddresses": ["0xabc..123"],           // 你正在监控的此交易中的地址
    "matchedChecksumAddresses": ["0xAbC..123"],   // 你正在监控的此交易中的校验和地址
    "monitor": {\
      "id": "44a7d5...31df5",                     // 监控器的内部 ID
      "name": "Monitor Name",                     // 监控器的名称
      "abi": [...],                               // 地址的 abi(或未定义)
      "addresses": ["0x000..000"],                // 监控器正在监视的地址
      "confirmBlocks": 0,                         // 监控器等待的区块数(在 PoS 客户端上可以是 'safe' 或 'finalized')
      "network": "rinkeby"                        // 地址的网络
      "chainId": 4                                // 网络的链 ID
    },\
    "metadata": "..."                             // 元数据(如果可用)
  }\
  ]
}
响应模式

自定义过滤器必须返回包含所有匹配项的结构。返回空对象表示未发生匹配。此对象的类型为 MonitorConditionResponse

错误将被视为不匹配。
{
  "matches": [\
    {\
      "hash": "0xabc...123",   // 交易哈希
      "metadata": {\
        "foo": true            // 要与通知共享的任何对象
      }\
    },\
    {\
      "hash": "0xabc...123"    // 没有指定元数据的示例
    }\
  ]
}
示例自定义过滤器
exports.handler = async function(payload) {
  const conditionRequest = payload.request.body;
  const matches = [];
  const events = conditionRequest.events;
  for(const evt of events) {

    // 在此处添加用于匹配的自定义逻辑

    // 元数据可以是任何 JSON 可序列化的对象(或未定义)
    matches.push({
       hash: evt.hash,
       metadata: {
        "id": "customId",
        "timestamp": new Date().getTime(),
        "numberVal": 5,
        "nested": { "example": { "here": true } }
       }
    });
  }
  return { matches }
}

事件和函数

可以选择事件和函数作为过滤器。选择多个事件的行为类似于 OR 子句(为任何选定的事件触发)。函数也是如此。

事件或函数的条件可以进一步缩小监控范围。这些条件可以通过名称(如果参数已命名)或索引(例如,$0,$1…​)引用签名中的参数。变量必须与接口中显示的类型匹配。如果留空,条件将被忽略。

如果未指定任何事件或函数,则与合约之间或来自合约的所有交易都将在范围内。
监控器无缝支持智能合约在所有网络上发出的事件的通知,无论它们是直接触发的还是通过第三方合约的内部调用触发的。但是,目前跟踪和提供合约内内部函数调用通知的功能仅限于以太坊主网。
示例条件

发出具有介于 1 和 100 ETH 之间的值的 Transfer(…​) 事件的交易(以十六进制表示)

// Event Signature: Transfer(address to, address from, uint256 value)
value > 0xde0b6b3a7640000 and value &lt; 0x56bc75e2d63100000

发出具有第一个元素等于 5 的数组的 ValsEvent(…​) 事件的交易

// Event Signature: ValsEvent(uint256[3] vals)
vals[0] == 5

调用具有未命名字符串 "hello" 的 greet(…​) 函数的交易

// Function Signature: greet(address, string)
$1 == "hello"

警报

监控器可以使用任何支持的通知通道进行警报。也可以连接一个应该与监控器一起运行的 Action(操作)或 Workflow(工作流)。

为了防止来自单个监控器的重复警报并控制通知速率,你可以使用 Alert Threshold(警报阈值)和 Minimum time between consecutive notifications(连续通知之间的最短时间)字段。

  • Alert Threshold(警报阈值):定义在发送通知或触发操作之前,监控器必须在每个时间单位内触发的次数。时间单位由 Minimum time between consecutive notifications(连续通知之间的最短时间)字段定义。

  • Minimum time between consecutive notifications(连续通知之间的最短时间):设置发送通知之间的最短等待时间。

配置 Defender 监控器警报

通知

你可以创建附加到监控器警报的 Notifications(通知),以便通过多个渠道接收关于链上事件的通知,有关如何在 此部分 中创建和配置它们的更多信息。

自定义通知

你还可以使用通知渠道选择器下方的 Customize notification(自定义通知)复选框来修改消息正文内容和格式。

模板
**Monitor Name**(监控器名称)

{{ monitor.name }}

**Network**(网络)

{{ monitor.network }}

**Block Hash**(区块哈希)

{{ blockHash }}

**Transaction Hash**(交易哈希)

{{ transaction.transactionHash }}

**Transaction Link**(交易链接)

[Block Explorer]({{ transaction.link }})

{{ matchReasonsFormatted }}

**value**(值)

{{ value }}
预览
**Monitor Name**(监控器名称)

Monitor(监控器)

**Network**(网络)

rinkeby

**Block Hash**(区块哈希)

0x22407d00e953e5f8dabea57673b9109dad31acfc15d07126b9dc22c33521af52

**Transaction Hash**(交易哈希)

0x1dc91b98249fa9f2c5c37486a2427a3a7825be240c1c84961dfb3063d9c04d50

https://rinkeby.etherscan.io/tx/0x1dc91b98249fa9f2c5c37486a2427a3a7825be240c1c84961dfb3063d9c04d50[Block Explorer](区块浏览器)

**Match Reason 1**(匹配原因 1)

**Type**(类型):_Function_(函数)

**Matched Address**(匹配地址)::_ 0x1bb1b73c4f0bda4f67dca266ce6ef42f520fbb98

**Signature**(签名):_ greet(name)

**Condition**(条件):_ name == 'test'

**Params**(参数):_

name: test

**Match Reason 2**(匹配原因 2)

**Type**(类型):_Transaction_(交易)

**Condition**(条件):_ gasPrice > 10

**Value**(值)

0x16345785D8A0000
消息语法

自定义通知支持一组有限的 Markdown 语法:

  • Bold(粗体)(**this text is bold**)

  • Italic(斜体)(*this text* 和 _this text_ are italic)

  • Links(链接)(this is a [link](https://example.com))

部分支持其他 Markdown 语法,但渲染行为因平台而异。电子邮件支持完整的 HTML,并具有最丰富的功能集,但其他消息传递平台存在限制,包括对标准 Markdown 功能(如标题、块引用和表格)的支持。支持功能的组合(例如,粗体和斜体文本)也具有混合支持。如果 Markdown 包含任何具有混合平台支持的语法,则会在编辑器正下方显示警告消息。

监控器事件模式

使用自定义通知模板时,你可以访问以下模式。如果你配置监控器来执行操作,此模式也会传递给操作。

{
  "transaction": {                     // eth_getTransactionReceipt 响应正文
    ...                                // 参见 https://eips.ethereum.org/EIPS/eip-1474
    "cumulativeGasUsed": "0xc3614",
    "effectiveGasPrice": "0x6e214d78",
    "gasUsed": "0x6075",
    "logs": [\
      { ... }\
    ],
    "logsBloom": "0x4..0",
    "status": "0x1",
    "from": "0xab..123",
    "to": "0xab..123",
    "transactionHash": "0xab..123",
    "transactionIndex": "0x9",
    "type": "0x2"
  },
  "blockHash": "0xab..123",            // 看到此交易的区块哈希
  "matchReasons": [                    // 监控器触发的原因
    {\
      "type": "event",                 // event, function, or transaction(事件、函数或交易)
      "address": "0x123..abc",         // 发出事件合约的地址
      "signature": "...",              // 事件/函数的签名
      "condition": "value > 5",        // 条件表达式(如果有)
      "args": ["5"],                   // 按索引的参数(未命名的存在)
      "params": { "value": "5" }       // 按名称的参数(未命名的不存在)
    }\
  ],
  "matchedAddresses":["0x000..000"]    // 监控的此交易中的地址
  "monitor": {
    "id": "44a7d5...31df5",            // 监控器的内部 ID
    "name": "Monitor Name",           // 监控器的名称
    "abi": [...],                      // 地址的 abi(或未定义)
    "addresses": ["0x000..000"],       // 监控的地址
    "confirmBlocks": 0,                // 监控器等待的区块数(在 PoS 客户端上可以是 'safe' 或 'finalized')
    "network": "rinkeby"               // 地址的网络
    "chainId": 4                       // 网络的链 ID
  },
  "value": "0x16345785D8A0000"         // 交易的值
  "metadata": {...}                // 由操作条件注入的元数据(如果适用)
}
动态内容

自定义通知模板使用内联模板渲染动态内容。任何由双花括号包围的字符串都将针对事件模式进行解析。可以使用点表示法访问深度嵌套的项目(包括数组中的项目)。

除了标准事件模式之外,还注入了以下参数以用于自定义通知消息:

  • transaction.link

  • matchReasonsFormatted

字符限制

如果消息超过平台的字符限制,则会被截断。最佳实践是将消息限制为 1900 个字符。

设置

在设置选项卡中,你可以指定与不同严重性级别(高、中或低)关联的默认通知渠道。

监控器设置

暂停和删除

在监控器页面中,你可以暂停已创建的活动监控器。通过单击卡片上的虚线按钮,你可以删除监控器或将其另存为模板。

将监控器另存为模板会存储其配置和参数,可以通过单击模板库选项卡找到这些配置和参数。

我们提供了一个快速入门教程,以使用 Defender 监控智能合约。请在此处查看 here!

← Relayers

Actions →

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

0 条评论

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