Оптимизация использования RAM для DAPPs

in #eos6 years ago

Оригинал: https://medium.com/itam/optimization-of-ram-usage-for-dapps-ed7a5f6d1419

Как использование RAM может быть оптимизировано для DApps?

Всем привет от Dongjun Kwon из ITAM Network.

Оптимизация RAM - это главная задача для всех, кто создает DApp на основе EOS. В ITAM Network, мы также работаем над тем, чтобы найти решение для этой проблемы. Эта статья будет о том как можно оптимизировать использование RAM.

Когда используется RAM?

RAM используется в двух ситуациях (хотя их может быть и больше):

1. При загрузке смарт-контракта

Когда вы пишете DApp и впервые публикуете его, оно будет потреблять примерно в 10 раз больше RAM, чем ваш бинарный файл. Это может меняться в зависимости от того, насколько хорошо разработан смарт-контракт и как он был разработан. В результате, можно сказать, что использование RAM зависит от возможностей разработчика. Однако, поскольку она потребляется во время развертывания смарт-контракта, это не является большой проблемой.

2. При сохранении данных с использованием таблицы смарт-контракта

При использовании DApp, важно удостовериться, что работает функция сохранения и загрузки данных. Для этого EOS предоставляет TABLE, и я думаю, что большинство смарт-контрактов используют ее. Однако, именно TABLE занимает большую часть RAM. RAM используется каждый раз, когда создается TABLE или когда данные регистрируются. Кроме того, самая большая проблема заключается в том, что если вы не удаляете TABLE или данные, вы не можете вернуть RAM и она продолжает использоваться.

Как можно использовать RAM более эффективно? Простым способом для опытного разработчика было бы заниматься разработкой и программированием так, чтобы экономить RAM. Однако, это не является фундаментальным решением для использования TABLE. Если погрузиться глубже в проблему, можно допустить, что «сохранение и управление минимальным количеством данных в TABLE» может быть лучшим вариантом, но это также означает, что чем дольше используется DApp, тем больше будет потребление RAM. Что же мы можем сделать? Нужно ли нам избавляться от TABLE?

Метод минимизации использования RAM

Несмотря на то, что мы развивались в ITAM Network, мы также неоднократно обращались к EOS BLOCK-data. Посмотрим на EOS BLOCK-data? (Это 7813616-е данные)

 producer: 'eosbixinboot',
 confirmed: 0,
 previous:
  '007739ef7cf1462b05106250189fb55e4a8952d14e7db470f635d6f4557963c5',
 transaction_mroot:
  'a4c4496be9270606a2356eade3b45fad58a16972c2638dff8bd100241c0a4779',
 action_mroot:
  '147a36d77a0edbb12183f481f4afdaeb0660775b87b600f138ecd40fefa065e5',
 schedule_version: 214,
 new_producers: null,
 header_extensions: [],
 producer_signature:
  'SIG_K1_Kb6tQTupJ8MTSrgNf1A4mZtDVtbBdUasjRXVw4ZfVmDAYzRLdiPV2WEmh5j1Yd2jubRoc9CjLBSpmoohpCPe8JgKa3xpDm',
 transactions:
  [ { status: 'executed',
      cpu_usage_us: 1274,
      net_usage_words: 40,
      trx: [Object] },
    { status: 'executed',
      cpu_usage_us: 1222,
      net_usage_words: 21,
      trx: [Object] },
    { status: 'executed',
      cpu_usage_us: 1123,
      net_usage_words: 40,
      trx: [Object] },
    { status: 'executed',
      cpu_usage_us: 5393,
      net_usage_words: 23,
      trx: [Object] },
    { status: 'executed',
      cpu_usage_us: 1482,
      net_usage_words: 40,
      trx: [Object] } ],
 block_extensions: [],
 id:
  '007739f09df05592a9ecae25238896787c8bcfc5b3600f2202134fcdda8cafa4',
 block_num: 7813616,
 ref_block_prefix: 632220841 }

Часть, на которую нужно обратить пристальное внимание, это транзакции, и среди транзакций давайте посмотрим на trx.

 signatures:   ['SIG_K1_KfyZanF2G1fFqLjLtw4x6HnmT9JSxo8k3QgGHbqdwHdn9K5v25yaXPJiRMEEvuA3cTWkPisqKBjvMvsX2EpzbigcYqWvRS' ],
 compression: 'none',
 packed_context_free_data: '',
 context_free_data: [],
 packed_trx:
'8e51595ba1388fe4f08d000000000100a6823403ea3055000000572d3ccdcd0110e0a53cab294d7600000000a8ed3232dd0110e0a53cab294d76a09863fa4c9b8965010000000000000004454f5300000000bb01496e74726f647563696e67204954414d204e6574776f726b2c20616e20454f532d426173656420444150502050726f6a656374206f6e20426c6f636b636861696e2047616d696e6720506c6174666f726d20666f722061205472616e73706172656e742047616d696e672045636f73797374656d2e202d2d576562736974653a2068747470733a2f2f6974616d2e67616d65732f656e202d2d54656c656772616d3a2068747470733a2f2f742e6d652f6974616d6e6574776f726b00',
 transaction:
  { expiration: '2018-07-26T04:43:58',
    ref_block_num: 14497,
    ref_block_prefix: 2381374607,
    max_net_usage_words: 0,
    max_cpu_usage_ms: 0,
    delay_sec: 0,
    context_free_actions: [],
    actions: [ [Object] ],
    transaction_extensions: [] } }

