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

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

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

Когда год назад, я для практики с 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
Function pointer как аргумент

Для начала посмотрите на код ниже:

contract FunctionPointer {

function f1(uint256 x) internal pure returns(uint256) {
return x;
}

function f2(function(uint256) internal pure returns(uint256) a) internal pure returns(uint256) {
return a(27);
}

function f3() public pure returns(uint256) {
return f2(f1);
}

}

В Solidity вы можете создавать функции, которые будут принимать другие функции в качестве аргументов. Они называются function pointer.

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

f2 функция с function pointer a ожидает в качестве аргумента функцию со специальной сигнатурой.

В f3 мы вызываем функцию f2 и передаем функцию f1, как параметр. И в данном примере она просто вернет число 27.

Достаточно необычный и редкий формат функций в смарт контрактах. Даже в конкурсных аудитах за все время я встречал их один или два раза.

#function #pointer
👍3🔥2
ERC-1363: Payable Token

Стандарт ERC-1363 реализует расширение токена ERC-20 для выполнения произвольного кода сразу после вызова transfer(), transferFrom() или approve() в рамках одной транзакции. Этот стандарт позволяет выполнить две транзакции в одной и избежать излишней оплаты за газ.

Важно! Стандарт ERC-1363 является расширением стандарта ERC-20 и полностью обратно совместимым. То есть, он не переопределяет стандартные функции transfer(), transferFrom() или approve().

Стандарт IERC1363.sol расширяет реализацию токена ERC-20 новыми функциями.

interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address to, uint256 amount) external returns (bool);
function transferAndCall(address to, uint256 amount, bytes calldata data) external returns (bool);
function transferFromAndCall(address from, address to, uint256 amount) external returns (bool);
function transferFromAndCall(address from, address to, uint256 amount, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 amount) external returns (bool);
function approveAndCall(address spender, uint256 amount, bytes calldata data) external returns (bool);
}

Работает это следующим образом: вызов любой из этих функций сначала выполняет вызов соответсвующей функции в ERC-20, а затем делает дополнительный вызов на адресе получателя токенов или кому выдавался approve(). Например, transferAndCall(), под капотом, делает стандартный вызов функции transfer(), а затем делает дополнительный вызов функции на адресе получателя токена.

Для выполнения кода после вызова transfer() или transferFrom() получатель токена должен быть контрактом и реализовывать интерфейс IERC1363Receiver.sol

interface IERC1363Receiver {
function onTransferReceived(address spender, address sender, uint256 amount, bytes ?calldata data) external returns (bytes4);
}

Репозиторий и документация с примерами реализации стандарта от Vittorio Minacori, который является автором стандарта ERC-1363: Payable Token

P.S. Про другие стандарты, такие как ERC-165 и ERC-4337 можно почитать в wiki от студии web3 разработки MetaLamp.

#erc1363 #token
👍2
RACE #22 Of The Secureum Bootcamp Epoch

Не теряйте, у меня очень много событий сейчас происходит, что времени остаётся только на основной курс и немного на конкурсные аудиты. С понедельника уже пойдем по Foundry.

А сейчас хочу предложить вам немного попрактиковаться с кодом и пройти небольшой тест Race. В этот раз его написал Tincho - ментор Secureum, создатель Damn Vulnerable DeFi и The Red Guild.

Мини тест, как всегда прекрасен!

RACE #22 Of The Secureum Bootcamp Epoch

У кого сколько получилось?

#race
👍2
Foundry с нуля: Установка. Часть 0

С сегодняшнего дня мы постепенно начинаем изучать Foundry на канале.

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

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


Как будет строиться прохождение?

Сначала пройдемся по документации Foundry, чтобы вы знали, что там представлено, и где найти информацию в случае необходимости. Поговорим об установке, о chisel и anvil, опишем некоторые cast команды и читкоды.

После этого уже приступим к самим тестам.

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

В целом, хочется чтобы получился детальный цикл постов "от А до Я".


Установка Foundry

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

Полный процесс установки можно найти по этой ссылке:

https://book.getfoundry.sh/getting-started/installation

Обычно установка может быть осуществлена с помощью простой команды:

curl -L https://foundry.paradigm.xyz | bash

Это установит FoundryUp - установщик Foundry, который после сможет обновлять и поддерживать среду с более простыми командами.

