EOS链的RAM资源扩增
背景
某个基于EOS开发的链,提供了免费的账户注册接口,执行调用后,空投账户免费为其抵押CPU NET和购买RAM。由于接口没有做严格有效的防刷处理,导致账户注册严重超过预期,导致链内系统资源浪费严重,以及空投部分系统代币占用过多
逻辑处理
- 增加注册接口的防范级别,比如增加IP注册次数,相同公钥,App机器码统计。三方有效的验证码验证,App内核心校验参数加密,增加对方破解成本。
- 对于已经刷入的账户做筛选,以及资源回收,比如,注册多长时间内从未使用
- 增加付费和邀请注册逻辑。提供与EOS目前主流钱包一样的逻辑,由三方账户进行代为抵押购买,或者直接RMB支付
- 由项目方提供投抵押的系统代币。提供空投服务程序给项目方,项目方账户持续为自己项目内账户补充所需的空投代币,服务程序也可以支持邀请码注册,项目方生成邀请码赠送或者出售给自己的用户
链处理
- 一次性扩增RAM容量。(eosio->setram)
void system_contract::setram( uint64_t max_ram_size ) {
require_auth( get_self() );
check( _gstate.max_ram_size < max_ram_size, "ram may only be increased" ); /// decreasing ram might result market maker issues
check( max_ram_size < 1024ll*1024*1024*1024*1024, "ram size is unrealistic" );
check( max_ram_size > _gstate.total_ram_bytes_reserved, "attempt to set max below reserved" );
auto delta = int64_t(max_ram_size) - int64_t(_gstate.max_ram_size);
auto itr = _rammarket.find(ramcore_symbol.raw());
/**
* Increase the amount of ram for sale based upon the change in max ram size.
*/
_rammarket.modify( itr, same_payer, [&]( auto& m ) {
m.base.balance.amount += delta;
});
_gstate.max_ram_size = max_ram_size;
}
- 每块持续新增。(eosio->setramrate)
设置完每块新增量后
void system_contract::setramrate( uint16_t bytes_per_block ) {
require_auth( get_self() );
update_ram_supply();
_gstate2.new_ram_per_block = bytes_per_block;
}
当下次有购买内存的操作时,执行时间差内的容量扩增
void system_contract::buyram( const name& payer, const name& receiver, const asset& quant )
{
require_auth( payer );
update_ram_supply();
参考
https://developers.eos.io/manuals/eosio.contracts/latest/key-concepts/ram