Это почти все. Давайте также посмотрим на действия.

 name: 'transfer',
 authorization: [ { actor: 'itamnetwork1', permission: 'active' } ],
 data:
  { from: 'itamnetwork1',
    to: 'gq4tqnbugige',
    quantity: '0.0001 EOS',
    memo:
     'Introducing ITAM Network, an EOS-Based DAPP Project on Blockchain Gaming Platform for a Transparent Gaming Ecosystem. --Website: https://itam.games/en --Telegram: https://t.me/itamnetwork' },
 hex_data:
'10e0a53cab294d76a09863fa4c9b8965010000000000000004454f5300000000bb01496e74726f647563696e67204954414d204e6574776f726b2c20616e20454f532d426173656420444150502050726f6a656374206f6e20426c6f636b636861696e2047616d696e6720506c6174666f726d20666f722061205472616e73706172656e742047616d696e672045636f73797374656d2e202d2d576562736974653a2068747470733a2f2f6974616d2e67616d65732f656e202d2d54656c656772616d3a2068747470733a2f2f742e6d652f6974616d6e6574776f726b' }

Если вы посмотрите на приведенные выше данные, вы увидите историю действия передачи, используемого в смарт-контракте eosio.token.

Этот пост о том, как минимизировать использование RAM, так почему же мы рассмотрели данные блока? Позвольте задать вам вопрос.

Используют ли данные блока RAM так же как и TABLE?

Данные блока не используют RAM; данные накапливаются в BP, работающем на полном ноде. Некоторые из вас, возможно, уже поняли суть, но если вы пойдете немного дальше, мы можем сделать вывод, что минимизировать использование RAM возможно, если мы используем данные в блоке, НЕ используя TABLE.

В таком случае, как мы можем это сделать?

Ответ очевиден, если вы посмотрите на данные блока; это данные действия.

Действие относится к данным действия в транзакции, которая выполняет конкретное действие смарт-контракта. Выполнение каждого смарт-контракта хранится в блоке в приведенной выше форме. Это означает, что, если мы не используем TABLE, но используем оставшиеся данные блока после выполнения действия смарт-контракта, мы можем минимизировать использование RAM TABLE.

Я Приведу Пример

В ITAM Network нам необходимо регистрировать предметы, приобретенные в игре. Мы будем использовать это в качестве примера.

Опубликуйте смарт-контракт через аккаунт itamnetwork1. Внутри смарт-контракта есть действие get, и, скажем, нам нужно значение параметров itamKey, itemName и onwer.

Выполняем действие get на itemnetwork1, и ниже мы увидим то, что должны увидеть если бы посмотрели на блок. (Предположим, что имя аккаунта, получившего этот элемент, - itamnetwork2).

 name: 'get',
 authorization: [ { actor: 'itamnetwork2', permission: 'active' } ],
 data:
  { itamKey: '1',
    itemName: 'Invisibility Cloak',
    onwer: 'itamnetwork2',
  },
 hex_data:
'10e0a53cab294d76a09863fa4c9b8965010000000000000004454f5300000000bb01496e74726f647563696e67204954414d204e6574776f726b2c20616e20454f532d426173656420444150502050726f6a656374206f6e20426c6f636b636861696e2047616d696e6720506c6174666f726d20666f722061205472616e73706172656e742047616d696e672045636f73797374656d2e202d2d576562736974653a2068747470733a2f2f6974616d2e67616d65732f656e202d2d54656c656772616d3a2068747470733a2f2f742e6d652f6974616d6e6574776f726b' }

Как видите, мы можем просмотреть все данные, которые вы хотите сохранить как данные действия в информации блока. Если вы используете данные блока таким образом, я считаю, что это приведет к минимизации объема RAM, используемой TABLE.

Как подготовиться?

Это довольно очевидно, но вам нужно иметь возможность извлекать пользу из данных блока. Если вы храните данные блока EOS в базе данных, вы можете легко выполнять поиск и обработку на основе этой базы данных.

Поэтому, необходимо иметь способ извлечения данных блока каждый раз, когда поддерживается полный нод или, в качестве альтернативы, хранить определенные действия в базе данных, используя demux-js, который недавно вышел на EOS.

Что нужно учесть

Есть вещи, о которых вы должны подумать при использовании данных блока.

1. EOS Fullnode / demux-js

Чтобы использовать данные блока, необходимо иметь способ поддержки полного нода или использовать demux-js. Нам нужно подумать, эффективен ли этот метод.

2. Дизайн смарт-контрактов

Поскольку это не является обычным способом использования TABLE, дизайн смарт-контрактов имеет решающее значение.

3. Бизнес-модель

Поскольку все данные отображаются на блоке, вам необходимо разработать соответствующую бизнес-модель.

Вывод

В заключение, мы перешли к использованию данных действий, которые происходят на блоке, избегая при этом использования TABLE, которая использует много RAM. Пожалуйста, примите к сведению, что это только один альтернативный метод, а не единственный правильный ответ. Очень важно получить обзор от кого-то, кто применяет этот метод.


Если у вас возникли трудности с использованием данной информации или вы хотите получить нашу консультацию, пожалуйста, свяжитесь с нами по адресу [email protected].

Подписывайтесь на ITAM Network и получайте самую последнюю информацию.

Перевод CryptoLions

photo_122x122.jpg

Website

Telegram

Steemit

Twitter

GitHub

Meetup

Coin Marketplace

STEEM 0.20
TRX 0.15
JST 0.029
BTC 62864.56
ETH 2538.87
USDT 1.00
SBD 2.93