系统交易
Stable 使用系统交易将 SDK 模块事件转换为标准 EVM 日志。应用程序可以通过 eth_getLogs 或现有 WebSocket 订阅来消费这些日志。
例如,在质押模块完成解除质押操作后,系统交易会发出 UnbondingCompleted 事件。该事件包含委托人、验证人、原始完成高度和金额。
应用程序接收的内容
考虑跟踪用户代币何时完成解除质押。如果没有系统交易,dApp 将需要:
- 运行一个单独的索引器,监听 SDK 事件并将其存储在自己的数据库中。这会增加操作开销并引入新的故障点。
- 定期轮询 REST 端点。延迟 5-10 秒,增加 RPC 负载,需要维护两个客户端堆栈(web3 + REST)。
系统交易通过 dApp 已经用于 EVM 日志的相同 WebSocket 连接,提供实时事件通知。无需单独的索引器。无需 REST 轮询。
工作流程
1. 协议事件: SDK 层操作完成(例如质押解除质押)。
2. 检测: x/stable EndBlocker 检测到该事件并将其排队。
3. 系统交易: 在下一个区块的 PrepareProposal 中,协议生成一个
调用 StableSystem.notifySystemTxLogs() 的系统交易。
4. EVM 发送: 预编译处理排队条目并发送标准
EVM 事件。dApp 通过 eth_getLogs 和订阅查看它们。系统交易由验证人在区块提案期间创建,而不是由用户创建。它在区块的前面,在任何用户交易之前。
StableSystem 预编译
事件通过 0x0000000000000000000000000000000000009999 的 StableSystem 预编译流动。目前它发出 UnbondingCompleted,其中包含委托人、验证人、原始完成高度和金额。
同一个预编译暴露了公共的 blockspaceLanes() 视图方法。它返回活动的 Enterprise 和交易类型通道注册表,用于链下交易分类。
安全模型
两个属性确保事件流值得信赖:
- 仅限协议发送方。 系统交易使用
0x0000000000000000000000000000000000000001作为其发送方。EVM 状态转换规则为协议生成的交易保留此地址。用户不能伪造事件或从自己的交易中调用notifySystemTxLogs()。 - 确定性发送。 每个诚实的验证人都会为相同的协议事件生成相同的系统交易。除了标准共识之外,没有额外的信任假设。
批处理
为了限制区块大小,每次调用最多处理 100 个排队的系统日志条目。如果爆发超出限制,剩余的条目将继续排队等待后续区块。
排队的事件通常会出现在下一个区块中。此传递延迟与网络配置的质押解除质押期是分开的。
在哪里找到 ABI
StableSystem 接口、区块空间返回类型、事件签名和授权规则可在系统交易参考中找到。

