系统交易参考
StableSystem 预编译合约通过固定的 EVM 合约接口暴露 Stable 协议数据和事件。在 v1.8.0 中,任何客户端都可以查询保证区块空间注册表,但只有协议生成的交易才能发出系统日志。
合约
此预编译合约在主网和测试网上使用相同的地址:
0x0000000000000000000000000000000000009999
| 方法 | 选择器 | 访问 | Gas 限制 | 目的 |
|---|---|---|---|---|
blockspaceLanes() | 0x2c0ac3be | 任何人,只读 | 10,000 | 返回活跃的企业和交易类型通道注册表。 |
notifySystemTxLogs() | 0xe8e983b7 | 仅限系统交易发送方 | 50,000 | 处理最多 100 个排队的系统日志条目。 |
使用此 Solidity 接口获取 v1.8.0 ABI:
// SAFE: This interface matches the Stable v1.8.0 StableSystem ABI.
struct EnterpriseLane {
uint64 id;
string name;
uint32 weight;
}
struct TxTypeLane {
uint64 id;
string name;
address[] toAddrs;
bytes4[] methods;
uint8[] txTypes;
uint64[] nonceKeys;
address[] senders;
uint32 weight;
bool noOverflow;
}
struct BlockspaceLanes {
uint32 maxBlockspaceGasWeight;
EnterpriseLane[] enterpriseLanes;
TxTypeLane[] txTypeLanes;
}
interface IStableSystem {
event UnbondingCompleted(
address indexed delegator,
address indexed validator,
uint64 indexed originBlockHeight,
uint256 amount
);
function notifySystemTxLogs() external;
function blockspaceLanes()
external
view
returns (BlockspaceLanes memory lanes);
}blockspaceLanes()
blockspaceLanes() 返回在区块提议和验证期间使用的由治理控制的通道注册表。它是一个正常的 eth_call,而不是自定义 JSON-RPC 方法,并且不需要企业网关。
两个通道数组都按 id 升序排序。较低的 ID 具有较高的匹配优先级。
返回值
| 字段 | 类型 | 描述 |
|---|---|---|
maxBlockspaceGasWeight | uint32 | 预留给所有已配置通道的区块 Gas 限制的百分比(0 到 100)。 |
enterpriseLanes | EnterpriseLane[] | 企业通道定义。治理最多允许一个企业通道。 |
txTypeLanes | TxTypeLane[] | 其匹配规则检查交易字段的通道。 |
企业通道
任何 CustomTx 的 NonceKey 设置了第 63 位都会路由到已配置的企业通道,除了 MaxUint64。较低的 63 位选择一个独立的 Nonce 通道,而不是一个通道。
| 字段 | 类型 | 描述 |
|---|---|---|
id | uint64 | 耗尽顺序优先级和标识符。 |
name | string | 人类可读的通道名称。 |
weight | uint32 | 分配给该通道的预留区块空间池的百分比(0 到 100)。 |
交易类型通道
交易必须匹配所有已填充的匹配器字段。一个字段中的条目是替代项,空匹配器是通配符。
| 字段 | 类型 | 描述 |
|---|---|---|
id | uint64 | 通道优先级和标识符。较低的 ID 优先匹配。 |
name | string | 人类可读的通道名称。 |
toAddrs | address[] | 允许的目标地址。空则匹配任何目标。 |
methods | bytes4[] | 允许的四字节函数选择器。空则匹配任何选择器。 |
txTypes | uint8[] | 允许的交易格式。空或条目 0 匹配任何格式。 |
nonceKeys | uint64[] | 允许的 Nonce 键。空或条目 0 匹配任何键。 |
senders | address[] | 允许的发送方地址。空则匹配任何发送方。 |
weight | uint32 | 分配给该通道的预留区块空间池的百分比(0 到 100)。 |
noOverflow | bool | 当 true 时,超出此通道配额的交易不会在后续匹配通道或普通通道中重试。 |
txTypes 使用以下 TxFormat 值:
| 值 | 交易格式 | EVM 类型 |
|---|---|---|
0 | 通配符 | 任意 |
1 | 传统 | 0x00 |
2 | 访问列表 | 0x01 |
3 | 动态费用 | 0x02 |
4 | 设置代码 | 0x04 |
5 | 二维 Nonce | 0x3F |
查询注册表
使用 Foundry 的 cast 命令调用预编译合约:
cast call \
0x0000000000000000000000000000000000009999 \
"blockspaceLanes()((uint32,(uint64,string,uint32)[],(uint64,string,address[],bytes4[],uint8[],uint64[],address[],uint32,bool)[]))" \
--rpc-url https://rpc.stable.xyzv1.8.0 主网激活时,设置了一个 20% 的预留池,其中一个企业通道占该池的 50%。治理可以更改此输出。
(20, [(1, "enterprise", 50)], [])notifySystemTxLogs()
notifySystemTxLogs() 从状态中读取排队的协议日志条目,并每次调用最多处理 100 个。它不接受任何参数,也不返回任何值。
只有发送方为 0x0000000000000000000000000000000000000001 的系统交易才能调用此方法。用户或合约的调用将被回滚。
当解除绑定完成时,流程如下:
- 质押模块完成操作并记录其 SDK 事件。
x/stable模块将事件数据及其原始区块高度排队。- 下一个区块提议者创建调用
notifySystemTxLogs()的系统交易。 - 预编译合约为最多 100 个排队的条目发出 EVM 日志。
- 客户端通过
eth_getLogs、WebSocket 订阅或区块浏览器读取日志。
超出批处理限制的条目将继续排队等待下一个区块。
UnbondingCompleted 事件
| 参数 | 类型 | 索引 | 描述 |
|---|---|---|---|
delegator | address | 是 | 其委托代币完成解除绑定的地址。 |
validator | address | 是 | 从其验证者操作员地址派生出的验证者地址。 |
originBlockHeight | uint64 | 是 | SDK 层解除绑定最初完成时的区块高度。 |
amount | uint256 | 否 | 完成解除绑定的金额。 |
EVM 日志显示在包含系统交易的区块中。当需要原始 SDK 事件的高度时,请使用 originBlockHeight。
安全模型
- 协议在区块提议期间创建系统交易。
- EVM 状态转换规则为系统交易保留发送方
0x0000000000000000000000000000000000000001。 - 用户交易无法伪造发送方或成功调用
notifySystemTxLogs()。 blockspaceLanes()是公开的,并且不能更改状态。

