Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

系统交易参考

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 具有较高的匹配优先级。

返回值

字段类型描述
maxBlockspaceGasWeightuint32预留给所有已配置通道的区块 Gas 限制的百分比(0 到 100)。
enterpriseLanesEnterpriseLane[]企业通道定义。治理最多允许一个企业通道。
txTypeLanesTxTypeLane[]其匹配规则检查交易字段的通道。

企业通道

任何 CustomTxNonceKey 设置了第 63 位都会路由到已配置的企业通道,除了 MaxUint64。较低的 63 位选择一个独立的 Nonce 通道,而不是一个通道。

字段类型描述
iduint64耗尽顺序优先级和标识符。
namestring人类可读的通道名称。
weightuint32分配给该通道的预留区块空间池的百分比(0 到 100)。

交易类型通道

交易必须匹配所有已填充的匹配器字段。一个字段中的条目是替代项,空匹配器是通配符。

字段类型描述
iduint64通道优先级和标识符。较低的 ID 优先匹配。
namestring人类可读的通道名称。
toAddrsaddress[]允许的目标地址。空则匹配任何目标。
methodsbytes4[]允许的四字节函数选择器。空则匹配任何选择器。
txTypesuint8[]允许的交易格式。空或条目 0 匹配任何格式。
nonceKeysuint64[]允许的 Nonce 键。空或条目 0 匹配任何键。
sendersaddress[]允许的发送方地址。空则匹配任何发送方。
weightuint32分配给该通道的预留区块空间池的百分比(0 到 100)。
noOverflowbooltrue 时,超出此通道配额的交易不会在后续匹配通道或普通通道中重试。

txTypes 使用以下 TxFormat 值:

交易格式EVM 类型
0通配符任意
1传统0x00
2访问列表0x01
3动态费用0x02
4设置代码0x04
5二维 Nonce0x3F

查询注册表

使用 Foundry 的 cast 命令调用预编译合约:

cast call \
  0x0000000000000000000000000000000000009999 \
  "blockspaceLanes()((uint32,(uint64,string,uint32)[],(uint64,string,address[],bytes4[],uint8[],uint64[],address[],uint32,bool)[]))" \
  --rpc-url https://rpc.stable.xyz

v1.8.0 主网激活时,设置了一个 20% 的预留池,其中一个企业通道占该池的 50%。治理可以更改此输出。

(20, [(1, "enterprise", 50)], [])

notifySystemTxLogs()

notifySystemTxLogs() 从状态中读取排队的协议日志条目,并每次调用最多处理 100 个。它不接受任何参数,也不返回任何值。

只有发送方为 0x0000000000000000000000000000000000000001 的系统交易才能调用此方法。用户或合约的调用将被回滚。

当解除绑定完成时,流程如下:

  1. 质押模块完成操作并记录其 SDK 事件。
  2. x/stable 模块将事件数据及其原始区块高度排队。
  3. 下一个区块提议者创建调用 notifySystemTxLogs() 的系统交易。
  4. 预编译合约为最多 100 个排队的条目发出 EVM 日志。
  5. 客户端通过 eth_getLogs、WebSocket 订阅或区块浏览器读取日志。

超出批处理限制的条目将继续排队等待下一个区块。

UnbondingCompleted 事件

参数类型索引描述
delegatoraddress其委托代币完成解除绑定的地址。
validatoraddress从其验证者操作员地址派生出的验证者地址。
originBlockHeightuint64SDK 层解除绑定最初完成时的区块高度。
amountuint256完成解除绑定的金额。

EVM 日志显示在包含系统交易的区块中。当需要原始 SDK 事件的高度时,请使用 originBlockHeight

安全模型

  • 协议在区块提议期间创建系统交易。
  • EVM 状态转换规则为系统交易保留发送方 0x0000000000000000000000000000000000000001
  • 用户交易无法伪造发送方或成功调用 notifySystemTxLogs()
  • blockspaceLanes() 是公开的,并且不能更改状态。

接下来去哪里