Настройка контракта - это не точная наука, а баланс безопасности, хороших методов кодирования и стоимости.
В транзакциях Ethereum стоит газ и, следовательно, эфир.Сокращение потребления газа по контракту важно в двух ситуациях:
- Стоимость развертывания контракта
- Стоимость вызова функций контракта
Принципы ООПкак 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 никогда не будут выполняться, и такого типа бесполезного кода можно избежать, тщательно прорабатывая логику контракта, и это уменьшит размер интеллектуального контракта.
В целом, просто выбор состава по сравнению с наследованием не делает его эффективным по газу.Его прагматическое кодирование, которое приводит к эффективному по газу коду!
Более подробная информация в этой статье содержит полезные рекомендации по кодированию эффективного кода по газу.
Надеюсь, это поможет.