> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 规则变更

> 交易规则、风险参数与协议行为如何变更：通知期、生效区块高度，以及为什么已过去区块的规则永远无法被改写。

会影响到运行中网络的变更有三类：**参数变更**（风险限额、费率表、资金费率上限）、**行为变更**（执行本身怎么工作），以及**市场变更**（[上市与退市](/zh/programs/listings)）。

三者的公告方式不同，但有一个共同性质，而这个性质才是关键：变更在链上历史的**某个具体位置**生效，这个位置之前的历史不受影响。

<h2 id="parameter-changes">
  参数变更
</h2>

风险参数、杠杆档位、资金费率上限、持仓限额和费率表都是链上配置。改动其中任何一项，都是一笔在区块中执行的协议交易，排在[区块优先级](/zh/trading/tx-sequencing)的最前面。

取值本身就是链上状态，所以变更是看得见的，不需要谁来通报。某个市场的维持保证金变了，用不着别人告诉你——现在是多少，你读得到；过去任一区块是多少，你也读得到。

配置键还带**版本**。如果变的是取值的结构而不是数字，新结构写在一个新键下面，旧键照样可读。实时解析配置的客户端跨过这次变更也能继续工作；把键路径写死的客户端会当场发现问题，不会悄悄读到过时的东西。见[状态模型](/zh/protocol/architecture/state/model)。

<h2 id="behavioral-changes">
  行为变更
</h2>

改执行的*行为*，比改一个数字难，因为每个验证者都得在完全相同的时刻改。在不同节点上、不同时间生效的变更不叫灰度发布——那叫分叉。

Intention 用**链上开关**（gate）来办这件事。每个开关就是一个状态键，里面存着一个区块高度：新行为从这个高度开始生效。

<div className="dg" data-dg="gated-change">
  <div className="dg-c" style={{aspectRatio:"720 / 250"}}>
    <svg className="dg-w" viewBox="0 0 720 250" aria-hidden="true">
      <path className="dg-wire" d="M 163.00 43.00 L 176.60 43.00" />

      <path className="dg-head" d="M 183.00 43.00 L 176.60 47.40 L 176.60 38.60 Z" />

      <path className="dg-wire" d="M 350.00 43.00 L 363.60 43.00" />

      <path className="dg-head" d="M 370.00 43.00 L 363.60 47.40 L 363.60 38.60 Z" />

      <path className="dg-wire" d="M 537.00 43.00 L 550.60 43.00" />

      <path className="dg-head" d="M 557.00 43.00 L 550.60 47.40 L 550.60 38.60 Z" />
    </svg>

    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"0.0000%",width:"22.0833%",height:"34.4000%"}}><span className="dg-t">新行为静默发布</span><span className="dg-s">已在二进制里，但未启用</span></div>
    <div className="dg-b dg--blue" style={{left:"25.9722%",top:"0.0000%",width:"22.0833%",height:"34.4000%"}}><span className="dg-t">写入一个开关</span><span className="dg-s">一个状态键，存着未来的区块高度</span></div>
    <div className="dg-b dg--blue" style={{left:"51.9444%",top:"0.0000%",width:"22.0833%",height:"34.4000%"}}><span className="dg-t">所有验证者读到同一个高度</span></div>
    <div className="dg-b dg--green" style={{left:"77.9167%",top:"0.0000%",width:"22.0833%",height:"34.4000%"}}><span className="dg-t">行为在该区块精确切换</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"49.6000%",width:"31.8519%",height:"46.4000%"}}><span className="dg-t">那个高度必须在未来</span><span className="dg-s">开关不能设成一个已经过去的高度。仅凭这一条，变更就是同时的。</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"34.0741%",top:"49.6000%",width:"31.8519%",height:"46.4000%"}}><span className="dg-t">开关不存在，就是未启用</span><span className="dg-s">重放历史的节点在那些高度上读不到这个键，走的正是旧路径；重放的正确性是白得的，不用维护一张兼容性矩阵。</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"68.1481%",top:"49.6000%",width:"31.8519%",height:"46.4000%"}}><span className="dg-t">只在正被执行的那个版本上读</span><span className="dg-s">绝不读缓存。重放旧区块时去读当前值，等于拿今天的规则套昨天的历史。</span></div>
  </div>
