【玩转EOS】转账、抵押等操作需要消耗多少net和cpu资源?

作者:KY

在EOS网络里在EOS网络里面进行转账操作时,相信不少人都会遇到过因net或cpu资源不足,导致转账失败的情况。本文就结合实际的转账操作,分析一下转账EOS大致需要多少net和cpu资源。同时,通过查阅分析源码,介绍net和cpu资源是如何获取、消耗以及恢复的。

写在前面

本文仅从实际使用者的角度,通过重复多次执行相同的操作,两次操作中间不超过30秒,观察net和cpu资源的使用情况,从而统计分析出不同转账方式,所消耗的资源数量。下面会先给出分析结果,文末会附上试验过程数据。

net和cpu资源消耗测试数据

下面表格展示了转账 操作平均消耗的资源。转账时所带memo不同,消耗的资源也不同,而转账金额的多少不影响消耗 。

转账eos所带memo规定不能超过 256 bytes。以utf-8编码的中文字符占 3 bytes,所以在memo中的中文字符不能超过85个。

net和cpu资源获取、消耗以及恢复

首先,通过下面的命令可以查看账户的cpu和net资源信息

> cleos get account <账户名>

...

net bandwidth:

    staked:          0.1000 EOS           (total stake delegated from account to self)

    delegated:       1.0000 EOS           (total staked delegated to account from others)

    used:             5.487 KiB  

    available:        671.6 KiB  

    limit:              677 KiB  

cpu bandwidth:

    staked:          1.1000 EOS           (total stake delegated from account to self)

    delegated:       1.0000 EOS           (total staked delegated to account from others)

    used:             31.69 ms  

    available:        9.779 ms  

    limit:            41.47 ms  

...

staked 本账户为自己抵押的eos数量

delegated 别的账户为本账户抵押的eos数量

used 已消耗的资源量

available 可用的资源量

limit 可消耗的资源上限

net和cpu资源获取

EOS系统中,cpu和net资源是通过抵押eos获取的。抵押的时候只记录了抵押cpu/net对应的eos数量,获取到的资源不是固定的,而是在使用的时候会按照当前你所抵押eos的数量占全网抵押总量的比例实时计算的,最终体现为 limit 的值。实时计算由 eos/libraries/chain/resource_limits.cpp 中 get_account_net_limit_ex 和 get_account_cpu_limit_ex 方法实现。

计算 net 和 cpu 上限的算法基本一样,下面以 get_account_net_limit_ex 方法作为例子来说明。

account_resource_limit resource_limits_manager::get_account_net_limit_ex( const account_name& name ) const {

  const auto& config = _db.get();

  const auto& state  = _db.get();

  const auto& usage  = _db.get(name);

  int64_t net_weight, x, y;

  # 获取本账户的net资源eos抵押量 net_weight

  get_account_limits( name, x, net_weight, y );

  if( net_weight < 0 || state.total_net_weight == 0) {

     return { -1, -1, -1 };

  }

  account_resource_limit arl;

  uint128_t window_size = config.account_net_usage_average_window;

  # 窗口期内的全网net资源总量

  uint128_t virtual_network_capacity_in_window = state.virtual_net_limit * window_size;

  # 本账户的net资源eos抵押量

  uint128_t user_weight     = (uint128_t)net_weight;

  # 全网用户的net资源eos抵押总量

  uint128_t all_user_weight = (uint128_t)state.total_net_weight;

  # 窗口期内,该账户最大可用的net资源量

  auto max_user_use_in_window = (virtual_network_capacity_in_window * user_weight) / all_user_weight;

  # 窗口期内,该账户已使用net资源量

  auto net_used_in_window  = impl::integer_divide_ceil((uint128_t)usage.net_usage.value_ex * window_size, (uint128_t)config::rate_limiting_precision);

  if( max_user_use_in_window <= net_used_in_window )

     arl.available = 0;

  else

     # 窗口期内,该账户可用net资源量

     arl.available = impl::downgrade_cast(max_user_use_in_window - net_used_in_window);

  arl.used = impl::downgrade_cast(net_used_in_window);

  arl.max = impl::downgrade_cast(max_user_use_in_window);

  return arl;

}

窗口期内账户最大可用的net资源量 limit = 窗口期内全网net资源总量 * 本账户的net资源eos抵押量 / 全网用户的net资源eos抵押总量

窗口期内账户可用net资源量 available = 窗口期内账户最大可用的net资源量 limit - 窗口期内该账户已使用net资源量 used

通过上面的介绍,可以知道相同的eos抵押量,在不同时间可以使用资源量是会根据全网的资源情况以及全网抵押总量是动态变化的。可以通过这里查看实时的资源成本.

net和cpu资源消耗和恢复

net和cpu资源消耗和恢复的部分计算是由

eos/libraries/chain/include/eosio/chain/resource_limits_private.hpp 中

