本文介绍了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 代码的形式输入,提供了极大的灵活性。为了适应校验和地址和非校验和地址的比较,比较是不区分大小写的。
要接收涉及所选事件/函数的所有交易,不应指定交易条件。 |
条件可以使用 AND、OR、NOT 和 ()
条件可以使用 ==、<、>、>=、<= 进行比较
数字值可以用十六进制 (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 < 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(连续通知之间的最短时间):设置发送通知之间的最短等待时间。
你可以创建附加到监控器警报的 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! |
- 原文链接: docs.openzeppelin.com/de...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!