Нужно сказать, что FoundryUp пока не поддерживается терминалами CMD или PowerShell, которые идут в Windows, поэтому установка там чуть сложнее.

Для этого предусмотрен немного другой пошаговый гайд:

1. Скачиваем Rust и его пакетный менеджер Cargo:

https://www.rust-lang.org/learn/get-started

2. Скачиваем Visual Studio с опцией "Desktop Development With C++"

https://visualstudio.microsoft.com/downloads/

3. Ну, и Git Bash, если у кого еще нет:

https://gitforwindows.org/

После этого можно будет выполнить команду:

cargo install --git https://github.com/foundry-rs/foundry --profile local --locked forge cast chisel anvil

которая и установит Foundry на ваш компьютер.

P.S. Для слабых и средних по мощности компьютеров весь процесс может занять до 1,5 - 2 часов!

Также для пользователей Docker есть возможность установки Foundry с командой:

docker pull ghcr.io/foundry-rs/foundry:latest

Я сам не особо работал с Docker, поэтому более детальные гайды по нему можно прочитать тут:

https://book.getfoundry.sh/tutorials/foundry-docker

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

1. Создайте новую папку и откройте ее в редакторе кода;
2. В терминале редактора выполните команду: forge init
3. Если в папке появились файлы типа src, test, foundry.toml, то все ок. Если же нет - спрашивайте в чате совета или смотрите документацию.


Задание

1. Установить Foundry на свой компьютер.

#foundry #lesson0
🔥7👍41
Foundry с 0. Часть 1

Теперь давайте кратко поговорим о том, что установилось у нас вместе с Foundry.

Во-первых, это Cast - специальный инструмент для исполнения RPC вызовов в сети Эфириум.

RPC, от Remote Procedure Call, это протокол удаленного вызова процедур в Эфире: вы можете отправлять транзакции, делать вызовы в смарт контрактах, "доставать" какую-либо информацию из блокчейна - и все это с помощью командной строки в терминале!

Например, выполнив следующую команду:

cast call 0x6b175474e89094c44da98b954eedeac495271d0f "totalSupply()(uint256)" --rpc-url https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf
8603853182003814300330472690

мы узнаем значение totalSupply у токена DAI. И нам не потребуется посещать другие сайты или использовать API для выполнения этой задачи.

Cast командам будут посвящены отдельные посты, а сейчас пойдем дальше.

Во-вторых, у нас установился Anvil.

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

P.S. Некоторые антивирусы, например Касперский, ругаются на Anvil по какой-то причине. Поискав в сети, никаких претензий к Anvil по теме безопасности системы я не нашел, поэтому просто поставил его в "доверие" к антивирусу.

В-третьих, также загрузился Chisel.

Chisel - это продвинутый Solidity REPL (read-eval-print loop: программа, которая работает как командная оболочка).

Для меня самого Chisel остается некоторой загадкой, поэтому в свое время будем разбираться с ним вместе.

Если я правильно понимаю на данный момент, с Chisel вы сможете выполнять код Solidity прямо в терминале.

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

#foundry #lesson1
👍7🔥51
Foundry с 0: Cast команды. Часть 2

Сейчас существует достаточно большое количество Cast команд для самых разных задач: от простых запросов о получении баланса токена до работы с calldata и шифрованием.

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

Итак, мы можем открыть терминал и ввести команду:

cast help 

она покажет нам все доступные cast команды.

Тут стоит сделать отступление и уточнить, что для выполнения некоторых команд, нам потребуется специальная RPC ссылка для доступа к блокчейн сетям. Получить такую бесплатно можно на таких популярных проектах как Alchemy или Infura.

По сути, процесс получения ссылок у них похож: регистрируетесь на портале, ищите кнопку Get API key или похожую со словом API, и потом генерируется ваша индивидуальная ссылка для rpc запросов. Выглядит она примерно так:

https://mainnet.infura.io/v3/apiKey

apiKey - ваш уникальный api ключ, показывать который нежелательно никому.

Там же можно получить ссылку на различные сети: Ethereum, Optimism, Arbitrum и т.д.

Именно эту ссылку и нужно будет добавлять в конце наших cast команд.

Если вы работаете в редакторе кода, а не в обычном терминале, то есть возможность создать .env файл и поместить туда ссылки, создав для них специальные переменные среды, и уже их использовать в cast командах.

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


Chain команды

Итак, нам доступны три команды:

cast chain-id
cast chain
cast client

Первая выдаст нам номер блокчейна (например, для Эфириума - это 1, для Оптимизма - 10), вторая - название сети, третья - клиента, через который отправляются запросы (например, для Infura - клиент GETH).

Для того чтобы выполнить команду в консоли потребуется прописать:

cast chain-id --rpc-url link

где вместо link - указать вашу ссылку rpc, которую мы получали выше.

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


Block команды

Всего на данный момент их шесть:
https://book.getfoundry.sh/reference/cast/block-commands

1. cast find-block
2. cast gas-price
3. cast block-number
4. cast basefee
5. cast block
6. cast age


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

cast find-block 1609459200

покажет блок, который был ближе всего к Новому Году 2021.

Обратите внимание, что время указывается в формате unix (количество секунд прошедшее с момента 1 января 1970 года).

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

cast gas-price --rpc-url link

Третья - последний на данный момент блок:

cast block-number --rpc-url link

Четвертая - basefee блока (кто не знает, что это, то почитайте про Лондонское обновление):

cast base-fee blockNum --rpc-url link

blockNum - это номер блока, basefee которого нам нужно получить. Вместо числа - 1, 443, 2343242 - можно указать одно из теговых значений: earliest, finalized, safe, latest или pending. По умолчанию идет latest.

Пятая - получение информации о блоке, например:

cast block finalized --rpc-url link

Тут также можно указывать номер блока числом или одним из тегов:
earliest, finalized, safe, latest или pending.

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

Получить информацию о конкретном поле можно с помощью модификации команды, а именно добавления --field опции:

cast block latest -f hash --rpc-url link  

Ну, и шестая команда служит для получения timestamp блока:

cast age blockNum --rpc-url link

где blockNum это номер блока или его теговое значение.

Дальше мы продолжим говорить о командах cast и разберем другие примеры.


Задание

1. Зарегистрироваться на Alchemy или Infura;
2. Получить rpc ссылку;
3. Попробовать несколько команд из поста;
4. Настроить .env файл для rpc ссылок;

#foundry #cast #block #chain #lesson2
👍5🔥5
Foundry с 0. Часть 3

Продолжаем узнавать разнообразие cast команд и сегодня поговорим о тех, что помогают работать с аккаунтами, кошельками и транзакциями, и, на закуску, узнаем, как получить source код контракта с Etherscan.


Account команды

На данный момент существуют 6 команд cast для работы с аккаунтами:

1. cast balance - позволяет узнать количество нативных токенов сети на аккаунте в wei. Тут, кстати, можно уточнить номер блока, на момент которого был тот или иной баланс. Полная команда выглядит так:

cast balance account --block blockNum --rpc-url RpcUrl

2. cast storage - крутая команда, чтобы получить значения в storage контракта. Можно уточнить слот, в котором лежит значение, и скастовать информацию только из него. Например для WETH контракта:

cast storage 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0

или просто

cast storage 0x5Af0D9827E0c53E4799BB226655A1de152A425a5

3. cast proof - получение storage proof аккаунта. Не очень понял, что каких целей это может потребоваться. С этой командой вы получить proof таких полей как: accountProof, account address, account balance, codeHash, nonce, storageHash, storageProof, storageProof.key, storageProof.proof, storageProof.value.

Если при написании тестов нам будут требоваться эти команды, мы обязательно вернемся к ним и разберем подробнее.

4. cast nonce - тут все просто, получаем nonce аккаeнта, команда предельно простая:

cast nonce account

5. cast code - получение байткода контракта. Пример с Weth:

cast code 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

6. cast codesize - получение runtime bytecode size контракта.

P.S. В большинстве команд, где запросы идут в сеть, нужно добавлять свою rpc-url!

Теперь несколько слов о командах для работы с кошельком.


Wallet команды

1. cast wallet new
- создать новый кошелек: адрес и приватный ключ.

2. cast wallet address - конвертация приватного ключа в адрес кошелька. Интересная команда, которая принимает достаточно большое количество опций для генерации адреса: на основе приватного ключа, mnemonic derivation path, mnemonic passphrase, обычного mnemonic. При этом вы также можете указывать, где хранится ключ, который нужно использовать для генерации адреса.

Самая простая команда звучит так:

cast wallet address --private-key PRIVATE_KEY

весь список опция можно найти тут:

https://book.getfoundry.sh/reference/cast/cast-wallet-address

3. cast wallet sign - с ней вы можете подписать сообщение с вашего кошелька. Также, помимо приватных ключей, можно использовать mnemonic опции. Простая команда выглядит так:

cast wallet sign --private-key PRIV_KEY "hello"

4. cast wallet verify - раз можно подписать сообщение, то есть возможность и проверки этого действия. С этой командой можно проверить адресата подписанного сообщения. Команда:

cast wallet verify --address account --address addressMessageSignature

5. cast wallet vanity - интересная команда, которая позволяет сгенерировать адрес по специальным критериям: с определенным окончанием или началом, или nonce. Выглядит так:

cast wallet vanity --ends-with beef

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

Далее несколько команд для работы с транзакциями.


Transaction команды

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

1. cast receipt - получения "чека" о транзакции. Потребуется указать хэш транзакции:

cast receipt TX_HASH

2. cast tx - похожая на первую и выдает информацию о транзакции.

cast tx TX_HASH

3. cast-estimate - с ней можно оценить стоимость проведения транзакции по газу. Также можно указать, если с ней потребуется переслать нативную валюту, типа Эфира. Команда немного сложнее предыдущих и выглядит так:

cast estimate 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 --value 0.1ether "deposit()" --rpc-url rpcUrl

0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 - адрес контракта, куда пойдет вызов, value - количество отправляемого с транзакцией Эфира, deposit - функция, которую будем вызывать.

Вместо deposit - вы можете вставить calldata с селектором вызываемой функции и аргументами для нее.
👍71🔥1
4. cast run - команда, которая позволяет эмулировать транзакцию из сети на своей локальной сети, и расписать все traces (ее пути). Полезна для дебаггинга, поэтому будем обращаться к ней позже.

5. cast call - еще одна команда, которая сильно поможет при дебаггинге транзакций, так как выполняет вызов на адрес без публикации транзакции в сети. Много опций для тонкой настройки. Вернемся к ней в соответствующем уроке - посте.

6. cast publish - команда для публикации в сети предварительно подписанной транзакции. Выглядит так:

cast publish --rpc-url RPC TX  

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

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

Ну, и последняя на сегодня, команда для получения кода контракта прямо с Etherscan. Тут вам потребуется предварительная регистрация на ресурсе и получение специального кода API. Команда выглядит так:

cast etherscan-source 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2  --etherscan-api-key ETHERSCAN_API_KEY 

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

Завтра поговорим о cast командах для работы с ABI и другие полезные инструменты.

#foundry #cast #lesson3
👍6🔥1
Foundry с 0. Часть 4

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


ABI команды

1. cast abi-encode / cast abi-decode
- шифрует или расшифровывает данные. Например:

cast abi-encode "someFunc(address,uint256)" 0x... 1 234

cast abi-decode "balanceOf(address)(uint256)" 0x000000000000000000000000000000000000000000000000000000000000000a

2. cast 4byte - можно получить функцию по селектору.

cast 4byte 0x8cc5ce99

3. cast 4byte-decode - расшифровать функцию и ее аргументы из calldata:

cast 4byte-decode 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d00000000000000000000000000000000000000000000000000174b37380cea000

4. cast 4byte-event - получить функцию event из calldata

cast 4byte-event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

5. cast calldata - создать calldata из функции и аргументов. Например,

cast calldata "someFunc(address,uint256)" 0x... 1

6. cast calldata-decode - расшифровать calldata

cast calldata-decode "transfer(address,uint256)" 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d0000000000000000000000000000000000000000000000000008a8e4b1a3d8000

7. cast-pretty-calldata - еще одна команда для расшифровки calldata, например:

cast pretty-calldata 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d00000000000000000000000000000000000000000000000000174b37380cea000


8. cast upload-signature / cast sig - получить селектор функции:

cast upload-signature 'function approve(address,uint256)'

можно указывать несколько подряд

9. cast keccak - получить зашифрованные через keccak256 данные.

cast keccak abcsdfg

10. cast compute-address - сгенерировать адрес на основе nonce и адреса деплоера, например:

cast compute-address --nonce 0 --rpc-url yourUrl

11. cast create2 - создать адрес через опкод creat2.

12. cast interface - создать интерфес контракта из ABI:

cast interface -o IWETH.sol 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

Также можно использовать ABI с Etherscan, но для этого придется получать API и использовать дополнительную опцию --etherscan-api-key.

13. cast max-int / cast min-int / cast max-uint - получение максимальных значений uint256 / int256.


Команды для конвертации данных

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

Итак, вы можете конвертировать:

1. Бинарные данные в hex;
2. Fixed point number в integer;
3. Расшифровывать RLP данные;
4. UTF8 text в hex;
5. Количество wei в Эфир;
6. Получать адрес из bytes32;
7. Получать строку из bytes32;
8. hex в строку ASCII;
9. Из hex в числа;
10. Из hex в bytes32;
11. Из hex в RLP;
12. Совершать побитовые операции со сдвигом влево-вправо;

Полные список команд можно найти по ссылке:
https://book.getfoundry.sh/reference/cast/cast-shl

Крайне рекомендую попробовать поработать со всеми командами в свободное время, чтобы понять, как это все работает и привыкнуть работать с cast.


Задание

1. Попробовать выполнить 10 разны команд cast.

#foundry #cast #lesson4
👍111
Foundry с 0. Chisel. Часть 5

Сегодня, наконец, поговорим о Chisel.

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

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

Итак, chisel появляется у нас в системе вместе с установкой Foundry. Это также опенсорсный продукт, который разрабатывается, как я понял, сообществом, а не какой-либо коммерческой компанией.

Для того, чтобы начать с ним работать, достаточно открыть терминал и написать команду

chisel

Мы войдем в режим работы программы.

Все доступные команды можно посмотреть, как это обычно бывает, с помощью

chisel !help

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

Из списка не особо понятно, что может делать chisel и как с ним обращаться, поэтому дадим несколько примеров.

1. Математические операции

С chisel можно выполнять не только математические операции, но также и побитовые.

Очень удобно получать значения вычислений побитовых сдвигов влево / вправо, или такие как "побитовое И" или "побитовое ИЛИ".

Достаточно в терминале написать запрос операции, типа:

100 ^ 4 
100 << 5

Единственное то, нужно быть аккуратными с делением, так как программа эмулирует работу с Solidity. Например, если попытаться выполнить операцию 3/2, то chisel не покажет результата.

2. Работа с ABI

Вы также можете получать зашифрованные данные через abi.encode и keccak256. Например,

abi.encode(256, bytes32(0), "Chisel!")

или

keccak256(abi.encode(256, bytes32(0), "Chisel!"))

Что классно с chisel, так это то, что он показывает, как это будет храниться в памяти (memory) с указание на поинтеры.

Например, команда выше с abi.encode покажется как:

├ Hex (Tuple Encoded):
├─ Pointer ([0x00:0x20]): 0x0000000000000000000000000000000000000000000000000000000000000020
├─ Length ([0x20:0x40]): 0x00000000000000000000000000000000000000000000000000000000000000a0
└─ Contents ([0x40:..]): 0x000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000743686973656c2100000000000000000000000000000000000000000000000000

3. Переменные в chisel

В chisel можно создавать свои переменные и позже работать с ними. Например, вы можете создать переменную:

uint a = 1;

А потом попробовать выполнить математическую операцию, типа:

uint b = a << 0x08;

4. Функции и контракты

В chisel вы также можете создавать полноценные контракты и функции в них, а позже отслеживать пути работы!

Создадим простейший контракт прямо в терминале:

contract Test {
function get() external view returns (uint) {
return 256;
}
}

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

Test t = new Test()

Теперь мы можем обращаться к контракту, вызывая функции из него:

t.get()

Более того, если мы добавим !traces перед вызовом функции, то сможем получить расшифровку "пути" вызова! Не большой аналог -vvv при тестах в Foundry, кто знает.

5. Получение интерфейсов контрактов с Etherscan

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

!fetch 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 IWETH

тут мы указываем адрес контракта, интерфейс которого хотим скачать и название для файла, который будет создан для этого.
👍3🔥1