</div>

由此得出三个性质，每一个都是承重的：

**写入时那个高度必须在未来**。开关不能设成一个已经过去的高度。仅凭这一条，变更就是同时的——每个验证者走到那个区块时，看到的都是同一个已经存在的键。

**开关不存在，就是未启用**。重放历史的节点在那些高度上读不到这个键，走的正是旧代码路径。历史重放的正确性是白得的，不用谁去维护一张兼容性矩阵。

**开关只在正被执行的那个版本上读，绝不读缓存**。重放旧区块时去读当前值，等于拿今天的规则套昨天的历史，算出来的状态根会不一样。所以取值一律从正在执行的那个区块的执行视图里读。

同一套机制也支持逐步启用：先把标志以未启用状态放进去，拿真实流量验一遍，再到预定高度打开——不必整体上线，一次性做二进制升级。

<h2 id="notice-periods">
  通知期
</h2>

通知给多长，与这项变更能对你手上已有的仓位做什么成正比。

| 变更类型                             | 通知              |
| -------------------------------- | --------------- |
| **影响已开仓位**——保证金要求、杠杆档位、资金费率上限、退市 | 在生效日期之前公告，并写明日期 |
| **影响集成**——API 接口、消息结构、键布局        | 提前公告，并给出迁移路径    |
| **仅影响成本**——费率表、返佣档位              | 在生效日期之前公告       |
| **修正一项正在发生的风险**——为应对市场状况而收紧的参数   | 可能立即生效          |

最后一行是真实的例外，不是漏洞。一项要等一周才能收紧的持仓限额，恰恰在最需要它的那一周里毫无作用。真用到这一条时，变更内容和原因会一并公布。

<Warning>
  保证金要求或杠杆档位一变，你手上仓位的强平价格就跟着变。它不会替你平掉任何东西，也不会单独通知你。带着仓位跨过一次已公告的风险参数变更，请按新的取值重新算一遍你离强平还有多远，别再用开仓时那一套。见[杠杆](/zh/trading/leverage)。
</Warning>

<h2 id="what-cannot-change">
  不能改变的东西
</h2>

已经提交的区块所适用的规则。

每一次规则变更，生效高度在记录的当时都还是未来，所以重放旧区块，套用的一定是当时生效的规则。某条规则在过去某个版本上是否生效，这个问题只有一个答案，今天问和一年后问，答案一样。

这比一条公开的政策更硬。不是协议*不会*改写历史——是这套机制根本没法表示一条“从过去开始生效”的规则。见[状态模型](/zh/protocol/architecture/state/model)。

<h2 id="announcements">
  公告
</h2>

<Note>
  本页的通知承诺，从 **2026 年 9 月 20 日**公开测试网上线起生效。[私有测试网](/zh/protocol/architecture/network-status)改参数、改行为都不发通知——它存在的目的就是调这些。
</Note>

通知期开始之后，每一次变更都会记进[协议变更日志](/zh/protocol/roadmap/changelog)，注明生效日期；上表要求提前公告的，还会在那个日期之前公告。

条目的日期以**变更在网络上生效的时间**为准，而不是公告时间。

<h2 id="where-to-go-next">
  后续阅读
</h2>

<CardGroup cols={2}>
  <Card title="协议变更日志" href="/zh/protocol/roadmap/changelog">
    已发布内容的带日期记录。
  </Card>

  <Card title="上市与退市" href="/zh/programs/listings">
    市场变更及其通知期。
  </Card>

  <Card title="状态模型" href="/zh/protocol/architecture/state/model">
    为什么配置键要带版本、要实时解析。
  </Card>

  <Card title="杠杆" href="/zh/trading/leverage">
    风险参数变更对已开仓位意味着什么。
  </Card>
</CardGroup>
