- 允许将更多不需要 PCI 资源的 txs 打包到区块中
- 管理总索引大小和快照大小
- 总加载字节被跟踪为 Bank::loaded_bytes:u64
- 每个帐户在使用时都用当前运行总数 account::load_counter:u64 进行标记
- 加载帐户时,如果 Bank::loaded_bytes - Account::load_counter > CACHE_SIZE,则帐户被认为是冷帐户,其大小是根据每个区块的 LOAD_LIMIT 计算
- 新帐户 load_counter 为 0,因此所有新帐户都是冷帐户
- Leader 的调度程序将 LOAD_LIMIT 作为一个水印,类似于写锁 CU 限制。
- 在分配期间,每个帐户每字节绑定 X 个 lamports。
- 如果 X < 当前经济底价,则将账户保留在内存中,该账户将被压缩
- 压缩是一个多步骤的过程,运行在一个 epoch 上
- 帐户数据被替换为哈希值(data)
- 帐户密钥仍处于状态之中
- 引用压缩帐户的交易失败
- 解压需要上传类似于加载程序的数据
- 解压的成本应该与分配一个新帐户的成本相同
- Binary Trie 作为快照的一部分被跟踪
- 想要获得额外 sol 的验证者可以创建一个交易,从状态中删除压缩的帐户 kv 对,并将它们添加到 Binary Trie 中
- 用户可以在解压过程中将 kv 从 Trie 中移除,从而在不被允许的情况下反向执行此操作(这可能需要在解压时进行原子操作,以便在后台服务压缩帐户时更容易)。
- 对于验证器,无论它包含多少 kv 对,Trie 根的大小都是恒定的
- 使用 zkp,每个 tx 可以压缩约 30 个帐户
- 假设每个区块只有一个,那么压缩 5 亿个账户需要大约 80 天的时间
- 生成新的 PKI
- 帐户地址是哈希(最近的 PoH 哈希,PKI::public_key)