exponential_moving_average_accumulator 的 add 方法实现的。

void add( uint64_t units, uint32_t ordinal, uint32_t window_size /* must be positive */ )

{

   // check for some numerical limits before doing any state mutations

   EOS_ASSERT(units <= max_raw_value, rate_limiting_state_inconsistent, "Usage exceeds maximum value representable after extending for precision");

   EOS_ASSERT(std::numeric_limits::max() - consumed >= units, rate_limiting_state_inconsistent, "Overflow in tracked usage when adding usage!");

   # 本次操作资源消耗量

   auto value_ex_contrib = downgrade_cast(integer_divide_ceil((uint128_t)units * Precision, (uint128_t)window_size));

   EOS_ASSERT(std::numeric_limits::max() - value_ex >= value_ex_contrib, rate_limiting_state_inconsistent, "Overflow in accumulated value when adding usage!");

   if( last_ordinal != ordinal ) {

      FC_ASSERT( ordinal > last_ordinal, "new ordinal cannot be less than the previous ordinal" );

      if( (uint64_t)last_ordinal + window_size > (uint64_t)ordinal ) {

         # 本次与上次操作之间的时间间隔

         const auto delta = ordinal - last_ordinal; // clearly 0 < delta < window_size

         # 已使用资源量衰减系数

         const auto decay = make_ratio(

                 (uint64_t)window_size - delta,

                 (uint64_t)window_size

         );

         # 计算已使用资源衰减后剩余量

         value_ex = value_ex * decay;

      } else {

         value_ex = 0;

      }

      last_ordinal = ordinal;

      consumed = average();

   }

   consumed += units;

   # 计算本次操作后资源已使用量

   value_ex += value_ex_contrib;

}

本次操作后的资源已使用量 used = 上次操作后的资源已使用量 * 衰减系数 + 本次操作的资源消耗量

衰减系数 = (window_size - (本次时间段序号 - 上次时间段序号)) / window_size

其中,衰减系数 中涉及的 window_size 的值可以通过下面的方式得到

# 查看 eos/libraries/chain/include/eosio/chain/config.hpp

const static int      block_interval_ms = 500;

static const uint32_t account_cpu_usage_average_window_ms  = 24*60*60*1000l;

static const uint32_t account_net_usage_average_window_ms  = 24*60*60*1000l;

# 查看 eos/libraries/chain/resource_limits.cpp

uint32_t account_cpu_usage_average_window = config::account_cpu_usage_average_window_ms / config::block_interval_ms;

uint32_t account_net_usage_average_window = config::account_net_usage_average_window_ms / config::block_interval_ms;

uint128_t window_size = config.account_cpu_usage_average_window;

uint128_t window_size = config.account_net_usage_average_window;

# 可以推导出 window_size 的值

window_size = 24 * 60 * 60 * 1000 / 500

我们可以理解为,cpu和net资源的恢复周期是24小时。

举个例子,上一次操作后资源已使用量为 x,经过 t 小时以后,再执行一次操作,那么本次操作后的资源已使用量的计算方式如下:

本次操作后的资源已使用量 used = x * ((24 - t) / 24) + 本次操作资源消耗量

总结

本文通过实际操作试验,得出了转账以及抵押操作需要消耗的net和cpu资源量。并且结合源码分析了在eos系统中,net和cpu资源是如何获取、消耗以及恢复等相关知识。如果想了解试验过程中的数据可以查看【附录】试验数据

【附录】试验数据

1【转账】不带memo

cleos transfer 账户A 账户B '0.0001 EOS' '' 

2【转账】不同金额

cleos transfer 账户A 账户B '0.1 EOS' '' 

3【转账】带短memo

cleos transfer 账户A 账户B '0.0001 EOS' '感谢!' 

4【转账】带最长memo

cleos transfer 账户A 账户B '0.0001 EOS' '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'

5【转账】带中文memo

cleos transfer 账户A 账户B '0.0001 EOS' '测测测测测测测测测测测测测测测测测测测测测 

6【抵押】换net和cpu

cleos system delegatebw 账户A 账户A "0.01 EOS" "0.01 EOS" 

【参考】

EOS零手续费免费?你不知道的EOS收费细节

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 社会上对于剩女一词有太多褒贬不一的看法。而大部分的民众对于她们有着太多的不理解,总认为在该结婚的年龄被剩下像是一种...
    cangelaz阅读 186评论 0 0
  • 【感性情绪Vs理性思考】 最近我有点焦虑,班委工作没干好,公司的工作也被说了,让我很郁闷。公司安排一线人员支援一线...
    蝎子小猫咪阅读 204评论 2 11
  • 1.百词斩背单词,385天,300词; 2.万步计划,10056 3.雅思词汇61-163
    iMark的华尔街阅读 96评论 0 0