State Sync 仅在付费计划中可用。要为您的账户启用它,请联系我们的销售团队。
网络同步模式在创建时固定,并在 Virtual Environment 的整个生命周期内保持不变。之后无论从仪表板还是 API 都无法启用、禁用或切换。要以其他模式运行,请创建一个新的 Virtual Environment。
何时激活 State Sync
此选项在以下几种场景中非常有用:- Virtual Environment 合约和交易可以访问原始链上存在的当前预言机值。
- 在测试合约和构建概念验证交易时,从 Virtual Environments 访问 Uniswap 资金池。
- 构建一个没有陈旧数据的 subgraph。
- 在与真实网络条件一一对应的情况下测试您的 dapp 和协议的行为和性能
State Sync 如何解决写入冲突
State sync 允许您在 Mainnet 上存储槽和账户余额更新时访问它们的最新值。当您在 Virtual Environment 上写入特定存储槽时,该槽的同步会停止,但对所有未修改的槽仍然处于活动状态。 以下是 state sync 的更多细节:- 初始区块号与创建时原始链的最新区块相匹配。
- 每次您通过
eth_sendTransaction或eth_sendRawTransaction向 Virtual Environment 发送交易时,都会挖掘一个区块,区块号加 1,与原始网络无关。 - 在 Virtual Environment 上写入变量之前,Virtual Environment 会跟踪来自原始网络的当前值。
- 在 Virtual Environment 上写入合约的变量后(例如
C.X=100),任何后续读取都将产生该值(100)。 - 合约的所有未修改状态变量(
C.Y)都将反映来自原始网络的值。 - 在 Virtual Environment 上挖掘新区块之前,最新的虚拟区块会与父链上的最新区块同步。
- Virtual Environment 在每次状态修改后挖掘一个区块(
sendTransaction、setBalance等)。 - Virtual Environment 上的区块号和原始网络上的区块号将以不同的速率变化。

latest 反映的是父网络的哪个状态?
在启用 State Sync 的 Virtual Environment 上,latest 的账户状态(存储、余额、nonce 和合约代码)反映父网络最近一次同步的区块,加上您自己的 Virtual Environment 交易所做的任何更改。区块是连续同步的,因此同步的状态中不存在间隙。
Virtual Environment 的区块高度并不是状态新鲜度的指标。只有当 Virtual Environment 处理状态修改时才会挖掘区块,因此其区块号独立于父链推进。即使 Virtual Environment 的头部区块远远落后于父网络,其 latest 仍然提供父网络最新同步的状态。要判断状态是否陈旧,请与已同步的父网络状态进行比较,而不是比较区块号。
同步的状态包含合约代码。在 Virtual Environment 创建之后才部署到父网络上的合约,在 Virtual Environment 上通过 eth_getCode(address, "latest") 会返回其字节码,即使 Virtual Environment 上不存在该合约的部署交易、事件日志或区块。固定到更早区块的读取(例如 eth_getCode(address, "<creation block>"))仍会返回该区块时的状态。
只有状态会被同步。父网络的交易、事件日志和区块永远不会出现在 Virtual Environment 上;请参见为什么我在 State Sync 中看不到主网交易?
为了更好地理解,让我们探究一个示例:
示例
该示例展示了以下内容:- Virtual Environment(Virtual Sepolia)访问来自原始网络(Sepolia)的最新状态。
- 在一次 Virtual Environment
write之后,被修改的变量与其 Sepolia 对应变量分离。
State Sync Example
0xd01dF6d2354c5A869265dC9a9561E3544ac53262。测试脚本将同时与 Sepolia 以及一个基于 Sepolia 的 Virtual Environment Virtual Sepolia 交互。
该脚本在计数器映射中随机取一个条目,然后:
- 在 Sepolia 上设置该值,然后在 Sepolia 和 Virtual Sepolia 上都读取值,表明可以读回相同的值。
- 在 Virtual Sepolia 上设置该值,然后在 Sepolia 和 Virtual Sepolia 上都读取值,表明读到的是不同的值。
- 再次在 Sepolia 上设置该值,然后在 Sepolia 和 Virtual Sepolia 上都读取值,表明 Sepolia 上的修改对其虚拟对应体不可见。