Solidity. Смарт контракты и аудит – Telegram
Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
547 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Коротко о Keccak256

Keccak256 — это криптографический алгоритм хеширования семейства SHA-3. Подробно о том, как работает алгоритм, можно почитать в стандарте и в документации от команды keccak. Для понимания его работы достаточно знать только несколько основных вещей о хеш-функциях и о самом алгоритме.

Что такое хеш-функция?

Хеш-функция — это функция, которая принимает произвольный набор данных в качестве входных данных и выдает хеш-значение фиксированной длины. Длина сообщения на входе может варьироваться, но длина на выходе фиксирована. Хеш-функция не может быть обратимой, то есть невозможно вычислить входные данные по хеш-значению. Это означает, что хеш-функция не может быть использована для шифрования данных.

Почему keccak256?

Keccak256 считается высокозащищенным алгоритмом хеширования. Он устойчив к различным типам атак, таким как атаки на предварительный образ, атаки на коллизии и атаки на увеличение длины. При этом, он является одним из самых эффективных алгоритмов хеширования и его поддерживает множество библиотек. По этим причинам,он был выбран для использования в таких блокчейнах как Ethereum и Bitcoin для выполнения различных задач.

Keccak256 в Solidity

keccak256 — это функция, встроенная в Solidity. Она принимает любое количество входных данных и преобразует их в уникальный 32-байтовый хеш (32 байта это как раз 256 бит).

pragma solidity 0.8.20;

contract Hash {
function hash(string memory _text, uint256 _number, address _address) public pure returns (bytes32) {
return keccak256(abi.encodePacked(_text, _number, _address));
}
}

В смарт-контрактах функция keccak256() используется для работы с подписями, создание хеш-таблиц (маппингов), вычисление селектора функций, работа с деревом Меркла и много другого.

Полную версию статьи про keccak256 можно почитать здесь.

P.S. Сегодняшний пост написан ребятами из компании MetaLamp, в рамках поста для приглашенных авторов. По ссылке вместе со статьей, вы сможете найти авторский репо от команды с другими полезными материалами по Solidity.

Буду рад услышать обратную связь от участников канала по такому варианту постов.

#keccak256
🔥15👍2
Баг из протокола Mia

На днях выпустили отчет по аудиту Mia DAO, где был один примечательный med issue, о котором хочется рассказать.

Посмотрите на код ниже и подумайте, в чем тут может быть проблема:

function _normalizeDecimalsMultiple(uint256[] memory _deposits, address[] memory _tokens) internal view
        returns (uint256[] memory deposits)
{
   for (uint256 i = 0; i < _deposits.length; i++) {
      deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
   }
}


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

Ответ:

Функция не будет работать, так как deposits никогда не были сохранены в памяти.

Вот как правильно нужно было сделать:

{
  uint len = _deposits.length;      
  deposits = new uint256[](len);
  for (uint256 i = 0; i < len; i++) {
     deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
  }
}

Интересный пример, не так ли?

#bug
👍12
Голоса для канала?

С новым обновлением в Телеграм появилась возможность для каналов делать сторис.

Как думаете, нужна ли такая опция для контента? Может делать дневные задачи с ними?

Можно поддержать канал бустом по ссылке: https://news.1rj.ru/str/solidityset?boost

#boost
👍7
Программа 3 модуля курса

Заканчивается сентябрь, я понемногу выхожу из отпуска, и пора продолжать наше обучение по курсу "Начинающий разработчик смарт контрактов".

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

Третий модуль будет хардкорно практическим.

Вместе с темами уроков ученики будут тренироваться:

1. Работе в редакторе кода;
1. Работе с GitHub;
2. Написанием комментариев к коду;
3. Изучением контрактов реальных проектов;
4. Решении задач и базовые понимания безопасности;
5. Плюс два финальных проекта, которые можно будет показать в резюме;

Будет очень много практики! Я хочу, чтобы к моменту 4-5 модуля, где мы будем проходить уже более специфические темы, типа прокси контраков и работе с памятью, ученики имели хорошую базу и навыки работы с кодом.


Итак, программа третьего модуля:

1. Подготовка и настройка IDE
1.1. Плагины для работы
2. Терминал, Node js, NPM
3. Начало работы с Git и GitHub

4. Hardhat. Настройка и запуск
5. Hardhat. Из чего состоит
6. Foundry. Настройка и запуск
7. Foundry. Из чего состоит

9. Голландский аукцион
10. MultiSig и Timelock
11. Commit/reveal
12. DAO и governance

13. Ролевая система
14. ERC4626
15. ERC4907
16. ERC6551


Ориентировочный старт: 2 октября
Стоимость: 3000 рублей, 30 (USDT, USDC)


Хочу также напомнить, что программа курса пишется для новичков в программировании, поэтому только на данном этапе мы будем проходить github и редакторы кода.

Начало продаж, по традиции, в среду.

#курс
🔥121👍1
Чуть больше о практике модуля

Меня попросили рассказать чуть больше о практической стороне модуля, и чем она будет отличаться от практических заданий в предыдущих частях курса.

Итак, для тех, кто не знает, практически после каждого урока в предыдущих модулях было небольшое задание: прочитать статью, написать функцию или контракт, подключить библиотеку и т.д.

В этот раз будет по другому.

Сейчас главная цель не только дать основную идею урока, но и научить работать со средой IDE, GitHub и реальными проектами, которые могут попасться на собеседовании или уже в работе по найму.

Вы научитесь быстро разворачивать протоколы в своем редакторе кода, понимать, за что отвечают функции, выработать свой метод чтения смарт контрактов и замечать проблемы в коде.

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

После легкой первой недели, приготовьтесь к тому, что нужно будет уделять много времени на практику.

#курс
3
*Отзывы после второго модуля курса*

Хотел бы поделиться парой отзывов, которые написали ученики второго модуля.

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

Вот уже третий модуль готовится к старту на следующей неделе, и большая часть учеников с обоих потоков планируют продолжить свой путь! Это здорово мотивирует работать над курсом еще усерднее, подбирая материалы и практику для прокачки навыков!

Третий модуль будет еще круче!

#курс
🔥92
Что тормозило мое обучение?

Во время своего обучение мне всегда не хватало информации о том, как можно использовать новые знания. Вот, к примеру, изучил я прохождение по массиву в цикле, а что с этим делать дальше - не знаю. Или же, разобрался с этим пресловутым delegatecall - а нафига?

Хорошо знать что-то, другое дело уметь применять это в нужный момент. 

Еще одна проблема встала, когда я пошел устраиваться на работу и мне прислали тестовое задание, в котором настройка проекта шла через foundry, с которым я ранее не работал вообще. И пришлось "изобретать велосипед", чтобы хоть как-то наладить это для себя через hardhat.

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

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

Вот и на третьем модуле я хочу показать ученикам, как это делается проще и быстрее, с учетом редактора кода, который является отличным инструментом для анализа.

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

Присоединяетесь!


Программа курса          Отзывы


Старт: 2 октября

#курс
6🔥3👍1
Практика практике рознь

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

Мне всегда было проще учиться на примерах. И чем лучше становился мой навык владения кодом, тем сложнее требовались эти примеры. Вопрос был в том, а где их взять?

Когда год назад, я для практики с defi открыл код протокола Compound, то был немного в шоке от объема и сложности. Перешел на Uniswap... Лучше не стало.

На тот момент меня спасли конкурсные аудиты. Я смотрел различные репо и учился читать код профессиональных команд. Ловить связи функций, поток транзакций, писать тесты и многое другое.

Я подбирал для себя не самые сложные аудиты и рос вместе с ними.

Задачи ethernaut, dvd, capture the ether помогли мне понимать "внутреннюю кухню" функций и языка. Но и к ним нужно подходить с умом.

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

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

Это и будет основной темой третьего модуля.

Сегодня были открыты продажи. Успейте присоединиться!

Программа модуля.      Реквизиты для оплаты

Старт 2 октября.

#курс
А время идет, так почему бы не начать уже сегодня?

18 первых учеников
уже на канале третьего модуля! Успейте занять свое место!

Когда в июле запускался первый модуль курса, я писал, что к осени ученики могут получить крепкую основу для дальнейшего изучения Solidity, и что не стоит откладывать на потом свои желания начать что-либо.

Здорово, что многие тогда получили хороший заряд мотивации и пошли дальше программы. Некоторые из них уже пробуют получить первую работу или устроиться в зарубежную компанию на стажировку! Я верю в вас!

До нового года планируется еще два модуля - 3 (практический) и 4 (более специализированный). За это время вы сможете укрепить свои знания в Solidity, создать портфолио, которое можно показать работодателям, и, возможно, найти новую работу.

С третьим модулем мы начнем также создавать ваше резюме, которое можно будет показывать на собеседованиях. Работодатель будет видеть ваши наработки и уровень знаний!

Не теряйте время, пора начинать! Присоединяйтесь!

Программа модуля.       Реквизиты для оплаты

Старт 2 октября.

Продажи только до конца недели!

#курс
👍1
Где и как искать работу в web3?

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

Сначала пройдемся по требованиям к разработчикам web3.

Прежде всего в вакансиях доминируют два языка: Solidity и Rust. Реже можно встретить требования к знаниям C, C++, Go, Huff и Vyper. Тем не менее, знание этих языков будет хорошим плюсом.

В некоторых компаниях разработчики смарт контрактов должны еще подключать фронтенд к смарт контрактам, поэтому встречаются требования JavaScript, TypeScript, React а также популярных библиотек, типа web3.js, ethers.js.

Также зачастую в мелких и средних компаниях разработчики должны писать тесты для своих контрактов. В связи с этим требуются знания одной из программ: Hardhat, Foundry, Truffle (уже крайне редко). На своем опыте могу сказать, что чаще всего в вакансиях требуется Foundry, так как он чуть быстрее и проще двух других.

Не меньшим плюсом, будут навыки работы с GitHub, Python, NPM.

При заполнении форм на какую-либо вакансию, с вероятностью 60-70%, вас попросят дать ссылку на ваш аккаунт в LinkedIn, Twitter и на GitHub.

Кстати, на GitHub лучше бы иметь пару тройку проектов, которые вы писали. За рубежом Ваш GitHub скажет намного больше, чем любое резюме.

Что же касается опыта в 2-3 года, то тут скорее происходит отсев не уверенных кандидатов. Вы вполне можете подавать свои резюме на эти позиции и пытаться пройти собеседование. При этом помните, кандидата без опыта раскусят сразу. Будьте готовы отвечать на каверзные вопросы и писать код прямо на собеседовании!

Где искать работу?

Для начала можно попробовать поискать тут:

1. https://cyberacademy.dev/jobs
2. https://career.habr.com/vacancies
3. Ну и наш хедхантер, хоть я к нему и отношусь не очень (тупой поиск и фильтр)

P.S. Есть еще фриланс сайты, типа upwork, но рекомендовать не стану, так как у самого там не особо получалось. Но некоторые находити там подработку.

Больше вакансий можно найти на зарубежных порталах:

1. https://cryptojobslist.com/solidity
2. https://cryptocurrencyjobs.co/
3. https://crypto.jobs/
4. https://web3.career/crypto-jobs
5. https://www.indeed.com/q-Blockchain-Developer-jobs.html
6. https://beincrypto.com/jobs/
7. https://www.glassdoor.co.in/

Ну, и, конечно, LinkedIn с разделом вакансий по региону. Вероятно, это одно из самых популярных мест для поиска на западном рынке.

