该RSKIP提议用户应为使用账户、合约和合约存储单元支付存储租金,以降低存储垃圾的风险,并使存储支付更加公平。该合约基于RSKIP61,但针对Unitrie中任何类型的节点统一应用存储租金,而不仅限于账户或合约节点。提案详细描述了存储租金的计算方式、交易格式的修改以及未来的改进方向。
RSKIP | 113 |
---|---|
标题 | Unitrie 的统一的面向缓存的存储租金 |
创建时间 | 2019 |
作者 | SDL |
目的 | Sca |
层级 | Core |
复杂度 | 2 |
状态 | 草案 |
此 RSKIP 提议,用户应为使用帐户、合约和合约存储单元支付存储租金,以降低存储垃圾信息的风险,并使存储支付更加公平。此合约基于 RSKIP61,但对其进行了调整,使其能够统一地适用于 Unitrie 中的任何类型的节点,而不仅限于帐户或合约节点。
有关存储租金讨论的摘要,请参见 RSKIP61。此 RSKIP 扩展了 RSKIP61,并通过将存储租金统一应用于 Unitrie 的任何类型的终端非空节点来降低其复杂性。
执行交易时,所有查询的 Unitrie trie 键/值对都存储在缓存中。所有写入的 Unitrie 键/值对也是如此。交易完全处理完毕后,将迭代缓存,并为每个项目收取存储租金。如果该项目没有改变节点的状态,那么只有当租金高于 10000 gas 时才会支付租金(见稍后计算租金的公式)。如果节点的状态发生变化,那么只有当租金高于 1000 时才会支付租金。这可以保护网络免受代价高昂的微交易的影响。占位符键/值,例如合约存储根节点,也会被纳入租金计算中。
如果交易被正确调度,此 RSKIP 不会干扰添加并行交易执行的计划,因为不会有键/值重叠。
租金通过扩展交易来支付,以添加一个新字段 “rentGas”。交易消耗的总 gas 将等于消耗的执行 gas 加上消耗的租金 gas。租金 gas 的消耗在交易执行结束时进行检查。如果消耗的租金 gas 高于 rentGas,则交易将被回滚。如果交易由于没有足够的 gas 支付存储租金而被回滚,则存储租金将被全部消耗。如果交易由于之前的 OOG 异常或 REVERT 而结束,那么即使 trie 节点没有被触及,也只会支付 25% 的存储租金。支付 25% 的存储租金是为了补偿从缓存访问合约的成本,但不包括写回修改后的字段以指示最后一次支付的成本。与普通 gas 一样,完整的 rentGas 金额从原始地址中扣除,然后在交易处理结束时返还剩余金额。
每个 Unitrie 节点都有一个新的字段 lastRentPaidTime。设 d 为正在处理的区块的时间戳。这两个字段都以秒为单位给出。请注意,中间节点(没有值有效负载)的访问不支付租金,但是当它的一个子节点被修改时,它的 lastRentPaidTime 总是会被更新。这将使未来节点的休眠(所有类型)成为可能。
以下伪代码说明了如何计算和支付每个节点 “dest” 的租金。
if (d>lastRentPaidTime) {
useRentGas = nodeSize*(d-lastRentPaidTime)/2^21
if ((dest was modified) && (useRentGas>=1000)) ||
((dest was NOT modified) && (useRentGas>=10000)) {
dest.lastRentPaidTime = now
consumeRentGas(useRentGas);
}
}
nodeSize 的计算方法是节点值的长度加上 128。因此,nodeSize 只能近似地表示实际消耗的空间,因为它没有考虑嵌入的节点。
设 SecondsAYear 为 31536000。每个字节每秒支付 1/2^21 gas。因此,一个存储字节每年支付 SecondsAYear/2^21=15.03 gas 单位。一个值长度为 10 字节的简单帐户的 nodeSize 为 138。这样的帐户每年将消耗 2070 单位的 gas。如果帐户定期执行支付,租金将大约每年收取两次。如果它不活跃,并且只有合约使用 BALANCE 操作码检查其余额,那么它将每 5 年支付一次租金。代码中有 10K 字节和 100 个存储单元的合约每年将支付大约 38 万单位的 gas。拥有 10 万个单元的合约每天将支付大约 4.4 万 gas。
此值 useRentGas 从交易 rentGas 中消耗。
当一个节点单元第一次被创建时,lastRentPaidTime 被设置为未来 6 个月。这意味着一些租金是预付的。
区块 gas 限制不适用于租金:以 gas 支付的租金金额可能高于 gas 限制。因此,租金是矿工的额外无上限收入来源。
交易格式被修改。目前,交易包含以下字段:
如果交易有 10 个或更多字段,那么索引为 10(从 1 开始)的字段将对应于字段 rentGasLimit。字段 gasLimit 的相同大小限制将适用于 rentGasLimit。同样,rentGasLimit 也会从发送者的余额中全部扣除,然后返还未使用的金额。如果交易没有指定 rentGasLimit,那么 rentGasLimit 将被假定为等于 gasLimit。
如果交易被手动回滚(REVERT),则在交易收据中记录一个新的状态 (-1)。 如果交易由于标准 OOG 而被回滚,则仍然使用旧的空向量状态。 如果交易由于租金 OOG 而被回滚,则在交易收据中记录一个新的状态 (-2)。
如果合约未支付的节点租金高于某个非常高的阈值,则该节点可能会被休眠。
此外,此 RSKIP 可以与使用状态 trie 更新批处理 (COBLOP) 方法的 SPV 压缩区块传播相结合。
版权和相关权利通过 CC0 放弃。
- 原文链接: github.com/rsksmart/RSKI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!