本文由来

最近在做一个Dapp,里面有部分功能涉及帮助用户存储一定量的数据,所以需要有个计算用户成本的逻辑,由用户持续为自己消耗的存储付费。

开始计算合约成本

合约的部署成本

等于合约源码编译后WASM文件大小的10倍(mainnet)。相关源码在(GitHub code)查找setcode_ram_bytes_multiplier。这涵盖了VM和其他内存的开销,这是发布合约的最基本消耗。

合约的数据成本

对于系统账户的RAM消耗计算是在eosio代码(GitHub code)中,通过_db检索资源消耗,这需要访问运行的chainbase数据库。据我目前了解,还不能从合约直接这样获取。
那目前预计方案为,跟踪合约执行,并根据每行中存储的数据估算成本。

初步方案实现

用户发起转账到合约账户,内联购买RAM到合约账户,并记录增加的RAM到合约内对应账户下。
新增加数据时,计算本次的使用量,如果合约内账户剩余RAM足够的话,减去对应的数量,不够的话,提示用户充值。
删除数据时,计算本次数据的删除量,增加的内存量到合约内对应账户下。
如果做公益性质,由于数据估算可能有一定量的偏差,可以引入一定量的手续费,避免损失。

TODO

等方案实现完,再来继续完善本文。

参考: