Обратите внимание на эту функцию из урока! Она будет часто встречаться в контрактах, поэтому нужно запомнить, для чего она нужна.
Constructor() - это функция, которая вызовется автоматически, когда контракт будет размещен в блокчейн, т.е. сразу в момент размещения.
#code #constructor
Constructor() - это функция, которая вызовется автоматически, когда контракт будет размещен в блокчейн, т.е. сразу в момент размещения.
#code #constructor
❤2🔥1
Баг в протоколе Lybra
Интересная находка была в конкурсном аудите протокола Lybra, в наборе которого были прокси контракты.
При всей очевидности проблемы, найти ее смог только один аудитор. Почему очевидной? Просто потому, что этому обучают всех с момента знакомства с прокси контрактами.
Для протокола был создан отдельный контракт конфигуратор, который так и называется LybraConfigurator. По своей сути, это был Логический контракт для прокси контракта.
Проблема заключалась в том, что тут был конструктор, с помощью которого устанавливались переменные в память, что и было ошибкой.
Как мы знаем, конструктор исполняется только один раз, во время деплоя контракта, и позволяет сделать изначальную установку переменных в контракт. Но запись идет в память данного контракта, а не в память прокси, как это положено в данном случае. Поэтому на момент? когда были бы развернуты контракты в сети, то две переменные в прокси остались бы с нулевым значением.
Вот такой очевидный и не очень баг.
Более детально о нем можно прочитать тут, в отчете code4rena.
Будьте внимательны при работе с прокси!
#proxy #constructor
Интересная находка была в конкурсном аудите протокола Lybra, в наборе которого были прокси контракты.
При всей очевидности проблемы, найти ее смог только один аудитор. Почему очевидной? Просто потому, что этому обучают всех с момента знакомства с прокси контрактами.
Для протокола был создан отдельный контракт конфигуратор, который так и называется LybraConfigurator. По своей сути, это был Логический контракт для прокси контракта.
Проблема заключалась в том, что тут был конструктор, с помощью которого устанавливались переменные в память, что и было ошибкой.
Как мы знаем, конструктор исполняется только один раз, во время деплоя контракта, и позволяет сделать изначальную установку переменных в контракт. Но запись идет в память данного контракта, а не в память прокси, как это положено в данном случае. Поэтому на момент? когда были бы развернуты контракты в сети, то две переменные в прокси остались бы с нулевым значением.
Вот такой очевидный и не очень баг.
Более детально о нем можно прочитать тут, в отчете code4rena.
Будьте внимательны при работе с прокси!
#proxy #constructor
👍4
Solidity hints. Часть 12
Сегодня чуть припозднился с постом. Иногда в репо встречаются какие-то обрывки из правил, и я трачу время, чтобы понять:
1) О чем вообще идет речь?
2) Откуда это он взял?
И вот сейчас пункт звучит:
17. Dont use this.f inside constructor
Кто это вообще использует? Я за все время ни разу не встречал в конструкторах this, а знаете почему?
Потому что его вообще нельзя использовать там!
Я к тому что, зачем писать пункт к себе в репо, который и так будет помечаться компилятором, как ошибка, и он не позволит вам собрать контракт...
Ну, в общем, рассказываю, что-о-чем тут.
Он читал официальные доки Solidity и встретил комментарий к коду:
State variables are accessed via their name and not via e.g. `this.owner`. Functions can be accessed directly or through `this.f`, but the latter provides an external view to the function. Especially in the constructor, you should not access functions externally, because the function does not exist yet.
Немного запутано написано, но я понял, что this, в этом случае, как бы выполняет вызов в функцию из вне создаваемого контракта, и так как последняя еще не существует, он выдает об этом ошибку.
При этом, если использовать туже функцию, но без this, то все работает нормально. Например:
В общем, не особо понял зачем этот пункт, раз все равно нельзя так сделать, но раз есть в списке, то разбираем и его.
Ну, и еще один пункт напоследок:
18. Internal is the default visibility level for state variables.
Тут все просто, у каждого типа данных в Solidity есть некое значение по-умолчанию. У uint - это 0, у bool - false и т.д.
И у каждой переменной состояния есть область видимости: public, external, internal и private. Если мы не указываем нужную нам область, то по умолчанию устанавливается internal, что запрещает обращаться к ней из других внешних контрактов.
#constructor #visibility
Сегодня чуть припозднился с постом. Иногда в репо встречаются какие-то обрывки из правил, и я трачу время, чтобы понять:
1) О чем вообще идет речь?
2) Откуда это он взял?
И вот сейчас пункт звучит:
17. Dont use this.f inside constructor
Кто это вообще использует? Я за все время ни разу не встречал в конструкторах this, а знаете почему?
Потому что его вообще нельзя использовать там!
Я к тому что, зачем писать пункт к себе в репо, который и так будет помечаться компилятором, как ошибка, и он не позволит вам собрать контракт...
Ну, в общем, рассказываю, что-о-чем тут.
Он читал официальные доки Solidity и встретил комментарий к коду:
State variables are accessed via their name and not via e.g. `this.owner`. Functions can be accessed directly or through `this.f`, but the latter provides an external view to the function. Especially in the constructor, you should not access functions externally, because the function does not exist yet.
Немного запутано написано, но я понял, что this, в этом случае, как бы выполняет вызов в функцию из вне создаваемого контракта, и так как последняя еще не существует, он выдает об этом ошибку.
При этом, если использовать туже функцию, но без this, то все работает нормально. Например:
contract TestThis {
uint256 private num;
// не работает
constructor() {
num = this.increment();
}
function increment() internal view returns(uint256){
return num + 5;
}
}
contract TestThis {
uint256 private num;
// работает
constructor() {
num = increment();
}
function increment() internal view returns(uint256){
return num + 5;
}
}В общем, не особо понял зачем этот пункт, раз все равно нельзя так сделать, но раз есть в списке, то разбираем и его.
Ну, и еще один пункт напоследок:
18. Internal is the default visibility level for state variables.
Тут все просто, у каждого типа данных в Solidity есть некое значение по-умолчанию. У uint - это 0, у bool - false и т.д.
И у каждой переменной состояния есть область видимости: public, external, internal и private. Если мы не указываем нужную нам область, то по умолчанию устанавливается internal, что запрещает обращаться к ней из других внешних контрактов.
#constructor #visibility
👍2