最近 defi 挖矿的时候,经常遇到 cpu 不足,所以,在这里说一下其中的原理。
参考资料
资源分类
EOS的资源模型分为
- CPU
- NET(带宽)
- RAM(内存)
RAM用于存储。RAM即内存,用来记录账户信息,包括账户余额、公钥、质押、投票、智能合约等。通常需要3KB-8KB的容量来存储个人EOS账户信息。RAM是可以随时买卖的,每笔收取0.5%的手续费,同时价格也是随RAM的稀缺程度时刻变动的。
CPU/NET是质押类型的资源。当EOS账户进行转账、投票等操作时,会消耗主网的算力和带宽,此时需要质押一部分EOS来换取CPU/NET,每天使用的算力和带宽会在24小时线性恢复。质押的EOS是可以随时赎回的,但是会存在72小时的冻结期。
- 如果
RAM提示不足,就需要购买,这个是消耗EOS的 - 如果
CPU/NET不足,可以通过质押,这个不消耗EOS,但是,所需EOS很多,也可以通过支付,具体看下面。
RAM
RAM指的是EOS主网上的内存资源。RAM是会被我们使用而被消耗的,比如我们创建一个EOS账户,会消耗掉大约4K的RAM,如果我们在EOS上发一个TOKEN,大约会消耗掉180K的RAM。EOS上DAPP的日常运行中,也是需要不断消耗RAM的,总的来说RAM是EOS主网中一种很常用且珍贵的系统资源。
RAM对EOS生态的影响RAM是整个EOS系统中最珍贵和常用的资源,它的定价机制会深刻影响整个EOS生态的秩序和发展方向。
BM曾经表达过:EOS主网应该对DAPP开发者设定较高的门槛,未达到标准的项目更适合运行在侧链之上。
主网RAM资源价格的合理体现,有利于让优秀DAPP运行在主网上,这样的生态分布对于EOS来说将是高效合理的。
反之,如果RAM的价格过低,将会有大量低质量DAPP充斥在主网上,无法让珍贵的主网资源得到最大化的应用。
能用市场这只无形的手来自动调节RAM价格是很有意义的,这也有利于促使EOS侧链的发展和繁荣。
同时RAM价格的合理体现也会让项目开发团队更珍惜资源,尽量减少不必要的浪费。
之前一些空气项目,是通过全网空投的形式,来作为营销手段获得市场认知和衍生收益的。而现在,RAM价格增长后,每次全网空投可能会消耗数万个EOS,这就形成了一个门槛,把一些粗制滥造没有实质价值的项目挡在了主网之外,相当于一定程度上净化了主网环境。
普通用户在RAM的使用主要是状态的存储,部分状态有了之后,再操作仅是修改RAM中存储的记录,因此重复的操作并不会增加RAM的消耗。但是作为开发商的智能合约,如果没有恰当的使用好RAM,那花钱真是如流水啊。
CPU/NET
恢复
CPU和NET是都是抵押形资源,使用后24小时会完全恢复。但我们在使用过程中,经常会发现明明已经过去24小时了,可资源使用的数据量还是显示没有恢复。
在EOS账户中,CPU和NET的使用量数据,并不会自动更新。如果你的EOS账户最近一直没有新的操作,比如转账、抵押等等。那么它的资源使用量数据,一直都显示为一个固定的值,并不会更新。是不是感觉很坑爹呀。为什么就不能实时更新呢?其实关于实时更新这个事,还确实很难做到。

由于全网抵押量,一直是一个变量。特别是当有大户进行操作的时候,反映到我们的可用资源量波动是非常大的。就算事实同步,这个数据一直在变也是没什么意义的,而且还要同步还要浪费网络资源。与其这样,CPU和NET资源的显示干脆就放弃了同步。
CPU和NET资源的恢复周期是24小时。但并不是24小时后一次性复原,而是逐渐的线性恢复。由于每个用户获得资源的数量也是动态变化的。 所以在资源消耗后,实际系统的判定并不是将资源恢复,而是逐渐减少上一次操作消耗。每过一小时,之前操作的消耗减便减少1/24。直到24小时候后,计算消耗为0。在进行操作的时候,只有:
新交易的消耗资源量 + 之前交易之后所记录下来的资源使用量 <= 系统分配的资源总量这笔交易才能进行。
将资源恢复的规则这么设计,其实也是为了能更合理的分配资源。毕竟我们每个用户的资源分配量,本身就一直在变。这里有些绕,我举个例子大家就清楚了。假设现在抵押资源的人比较少,我用了1个EOS,获得了500ms的CPU资源(1EOS = 500ms)。就在此时,我进行了各种操作花掉了480ms的资源。而在下一秒,突然有大户进行了资源抵押。系统能分配给我的资源一下子从500ms降到了50ms(1EOS = 50ms)。但我已经消耗了480ms,那我此时应该有-430ms的cpu(没错就是负数)。
到了一个小时以后,如果我恢复1/24的资源,就是20ms。这就相当于我之前价格,获得了当下的资源。这么做的话,一定会导致整个网络资源数变大。而这显然是做不到的。所以EOS用减少之前的消耗,代替了恢复。这么做,可以保证系统的总资源量,一直是恒定的。
资源获取
资源租赁
资源租赁,最典型的代表就是REX,EOS持币者将闲置的EOS存入REX,而需要使用资源的人可以租用其中的EOS,存入的人赚取租金。REX会自动将租来的EOS转换成资源投入到租赁者的账号中。REX的租赁价格也是实时波动的,池中被租赁的EOS占比越高,价格越贵,写文章时的价格大约为支付1EOS可以租到4900EOS的资源,租期为一个月,按现在的CPU价格计算,花1个EOS可以在一个月内每天转账1000次以上(不同的操作消耗资源不同,如果是最普通的转账可以转1400次左右),实际上大部分人是用不到这么多的,我想对于大多数人来说,租0.05就已经用不完的用了,按现状的EOS价格算相当于每个月只需要付出一块钱的资源成本,也可以看作是免费了。
因为要做 defi ,每天都涉及到大量的转账,所以,我切换到了 rex 方式,非常简单。
资源代付
而资源代付则是另一种形式了,部分dapp的合约会承担资源消耗,也就是不需要消耗用户的资源,那么在没资源时也照样可以使用;
另外以TokenPocket为首的众多钱包推出的顺畅模式,可以直接在没有资源的情况下支付EOS或其他币种购买使用次数,然后开启顺畅模式,之后你的交易消耗的资源都会由顺畅模式代为支付,这种形式的好处是按交易笔数收费,不像REX租来不管用不用钱都必须花,但是如果操作较多的话,肯定是REX成本要低很多。
原参考资料中有更多的细节,建议看一下。