Состав по наследованию в Солидности - Газовая эффективность - PullRequest
0 голосов
/ 26 сентября 2018

В языках ООП составление по наследованию является общеизвестной передовой практикой.Солидность также является языком ООП, но есть и проблема эффективности использования газа.

Вопрос в Солидности, как соотносятся состав и наследование друг с другом с учетом соответствующих затрат на газ?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

При сравнении со счетом 1-1 композиция сложнее развернуть и выполнить.Тем не менее, если вам нужно развернуть много экземпляров, вы можете использовать шаблон Library и использовать композицию таким образом.

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

Еще один момент, который следует учитывать при работе с библиотеками: существуют серьезные проблемы безопасности для разделяемых библиотек.Хак Parity, который заблокировал средства, был из-за использования композиции .

Наследование является гораздо более простой моделью и всегда будет дешевле в исполнении.

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

0 голосов
/ 01 октября 2018

Настройка контракта - это не точная наука, а баланс безопасности, хороших методов кодирования и стоимости.

В транзакциях Ethereum стоит газ и, следовательно, эфир.Сокращение потребления газа по контракту важно в двух ситуациях:

  1. Стоимость развертывания контракта
  2. Стоимость вызова функций контракта

Принципы ООПкак Inheritance & Composition облегчают повторное использование кода и, следовательно, автоматически уменьшают размер контракта в байтах.Тем не менее, разработчик по-прежнему несет большую ответственность за написание эффективного кода для оптимизации использования газа.

Чтобы избежать огромных затрат при развертывании контракта, важно, чтобы разработчик написал эффективный код.Особенно когда договор наследуется от другого или когда договор состоит из другого (-ых) договора (-ов).

Если Contract B наследуется от Contract A, то во время компиляции компилятор Solidity вводит байт-код A в B.Это увеличивает стоимость развертывания для B.(По существу размер B = Размер B + Размер A).Аналогично, если Contract C состоит из Contract D, байт-код D будет скомпилирован в байт-код C.Но если вы, как разработчик, чувствуете, что эти первоначальные затраты оправданы по сравнению с сокращением transaction cost за счет повторного использования кода, то вам нужно принять исполнительное решение!

НО, когда вы делаете композицию, подобную этой:

// Foo bytecode will be loaded into memory from an existing Foo deployment
Foo public foo2 = Foo(0xF00BAA...); //THIS is more efficient compared to new Foo().

В некоторых случаях Вы можете рассмотреть альтернативы наследования.Например, дочерние контракты, которые вызывают внешние функции в основном контракте (скажем, в реестре или основном хранилище / логике), будут иметь тенденцию быть меньше, чем дочерние контракты, которые унаследовали сложный контракт.Это не только сократит затраты на развертывание, но и сократит затраты на общее количество transactions.

Еще один способ уменьшить размер за счет удаления ненужного кода.например:

function p1 ( uint x ){ 
   if ( x > 5)
    if ( x*x < 20)
       XXX }

В приведенном выше коде строки 3 и 4 никогда не будут выполняться, и такого типа бесполезного кода можно избежать, тщательно прорабатывая логику контракта, и это уменьшит размер интеллектуального контракта.

В целом, просто выбор состава по сравнению с наследованием не делает его эффективным по газу.Его прагматическое кодирование, которое приводит к эффективному по газу коду!

Более подробная информация в этой статье содержит полезные рекомендации по кодированию эффективного кода по газу.

Надеюсь, это поможет.

...