EOS系统中的资源类型
在EOS资源分配的核心思想中,token代表系统资源的使用权。EOS用户或者DAPP开发者需要购买token,并将其抵押到EOS的系统账户,用以获取网络带宽资源和CPU计算资源的使用权。EOS系统中有5类重要的资源:
1、 网络带宽资源
2、 CPU计算资源
3、 内存资源
4、 存储资源
5、 投票资源
网络带宽资源
1、什么是带宽资源
用户发送一笔交易信息后,区块生产者需要将交易打包生成区块,然后将区块通过网络同步给其它生产者,这个过程需要消耗一定网络带宽资源。而带宽资源的计量方式为,交易信息在区块中所占的字节数,比如,一条交易信息占用100字节,如果用户进行10笔交易的话,大概需要100 * 10 = 1KB。带宽资源的计费方式类似手机流量,用户每发送一笔交易信息就消耗一点带宽资源,如果带宽资源消耗为0,则无法继续发送交易信息。
2、如何获取带宽资源
获取带宽资源的方式有两种,1)如果用户账户持有token,那么可以直接将 token抵押到EOS系统账户,然后,系统会根据抵押token所占全网token的比例,分配给用户对应的带宽资源。比如,用户持有1%的token,那么该用户就拥有全网1%的带宽资源。同时,用户可以取消抵押,将带宽资源转换为等量的token。这种带宽获取方式本身不会消耗token,但是,已经抵押的token不能够继续抵押或者出售,抵押锁定期至少3天。 2)如果用户账户没有token,可以从其它用户手中租赁带宽资源。
带宽资源的获取和释放是通过系统智能合约完成,其中,抵押token获取带宽资源通过delegatebw函数实现,取消抵押通过undelegatebw函数实现。如果receiver为其他人的账户,则表示将带宽资源出租给其他人,否则表示自用。
在delegatebw函数中,from为抵押token的账户,receiver为带宽资源的接收账户,如果和from参数相同,表示自用资源,否则,表示出租给其他人,stake_net_quantity表示用来抵押网络带宽资源的token数量,stake_cpu_quantity表示用来抵押CPU计算资源的token数量,transfer为TRUE表示接收账户可以解除抵押,为FALSE表示只有发起账户才能解除抵押。
void system_contract::delegatebw( account_name from, account_name receiver,
asset stake_net_quantity,
asset stake_cpu_quantity, bool transfer )
{
…
changebw( from, receiver, stake_net_quantity, stake_cpu_quantity, transfer);
}
抵押token的具体实现通过changebw函数完成。首先,更新接收方账户的带宽资源,接着,设置接收方账户在运行环境中资源限额,最后将token转给eosio系统账户锁定。
void system_contract::changebw( account_name from, account_name receiver,
const asset stake_net_delta, const asset stake_cpu_delta, bool transfer )
{
// 更新资源接受方的账户资源
totals_tbl.modify( tot_itr, from == receiver ? from : 0, [&]( auto& tot ) {
tot.net_weight += stake_net_delta;
tot.cpu_weight += stake_cpu_delta;
});
// 在运行环境中设置接受方账户的资源限额
set_resource_limits(receiver,tot_itr->ram_bytes,tot_itr->net_weight.amount,tot_itr->cpu_weight.amount );
// 将token转给eosio系统账户锁定
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {source_stake_from, N(active)},{ source_stake_from, N(eosio.stake), asset(transfer_amount), std::string(“stake bandwidth”) } );
}
解除抵押之后,资源会马上释放,但是token需要锁定期到期后才能释放会账户,目前锁定期默认为3天。
CPU计算资源
当用户调用智能合约时,区块生产者需要根据智能合约地址查找合约代码,然后将代码加载到内存中执行,这个过程需要消耗一定的CPU算力。CPU计算资源的计量方式为,运行智能合约(交易也属于智能合约的一种)所消耗的时间,用户每次调用智能合约都会消耗一点计算资源,如果消耗为0则无法继续执行合约。 获取计算资源的方式也是通过抵押token或者向其它用户购买。解除抵押之后,token也需要至少锁定3天。
RAM资源
1、什么是RAM资源
我们知道,智能合约由一系列action组成,当用户调用智能合约时,区块生产者需要为这些action创建一个运行环境(也叫Action“Apply”Context),主要包括CPU计算资源和RAM内存资源。可以看出来,RAM资源是DAPP运行的基础。
2、如何获取RAM资源
RAM资源也是通过抵押token获取的,但是和网络带宽资源不同的是,抵押或者解除抵押需要收取0.5%的手续费,并且获得RAM不能出租给其他人,只能给自己使用。交易RAM通过系统智能合约buyram和sellram实现,其中,buyer表示购买RAM的账户,receiver表示接收RAM的账户,tokens表示用于购买RAM的token数量。
void system_contract::buyram(account_name buyer, account_name receiver, asset tokens);
void system_contract::buyrambytes(account_name buyer, account_name receiver, uint32_t bytes);
购买RAM的流程为,从receiver账户扣除0.5%的交易手续费,然后,根据当前RAM的价格,将token兑换成RAM,接着更新receiver账户的RAM数量,
void system_contract::buyram( account_name payer, account_name receiver, asset quant )
{
// 从receiver账户扣除0.5%的交易手续费
auto fee = quant;
fee.amount = ( fee.amount + 199 ) / 200; /// .5% fee (round up)
auto quant_after_fee = quant;
quant_after_fee.amount -= fee.amount;
// 根据当前RAM的价格,将token兑换成RAM
int64_t bytes_out;
const auto& market = _rammarket.get(S(4,RAMCORE), “ram market does not exist”);
_rammarket.modify( market, 0, [&]( auto& es ) {
bytes_out = es.convert( quant_after_fee, S(0,RAM) ).amount;
});
// 更新receiver账户的RAM数量
userres.modify( res_itr, receiver, [&]( auto& res ) {res.ram_bytes += bytes_out;});
}
从RAM的交易函数名称使用“buy/sell”而不是“delegate/undelegate”,也说明了RAM资源只能买卖不能租赁。不过,RAM的买卖,实质是发生在用户账户和系统账户之间的交易行为,而不是直接的市场交易行为。
3、为什么RAM采用了不同的经济模型
从供给侧来看,RAM的总量由超级节点共同投票决定,一旦确定之后,短时间内不会发生大幅的扩容。而RAM的需求端由DAPP市场需求决定,当DAPP上线运行后,会一直锁定内存,不会释放,而且目前市场的RAM价格昂贵,所以,RAM会成为一种稀缺资源。相比之下,带宽资源和CPU计算资源会随着时间推移,由超级节点源源不断的提供,所以,不具备明显的稀缺性。
和带宽资源的价格计算方式不同,RAM的价格采用bancor算法,其核心思想就是根据市场的供求关系决定RAM价格,买的人越多,价格越高。
那么,如何抑制早期囤积大量RAM的投机客炒作价格呢?1)大量买入RAM后,相应的token会被锁定,既不能流通,也不能抵押带宽出租,将会损失EOS升值以及租赁带来的收益。2)RAM不可以直接转让,必须换回token才能继续交易,并且出售RAM需要0.5%的手续费,这意味着随着RAM价格的升高,手续费也会随之增加。3)随着内存的价格降低,超级节点会提高RAM供应量,这样进一步抑制了囤积RAM的获利行为。
存储资源
DAPP应用需要保存大量的图片、视频文件,这些数据没有直接存储在区块链中,而是通过IPFS分布式文件系统,仅仅将文件地址保存在区块链上,而文件内容则放在更为廉价的分布式存储上。目前这部分功能还没有实现。
投票资源
1、什么是投票资源
持有token的账户拥有投票选举超级节点的权利,相比于其它资源来说,投票资源不能为用户产生直接的价值,从长期来看,投票的价值在于选举出更有实力的超级节点为EOS社区服务,进一步提升EOS的影响力,而作为EOS利益共同体的用户,也会从中受益。
2、如何进行投票
1)token持有者需要先将手中的token抵押成网络带宽资源;
2)被抵押的token会转换成投票数量,1个token兑换30票,可以向最多30个超级节点投票;
3)被抵押的token有3天的锁定期,到期后可以解除抵押;
4)可以将投票权委托给其它代理人,负责投票过程。
向区块生产者或者代理人投票的过程通过voteproducer函数完成。
void system_contract::voteproducer( const account_name voter_name, const account_name proxy, const std::vector<account_name>& producers ) {
require_auth( voter_name );
update_votes( voter_name, proxy, producers, true );
}
运行DAPP需要多少token
在EOS系统中,网络带宽、CPU和RAM资源均由超级节点提供,而且,资源的总量是有上限的,所以,用户持有的token数量就决定了可以使用的资源量。那么,对于DAPP开发者来说,需要多少token才能满足DAPP的正常运行呢?
用户可以通过一个在线的EOS DAPP资源计算器来计算所需的token,具体网址为:https://www.eosrp.io/#calc
EOS Resource Planner实时更新带宽资源、CPU资源和RAM资源的价格(以token换算),以及token和法币兑换价格。
同时,用户可以根据DAPP所需的资源,换算出需要购买的token。
结论
带宽、CPU和内存等计算资源是信息技术发展的基石,为上层的互联网、大数据、人工智能等应用提供基础设施。在早期PC时代,计算资源主要由个人电脑承载,应用程序规模很小,而且跨地域的机器间协作也很少。后来,随着云计算的发展,用户可以拥有一个数据中心的计算资源。以EOS为代表的区块链系统,正在以一种全新的计算资源分配和调度方式,为互联网应用提供IT基础设施。虽然,目前区块链系统的资源价格相对比较昂贵,但是,随着区块链生态环境的不断优化完善,未来可能会为用户提供性价比更高的资源。
本文由专栏作者“极简主义”投稿及首发,未经授权严谨转载!