Обратите внимание на эту функцию из урока! Она будет часто встречаться в контрактах, поэтому нужно запомнить, для чего она нужна.
Constructor() - это функция, которая вызовется автоматически, когда контракт будет размещен в блокчейн, т.е. сразу в момент размещения.
#code #constructor
Constructor() - это функция, которая вызовется автоматически, когда контракт будет размещен в блокчейн, т.е. сразу в момент размещения.
#code #constructor
❤2🔥1
Чуть больше о взломе ANKR сегодня
Кто не слышал: сегодня был взломан сервис ANKR и украдено, по разным источникам, 10-20 миллиардов токенов aBNBc. До сих пор идут обсуждения, как это произошло. Пока что вот некоторая доступная информация.
Многие пользователи, в том числе аудиторы из крупных компаний, сходятся на том, что изначально были скомпрометированы приватные ключи ANKR.
Затем хакер несколько раз обновлял прокси контракт (Twitter).
В то время как функция mint() защищена модификатором, хакер вызвал другую функцию 0x3b3a5522, которая позволяла обойти проверки и сминтить токены. (Twitter).
Эти токены предназначались для наград (rewards) пользователей за действия на сервисе, таким образом все оригинальные токены BNB не были задеты, и взлом никак не повлиял на его цену.
Далее он обменял украденные токены на биржах PancakeSwap и ApeSwap на BNB, чем практически опустошил оба пула и задампил цену.
Чуть позже он перевел все на Tornado cash и через мост на Ethereum и обменял часть BNB на USDC.
Вот к чему может привести кража приватных ключей.
Остается один вопрос: каким образом это произошло? Некоторые склоняются, что слив ключей произошел в момент обновления сервиса и его кода за несколько часов до взлома (Twitter).
Код контракта можно посмотреть тут.
Далее снова про скамы NFT.
#ankr #break
Кто не слышал: сегодня был взломан сервис ANKR и украдено, по разным источникам, 10-20 миллиардов токенов aBNBc. До сих пор идут обсуждения, как это произошло. Пока что вот некоторая доступная информация.
Многие пользователи, в том числе аудиторы из крупных компаний, сходятся на том, что изначально были скомпрометированы приватные ключи ANKR.
Затем хакер несколько раз обновлял прокси контракт (Twitter).
В то время как функция mint() защищена модификатором, хакер вызвал другую функцию 0x3b3a5522, которая позволяла обойти проверки и сминтить токены. (Twitter).
Эти токены предназначались для наград (rewards) пользователей за действия на сервисе, таким образом все оригинальные токены BNB не были задеты, и взлом никак не повлиял на его цену.
Далее он обменял украденные токены на биржах PancakeSwap и ApeSwap на BNB, чем практически опустошил оба пула и задампил цену.
Чуть позже он перевел все на Tornado cash и через мост на Ethereum и обменял часть BNB на USDC.
Вот к чему может привести кража приватных ключей.
Остается один вопрос: каким образом это произошло? Некоторые склоняются, что слив ключей произошел в момент обновления сервиса и его кода за несколько часов до взлома (Twitter).
Код контракта можно посмотреть тут.
Далее снова про скамы NFT.
#ankr #break
👍1
Большая заметка по работе с памятью
Несмотря на то, что на канале уже было достаточно материалов по работе с памятью в Solidity, я постоянно путался в некоторых моментах. Поэтому решил объединить все в одном посте-заметке, чтобы иметь быстрый доступ и периодически напоминать себе основные нюансы.
Storage
1. Размер Storage контракта 2**256-1.
2. Слоты в памяти имеют размер в 32 байта. Если переменные меньше 32 байт, то они могут быть "упакованы". Т.е. если есть 4 переменные uint8, то они все будут занимать только один слот.
3. Динамические массивы хранятся следующим образом: сначала определяется слот, в котором массив был обозначен. Там хранится его длина (кол-во элементов), а значение элемента в массиве высчитывается через keccak256(p), где "р" - номер слота инициализации массива. Таким образом, первый элемент массива будет храниться в keccak256(p), второй в keccak256(p)+1, третий в keccak256(p)+2 и т.д.
4. Маппинга хранятся немного по другому. В главном слоте, где был объявлен маппинг, хранится пустое значение (все нули). А значение маппинга находится с помощью keccak256(p CONCAT key), где key - это ключ, к которому нужно найти само значение.
5. Enum, по описанию из комментария на stackexchange: Up to 255 values seems to take up 8 bits of storage, and 256 values seems to take up 16 bits of storage.
Memory
1. Максимальный размер Memory - 2 ** 64 байта.
2. Стоимость хранения считается linearly для первых 724 байтов, и Quadratically - после.
3. Структура памяти:
0x00 - 0x3f (64 bytes): зарезервированное место для хеширования;
0x40 - 0x5f (32 bytes): указатель на свободное место (free memory pointer);
0x60 - 0x7f (32 bytes): пустой слот, который также используется, как изначальное значение для динамических массивов;
Отсчет для хранения новых значений начинается с 128 байта.
4. Слоты всегда по 32 байта.
5. Для динамических массивов в первом слоте хранится его длина, а затем идут сами элементы.
6. Если добавляете значения в Memory через assembly, то также необходимо обновлять и free memory pointer, так как в этом случае он не обновляется автоматически.
7. Все не инициализированные значение будут указывать на слот 0х60 (кроме структур), в то время как строки, байти и динамические массивы будут указывать на следующий free memory location.
Calldata
1. Неизменяемое хранилище данных.
2. Не могут храниться и передаваться маппинги.
3. В отличие от Memory размер не лимитирован.
4. Размер всего calldata можно узнать с помощью опкода CALLDATASIZE.
5. Первые 4 байта всегда занимает селектор функции, который считается через bytes4(keccak256("funcName(args)")).
6. Для динамических массивов и строк сначала идет offset (32 байта), потом длина / размер (32 байта), потом сами значения.
Stack
1. Хранение по принципу LIFO - last in, first out.
2. В стеке доступны только верхние 16 слотов.
3. Базовые опкоды: PUSH, POP, SWAP и DUP.
4. Solidity, как язык, не работает на прямую со стеком.
5. Функции помеченные, как external, занимают два слота в стеке: адрес контракта и селектор вызываемой функции. В этом случае они zero-padded слева, а не справа, как это в других случаях.
6. Для того, чтобы обойти ошибку "stack too deep" можно использовать block scopes {}.
Code
1. Константы и immutable хранятся в байткоде контракта.
2. Если константы на определены по какой-либо причине, то они на попадают в байткод.
3. Immutable нельзя определять в try/catch в версии 0.8.20.
4. Аргументы для конструктора контракта добавляются в конец байтокода самого контракта.
P.S. Можете смело корректировать или добавлять пункты в комментариях.
#storage #memory #calldata #code #stack
Несмотря на то, что на канале уже было достаточно материалов по работе с памятью в Solidity, я постоянно путался в некоторых моментах. Поэтому решил объединить все в одном посте-заметке, чтобы иметь быстрый доступ и периодически напоминать себе основные нюансы.
Storage
1. Размер Storage контракта 2**256-1.
2. Слоты в памяти имеют размер в 32 байта. Если переменные меньше 32 байт, то они могут быть "упакованы". Т.е. если есть 4 переменные uint8, то они все будут занимать только один слот.
3. Динамические массивы хранятся следующим образом: сначала определяется слот, в котором массив был обозначен. Там хранится его длина (кол-во элементов), а значение элемента в массиве высчитывается через keccak256(p), где "р" - номер слота инициализации массива. Таким образом, первый элемент массива будет храниться в keccak256(p), второй в keccak256(p)+1, третий в keccak256(p)+2 и т.д.
4. Маппинга хранятся немного по другому. В главном слоте, где был объявлен маппинг, хранится пустое значение (все нули). А значение маппинга находится с помощью keccak256(p CONCAT key), где key - это ключ, к которому нужно найти само значение.
5. Enum, по описанию из комментария на stackexchange: Up to 255 values seems to take up 8 bits of storage, and 256 values seems to take up 16 bits of storage.
Memory
1. Максимальный размер Memory - 2 ** 64 байта.
2. Стоимость хранения считается linearly для первых 724 байтов, и Quadratically - после.
3. Структура памяти:
0x00 - 0x3f (64 bytes): зарезервированное место для хеширования;
0x40 - 0x5f (32 bytes): указатель на свободное место (free memory pointer);
0x60 - 0x7f (32 bytes): пустой слот, который также используется, как изначальное значение для динамических массивов;
Отсчет для хранения новых значений начинается с 128 байта.
4. Слоты всегда по 32 байта.
5. Для динамических массивов в первом слоте хранится его длина, а затем идут сами элементы.
6. Если добавляете значения в Memory через assembly, то также необходимо обновлять и free memory pointer, так как в этом случае он не обновляется автоматически.
7. Все не инициализированные значение будут указывать на слот 0х60 (кроме структур), в то время как строки, байти и динамические массивы будут указывать на следующий free memory location.
Calldata
1. Неизменяемое хранилище данных.
2. Не могут храниться и передаваться маппинги.
3. В отличие от Memory размер не лимитирован.
4. Размер всего calldata можно узнать с помощью опкода CALLDATASIZE.
5. Первые 4 байта всегда занимает селектор функции, который считается через bytes4(keccak256("funcName(args)")).
6. Для динамических массивов и строк сначала идет offset (32 байта), потом длина / размер (32 байта), потом сами значения.
Stack
1. Хранение по принципу LIFO - last in, first out.
2. В стеке доступны только верхние 16 слотов.
3. Базовые опкоды: PUSH, POP, SWAP и DUP.
4. Solidity, как язык, не работает на прямую со стеком.
5. Функции помеченные, как external, занимают два слота в стеке: адрес контракта и селектор вызываемой функции. В этом случае они zero-padded слева, а не справа, как это в других случаях.
6. Для того, чтобы обойти ошибку "stack too deep" можно использовать block scopes {}.
Code
1. Константы и immutable хранятся в байткоде контракта.
2. Если константы на определены по какой-либо причине, то они на попадают в байткод.
3. Immutable нельзя определять в try/catch в версии 0.8.20.
4. Аргументы для конструктора контракта добавляются в конец байтокода самого контракта.
P.S. Можете смело корректировать или добавлять пункты в комментариях.
#storage #memory #calldata #code #stack
👍11💯3❤2🔥2
Работа с памятью в Solidity. Большой сборник
На канале было уже достаточно много постов про работу памяти. Пришло время собрать все в один пост, чтобы вы могли сохранить себе сборник материалов, к которым можно обращаться в любой момент.
Новички смогут получить первое представление об этом разделе языка, а более продвинутые разработчики напомнить себе некоторые нюансы.
На русском языке:
1. Большая заметка канала по работе с памятью. Тут я собрал краткие сведения по storage, memory, stack и code для удобства.
2. Структура. Хранение данных. Видео с канала Ильи
3. Memory и calldata. Видео с канала Ильи
4. Динамические массивы и мэппинги в storage. Видео с канала Ильи
На английском языке:
5. Solidity Tutorial: All About Stack
6. Understanding Ethereum Smart Contract Storage
7. Solidity Tutorial: All About Calldata
8. Solidity Tutorial: All About Code
9. Solidity Tutorial: All About Memory
10. All About Solidity Data Locations — Storage
11. Solidity Tutorial: All About Data Locations
12. Guide To Advanced Calldata
Доскональное изучение материалов может занять пару недель, но без этого будет сложно понимать внутреннюю работу смарт контрактов и проводить аудит.
Приятного обучения и хорошей недели!
#storage #memory #stack #code #calldata
На канале было уже достаточно много постов про работу памяти. Пришло время собрать все в один пост, чтобы вы могли сохранить себе сборник материалов, к которым можно обращаться в любой момент.
Новички смогут получить первое представление об этом разделе языка, а более продвинутые разработчики напомнить себе некоторые нюансы.
На русском языке:
1. Большая заметка канала по работе с памятью. Тут я собрал краткие сведения по storage, memory, stack и code для удобства.
2. Структура. Хранение данных. Видео с канала Ильи
3. Memory и calldata. Видео с канала Ильи
4. Динамические массивы и мэппинги в storage. Видео с канала Ильи
На английском языке:
5. Solidity Tutorial: All About Stack
6. Understanding Ethereum Smart Contract Storage
7. Solidity Tutorial: All About Calldata
8. Solidity Tutorial: All About Code
9. Solidity Tutorial: All About Memory
10. All About Solidity Data Locations — Storage
11. Solidity Tutorial: All About Data Locations
12. Guide To Advanced Calldata
Доскональное изучение материалов может занять пару недель, но без этого будет сложно понимать внутреннюю работу смарт контрактов и проводить аудит.
Приятного обучения и хорошей недели!
#storage #memory #stack #code #calldata
👍10🐳3🔥1💯1
Проект на виду. Часть 3. Solidity и React все таки придется учить
Держу вас в курсе, как продвигаются мои эксперименты с нейронками и созданием web3 проекта.
За прошедшее время я экспериментировал с созданием сайта от лица пользователя, который ни разу ничего не кодил. Грубо говоря, я просто дал задание написать сайт с определенными условиями, а затем "тупо" нажимал на "Принять" к каждому предложению нейронки по коду.
Вот полная история.
В 20 числах марта я получил приглашение к новомодному агенту на основе множества ИИ - Manus. По заверениям разработчиков и огромному количеству твитов и видео о том, какой Манус классный и как он создает проекты, я решил попробовать дать задание на создание простого сайта именно ему.
Если кратко, то:
1. Manus должен был создать такой сайт:
- Одностраничник, где выводились бы новости в в виде карточек (пример карточки я приложил в виде картинки png и ссылки на сам сайт);
- Сайт должен выглядеть как чат DeepSeek - меню слева, карточки на главной, а когда заходишь на статью, то выглядит она как отправленные сообщения;
- Есть админский доступ к добавлению новых статей и разделов;
- Сложная часть: создание статьи, где текст, картинки и видео могут идти вперемешку;
- Все должно было подключаться к базе данных: получать инфу о статьях и добавлять новые статьи;
2. Стек также был достаточно распространенным: React, PHP, axios, mysql, tailwind. Ну, т.е. вообще база.
3. В качестве редактора кода я выбрал CursorAI с агентом Claude 3.7 Sonnet.
Повторюсь, что я не использовал ни правила для курсора, ни промты для задания. Мне было интересно поставить себя на место "новичка с идеей".
В общем Manus прислал довольно обширный набор файлов. Его структуру можно увидеть на скрине.
Что было дальше?
А все! Проект проблематично собрать.
1. Не хватает части файлов для сборки react приложения;
2. Предложенная mysql база отличается от запросов в базу реализованной в коде;
3. Backend также требует существенных доработок.
Если попробовать задавать вопрос в Claude, типа: "Вот ошибка:... Как ее исправить?", а затем просто бездумно принимать все варианты, то в какой-то момент поймешь, что двигаешься по кругу.
Спустя три дня таких "кликов", создания кучи новый файлов для дебагга и ловли ошибок, я просто удалил весь проект.
На данный момент, я не верю, что абсолютный новичок может создать полноценный проект без знания языка и навыков работы с бекендом. Нельзя просто запросить сайт и получить готовый Фейсбук.
Если брать во внимание Solidity, то это будет вообще кошмар! Код контракта будет создан, но как весь проект будет работать сообща, и его околонулевой уровень безопасности будет внушать страх.
В другом случае, дело обстоит кардинально противоположно, если вы знаете язык.
Нейросети в этом случае будут невероятным помощником!
Для моего личного проекта на днях с помощью Claude и DeepSeek был написан отличный код для генерации AST-паттерна. Хорошо оптимизирован, быстро работает, корректно отрабатывает все условия, просто сказка!
Разница только в одном: в первом случае - я просто принимал все правки и не заглядывал в код, во втором - я точно знал, за что отвечает каждый участок кода и какой результат его выполнения я должен получить.
Если вы хотите создавать свои проекты, включая web3, учиться языку все таки будет нужно. И учить его нужно будет до тех пор, пока вы не начнете понимать, какие ошибки возникают в процессе разработки и как их исправить самому. Вот тогда разработка пойдет быстро!
#ai #code
Держу вас в курсе, как продвигаются мои эксперименты с нейронками и созданием web3 проекта.
За прошедшее время я экспериментировал с созданием сайта от лица пользователя, который ни разу ничего не кодил. Грубо говоря, я просто дал задание написать сайт с определенными условиями, а затем "тупо" нажимал на "Принять" к каждому предложению нейронки по коду.
Вот полная история.
В 20 числах марта я получил приглашение к новомодному агенту на основе множества ИИ - Manus. По заверениям разработчиков и огромному количеству твитов и видео о том, какой Манус классный и как он создает проекты, я решил попробовать дать задание на создание простого сайта именно ему.
Если кратко, то:
1. Manus должен был создать такой сайт:
- Одностраничник, где выводились бы новости в в виде карточек (пример карточки я приложил в виде картинки png и ссылки на сам сайт);
- Сайт должен выглядеть как чат DeepSeek - меню слева, карточки на главной, а когда заходишь на статью, то выглядит она как отправленные сообщения;
- Есть админский доступ к добавлению новых статей и разделов;
- Сложная часть: создание статьи, где текст, картинки и видео могут идти вперемешку;
- Все должно было подключаться к базе данных: получать инфу о статьях и добавлять новые статьи;
2. Стек также был достаточно распространенным: React, PHP, axios, mysql, tailwind. Ну, т.е. вообще база.
3. В качестве редактора кода я выбрал CursorAI с агентом Claude 3.7 Sonnet.
Повторюсь, что я не использовал ни правила для курсора, ни промты для задания. Мне было интересно поставить себя на место "новичка с идеей".
В общем Manus прислал довольно обширный набор файлов. Его структуру можно увидеть на скрине.
Что было дальше?
А все! Проект проблематично собрать.
1. Не хватает части файлов для сборки react приложения;
2. Предложенная mysql база отличается от запросов в базу реализованной в коде;
3. Backend также требует существенных доработок.
Если попробовать задавать вопрос в Claude, типа: "Вот ошибка:... Как ее исправить?", а затем просто бездумно принимать все варианты, то в какой-то момент поймешь, что двигаешься по кругу.
Спустя три дня таких "кликов", создания кучи новый файлов для дебагга и ловли ошибок, я просто удалил весь проект.
На данный момент, я не верю, что абсолютный новичок может создать полноценный проект без знания языка и навыков работы с бекендом. Нельзя просто запросить сайт и получить готовый Фейсбук.
Если брать во внимание Solidity, то это будет вообще кошмар! Код контракта будет создан, но как весь проект будет работать сообща, и его околонулевой уровень безопасности будет внушать страх.
В другом случае, дело обстоит кардинально противоположно, если вы знаете язык.
Нейросети в этом случае будут невероятным помощником!
Для моего личного проекта на днях с помощью Claude и DeepSeek был написан отличный код для генерации AST-паттерна. Хорошо оптимизирован, быстро работает, корректно отрабатывает все условия, просто сказка!
Разница только в одном: в первом случае - я просто принимал все правки и не заглядывал в код, во втором - я точно знал, за что отвечает каждый участок кода и какой результат его выполнения я должен получить.
Если вы хотите создавать свои проекты, включая web3, учиться языку все таки будет нужно. И учить его нужно будет до тех пор, пока вы не начнете понимать, какие ошибки возникают в процессе разработки и как их исправить самому. Вот тогда разработка пойдет быстро!
#ai #code
👍8❤4🔥3💯1