更新时间:2025-06-20 15:00:00 编辑:丁丁小编
来源:点击查看
简介
作者:toly,Solana 联合创始人
编译:Felix,PANews
每天大约有100万个新账户加入Solana网络,目前总状态已经超过5亿,而快照大小约为70GB。虽然随着硬件的进步,这些数据量本身是可以管理的,但Solana虚拟机(SVM)运行时的目标是提供最经济的硬件访问方式。为此,必须在现有硬件限制内管理状态和内存。
PCI带宽
截至2024年,最新的PCI带宽可以达到0.5Tbs到1Tb的吞吐量,相当于每秒64GB到128GB。虽然听起来很高,但如果每个交易(tx)需要读取/写入128MB的数据,128GBps的PCI带宽会将链的每秒交易处理量(TPS)限制在1000左右。实际上,大多数交易访问的是最近加载并缓存到RAM中的内存。理想的设计应该是允许加载1000个具有128MB新状态的交易,再加上10k或更多读取和写入现有缓存状态的交易。
账户索引
创建新账户需要证明该账户当前不存在。这通常是在每个验证器上自动完成的,因为每个验证器都有当前所有有效账户的完整索引。即使账户数据不存储在本地,只存储数据的哈希,5亿个账户也将是32字节的密钥 + 32字节的数据哈希,或者每项64字节,即32GB。这已经足以保证RAM和磁盘的分离。
快照大小
在某些快照大小下,如果部分网络出现硬件故障,冷启动新系统所需的时间足以延长最坏情况下的重启时间。随着带宽和硬件的改进,情况每天都在变化,而Solana并没有接近这个限制,但该限制在任何时间点都存在。
概要
内存和磁盘具有不同的性能特征和限制。如果SVM不区分,那么交易和限制就必须针对最坏的情况进行定价,从而限制了性能。在交易执行期间,所有账户密钥至少必须可用,并且总账户数量将影响RAM和磁盘PCI带宽的利用率。快照不能任意增大。理想的解决方案是:
Binary Trie mining
Binary Trie作为快照的一部分被跟踪。
新账户证明
要创建一个新账户,用户必须证明该账户在Trie中不存在。维护整个状态的验证器可以生成账户不在Trie中的证明。这给用户带来了负担,他们必须始终与大型状态提供者连接以生成这些证明。
或者,用户可以证明他们的账户是用最近的PoH哈希创建的。支持这一点的最简单的方法是生成新的PKI,账户地址是哈希(最近的PoH哈希,PKI::public_key)。鉴于Trie中的账户必须首先进行状态压缩,这需要一个完整的epoch。Trie中的任何账户都不可能使用最近的PoH哈希来生成地址。
其他可以支持的方法是PKI创建本身可以提供一个证明,证明私钥是用哈希(用户隐藏的秘密,最近的PoH哈希)创建的。
LSR
Lightweight Simple Rent,又称Less Stupid Rent。如何为分配新账户的成本定价,以及如何确保旧的废弃账户最终得到压缩,并减少系统的整体负载和新用户的价格?
需要恢复租金(Rent)制度。Rent是指当前状态下的账户应该支付X美元/字节/天的费用,就像AWS上的账户支付存储费用一样。
Rent Rate bonding curve
RentRate = K*(state_size)^N
无论当前状态大小如何,如果很小,费率应该很低,如果接近快照限制,费率应该非常高。
Allocation Minimum Bonding Price
账户必须至少存在一个epoch。分配需要将账户带入Hot状态。热账户应该在缓存期间存在。
New Account bond = Epoch Slots * RentRate * Account::size
新账户的余额中必须至少有这么多的lamports才能创建。
Hot Account Burn
lruturnverrate = 每个账户在LRU缓存中平均占用的时间,最大值为1 epoch。这个值可以是一个常数,也可以在链下计算,并作为中位数权益加权常数报告给SVM。
压缩
当(current slot - account::creation_slot) * RentRate * account::size > account::lamports时,压缩账户并烧毁所有lamports。
上述解决方案应该会让State变得很便宜,因为随着时间的推移,未使用的账户最终会达到lamports 0,并将被压缩。所以数据开销会减少,甚至索引开销也会减少,这将减少当前状态的大小。减少状态的大小将降低超二次分配的成本。