最近 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
成本要低很多。
原参考资料中有更多的细节,建议看一下。