Можно также отслеживать новые вакансии на проектах, которые вам нравятся, типа Bibance, Immunefi и т.д. Только учтите, что на популярных проектах требования гораздо выше, как и конкуренция.

Также я крайне рекомендую зарегистрироваться в Дискорде и вступить в группы:

1. Web3SecurityDAO;
2. Guardian Audits;
3. Code4rena;
4. Immunefi;

Иногда там в чатах, или даже в отдельных топиках, проскальзывают вакансии от компаний, которые больше нигде не публикуются.

Можно также подписаться на некоторые чаты в Телеграм, где также иногда размещаются вакансии:

1. https://news.1rj.ru/str/eth_ru
2. https://news.1rj.ru/str/eth_jobs
3. https://news.1rj.ru/str/eth_dev
4. https://news.1rj.ru/str/cyberacademy
5. https://news.1rj.ru/str/lobsters_hr
6. https://news.1rj.ru/str/blockchainjunauditors

Главный вопрос: Можно ли найти работу, зная только Solidity?

Можно. Но будет чуть труднее.

Главным козырем у вас должен стать ваш GitHub, на котором будут размещены ваши проекты, наработки, тесты, решения задач и т.д.

Поэтому, если давать только один совет для поиска работы, то он будет звучать как - оформите свой GitHub! Считайте это как Инстаграм для мастера по ноготочкам, или отзыв близкого друга об автомастерской.

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

P.S. Сохраняйте себе, чтобы не потерять. Буду благодарен репостам)

#job
👍34🔥3
Три дня до конца продаж на 3 модуль курса

На следующей неделе, уже с понедельника, стартует обучение на третьем модуле нашего курса.

За один месяц вы сможете прокачать свои навыки Solidity разработчика, как если бы обучались сами несколько месяцев!

Это будет самая интенсивная группа, направленная именно на практику с кодом и сопутствующими программами.

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

Если вы хотели попробовать что-то новое этой осенью, пусть это будет третий модуль курса!

Программа модуля.     Реквизиты для оплаты

Старт 2 октября.

Продажи только до конца недели!

#курс
👍3🔥2👎1😁1🤣1
Цикл постов на канале по Foundry

К планируемому запуску проекта этой осенью, о котором писал ранее, я хочу сам еще раз пройтись по программе Foundry и повторить многие моменты с написанием тестов для смарт контрактов.

И я подумал, а что если на канале в бесплатном формате сделать цикл постов-уроков по работе с Foundry с нуля?

Показать, как пишутся тесты, фаз и инвариант тесты, подключение defi контрактов, форки и т.д. Сначала по каждому из пунктов в отдельности, потом уже практическая часть.

Так я смогу повторить основные моменты Foundry, многие из вас начнут осваивать тесты с этой средой, а другие - подскажут, как сделать лучше.

В итоге получится детальный гайд по работе с данной программой на русском языке.

P.S. Думаю начать писать уроки где-то через неделю-две, после того как разберусь с текущими задачами.

#foundry
👍28🔥9
Цикл постов про Foundry - 2

Рад, что так позитивно восприняли идею о постах-уроках по Foundry.

Потихоньку собираю кейсы, которые нужно будет осветить в практике. И тут вопрос для вас:

Какие были проблемы с тестами Foundry? Что не получалось и что вызывало вопросы?

Просто в комментах напишите.

#foundry
👍1
⚡️⚡️⚡️ Менее 12 часов до закрытия продаж! ⚡️⚡️⚡️

Сегодня последний день продаж доступа на третий модуль курса. Если опоздаете, то придется ждать следующего потока!

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

У нас уже набралась достаточно большая группа учеников, поэтому с понедельника, с началом курса, продаж не будет совсем!

Успейте занять свое место!


Программа модуля  

Условия и оплата



Старт 2 октября!

#курс
👍1
Темы для цикла постов по Foundry

Я продолжаю собирать темы для небольшого цикла обучающих постов по написанию тестов на Foundry. Пока что удалось собрать небольшой список:

1. Установка и настройка Foundry;
2. Основные команды в терминале;
3. Настройка remapping;
4. Взаимодействие hardhat и Foundry;
5. Популярные команды cast;
6. Локальный блокчейн Anvil;
7. Разбор читкодов;
8. Разбор библиотек для тестов;
9. Разбор traces;
10. Простые тесты;
11. Fuzz тесты;
12. Тесты инвариантов;
13. Differential Testing;
14. Работа с форками;
15. Деплой и верификация;
16. Дебаггер;
17. Работа с компилятором в тестах;
18. Отправка транзакций в разных блоках;
19. Тестирование для L2 сетей;
20. Тестирование для ZK Sync;
21. Работа с газом;
22. Разбор уже написанных тестов на протоколе;
23. Работа с отчетами;
24. Проведение прицельных тестов: на контракт, на функцию.
25. Подключение etherscan, infura, alchemy для тестов;

UPD. 26. Тестирование прокси контрактов
UPD. 27. Тестирование работы с chainlink
UPD. 28. Тестирование мостов

Начну выкладывать цикл недели через две, когда на основном курсе от канала пройдем темы с программами для тестов.

Пока что, буду рад, если накидаете еще темы или вопросы, которые у вас возникали при написании тестов.

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

#foundry
👍10🔥71
Рекомендации по работе с биржей

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

Хотел бы дать несколько советов по организации работы в случае заказа.

1. Когда обращаетесь к исполнителю имейте четкое Техническое задание на руках, что бы разработчик смог оценить сроки и стоимость более адекватно. Если же у вас нет ТЗ, то оговорите это с исполнителем и попросите помочь составить грамотное ТЗ.

При этом не обижайтесь и не беситесь, если исполнитель не захочет этого делать по какой-либо причине.

2. Оговаривайте сроки исполнения. Всегда должны быть четкие рамки по выполнению услуг. Даже на простой контракт нужно выделить минимум неделю.

3. Оговаривайте стоимость и процесс оплаты. Тут уже на свое усмотрение: либо с авансовым платежом, либо по факту выполеных работы, либо 100% предоплата.

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

4. Фиксируйте договоренности! Создавайте простой договор на исполнение услуг, где, за подписями обеих сторон, укажите объем работ, сроки, стоимость, сроки оплаты, ожидаемые результаты и детальное ТЗ.

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

6. Не бойтесь прописывать штрафы за несоблюдение сроков. Это очень спорный момент при работе с заказами, но я считаю, что он должен быть зафиксирован. Штраф может быть, как за затяжку разработки, так и за затяжку оплаты.

7. Перед выбором исполнителя, попробуйте сделать небольшой поиск по нему в группах. Посмотрите, как он отвечал на вопросы, какие советы давал, чем делился. Обязательно посмотрите его GitHub или другое портфолио.

8. Не "долбите" в личку исполнителю. Это частая проблема, когда заказчик хочет контролировать весь процесс поминутно, и ожидает, что исполнитель должен быть на связи каждый день с 6 утра и до 1 часу ночи. Это не так. Лучше оговорите с ним, в какие дни и в какое время вы будете просить отчет о проделанной работе.

9. Любые дополнения к работе, "хотелки" и правки должны оплачиваться отдельно, а сроки исполнения договора увеличиваться. Не ждите, что по ходу исполнения первоначального заказа, вы сможете повышать объем работ и их сложность за ту же цену. Это все занимает время исполнителя.

Такие пункты должны фиксироваться с отдельном, дополнительном договоре.

10. Отзывы об исполнителе. После выполнения работ, вы можете поделиться отзывом на канале. Наш рынок web3 разработчиков довольно маленький, и репутация здесь крайне важна.

11. В случае возникновения споров, вы всегда можете спросить совета в чате этого канала или любого другого, описав ситуацию и проблему, без перехода на личности. Сообщество поможет разобраться и подсказать выход из сложившейся ситуации.

Работайте честно и адекватно!

Напомню, ссылку на пост с исполнителями, там вы сможете заказать услугу:

https://news.1rj.ru/str/solidityset/874

Всем приятной недели!

#market
2👍1
Бесплатный курс от Statemind

Ребята из Statemind попросили поделиться информацией о наборе на свой бесплатный курс Smart Contract Security Specialist.

Кратно об обучении:

• Обучение онлайн
• Длительность 4 недели
• Обучение на английском/русском языках
• Отбор проводим по входному тесту (в форме)
• После успешного прохождения программы проводим интервью и по результатам предлагаем возможность присоединиться к нашей команде в качестве интерна (мы работаем удаленно)
• Обучение с нашей стороны бесплатное, потому что основная наша задача - найти единомышленников
• Помогаем с релокацией

В программе курса:

• Introduction to blockchain
• DeFi primitives
• DeFi security

Подробная информация и форма для заполнения для тех, кому будет интересно

https://docs.google.com/forms/d/e/1FAIpQLSfdCWi1HYlU1nZs62WwwYA-PZZi7msTqpHnpBtMOARFPer2vg/viewform?usp=sf_link

Залетайте!

P.S. Подчеркну, что потребуется знание английского языка!

#statemind #security
👍136🔥1👌1
Event argument indexing

event Transfer(address from, address to, uint256 amount);

События в Solidity являются своего рода абстракцией над системой логирования для Ethereum Virtual Machine. DApps могут подписываться и слушать события через RPC-интерфейс клиента Ethereum. При отправке события, параметры сохраняются в специальный журнал транзакций.

Для чего нужны Events?

1. Прослушивание событий. Необходимо для оперативного реагирования на изменения во внешнем интерфейсе.
2. Для тестирования. В тестах можно получать события со смарт-контрактов с данными транзакции и проверять их.
3. Для восстановления состояния хранилища. Все события хранятся в журнале EVM и могут быть прочитаны.
4. Создание сабграфов. Для агрегации, конвертации и упрощения чтения данных из блокчейна.

Возможны и другие области применения событий.

Чуть глубже в события

Сама запись в журнале EVM может состоять из двух частей:
- topic
- data

Topic – это 32-байтные слова, которые используются для описания того, что происходит в событии. Например, трансфер от одного адреса к другому.

Data – это закодированные данные. Например, количество токенов переданных при трансфере.

EVM предоставляет 5 opcodes для логирования событий в журнал.
LOG0, LOG1, LOG2, LOG3, LOG4

Каждый код операции (LOG0 … LOG4) служит для указания количества тем, которые необходимо включить в запись журнала. Например, LOG1 включает один topic, а LOG4 включает четыре topics. Таким образом, максимальное количество topics, которые могут быть включены в одну запись журнала, равно четырем.

Первый topic всегда является signature события с типами. Другими словами он представлен, как hash keccak(Transfer(address,address,uint256)). Таким образом для своих событий остается возможность добавить еще 3 параметра в topics.

В Solidity для того, чтобы указать, какой параметр необходимо добавить в topic используется ключевое слово indexed перед названием параметра. Например,

Transfer(address indexed from, address indexed to, uint256 value)

Получается, параметры параметры событий бывают двух типов:

1. indexed
2. non-indexed

Параметры с атрибутом indexed будут записаны в topic записи журнала EVM. Все остальные параметры автоматически становятся non-indexed и будут добавлены в специальную структуру данных(data) записи журнала EVM.

Для чего нужны indexed параметры?

Каждый indexed параметр создает topic. Этот параметр исключается из данных и не кодируется. По этому параметру можно обеспечить эффективный поиск. Для этого используются фильтры Блума.

P.S. Из цикла для приглашенных авторов.

Полную версию статьи можно почитать в репо команды MetaLamp. Добавляйте их wiki к себе в избранное и не пропускайте новые материалы.

#indexed #bloom #events
🔥41👏1