Semolina Code Solidity – Telegram
Semolina Code Solidity
549 subscribers
27 links
Канал про кодинг и крипту
Download Telegram
Шестой урок (Функции, транзакции, pure, view, payable, fallback)

Запустить hardhad
npx hardhat node

Плагин я не устанавливал. У меня hardhat по-умолчанию стоял в ремиксе

Код контракта
👍1
Седьмой урок (События, модификаторы, require/revert и тесты)

Мой код на гите - код с супер развернутыми комментариями
По сути даже урок на ютубе смотреть не надо чтобы понять что к чему

Код контракта
Код тестов
Судя по описанию - норм гайд
После окончания своего обучения по ютубу обязательно прочитаю этот
Если не понравится, удалю с канала
Forwarded from Max Wayld Dev (Max Wayld マキシ)
Статья с роадмапом по изучению Solidity за 30 дней.

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

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

Welcome к разбору:

>
https://teletype.in/@maxycrypto/solidity_30days

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

P.S: также, к концу этой недели выйдет моя ретроспектива по всем материалам для Solidity.
Восьмой урок (Древо Меркла, хэши, encode, циклы)

немного оптимизировал код, который заполняет хеши с индекса 4 (для начальной коллекции в 4 элемента)

То, что было:
uint offset = 0;
while (count > 0) {
for (uint i = 0; i < count - 1; i += 2) {
hashes.push(keccak256(
abi.encodePacked(
hashes[offset + i], hashes[offset
+ i + 1]
)
));
}
offset += count;
count /= 2;
}


То, что стало:
for (uint i = 0; i <= count + 1; i += 2) {
hashes.push(keccak256(
abi.encodePacked(
hashes[i], hashes[i + 1]
)
));
}

Убрал 1 цикл, убрал создание дополнительной переменной
Возможно для понимания проще код с урока, но мой будет работать быстрее и эффективней

Так же из функции verify убрал параметр index так как он там никак функционально не задействован

Мой код с комментариями
Гемная инфа на будущее
Тоже надо будет со всем этим ознокомиться после ютуба
Forwarded from Ortomich
Ретроспектива!

———————

EVM для задротов, часть 1 - https://teletype.in/@ortomich/EVM_Advanced_1

EVM для задротов, часть 2 - https://teletype.in/@ortomich/EVM_Advanced_2

EVM для задротов, часть 3 - https://teletype.in/@ortomich/EVM_Advanced_3

EVM для задротов, часть 4 - https://teletype.in/@ortomich/EVM_Advanced_4

EVM для задротов, часть 5 - https://teletype.in/@ortomich/EVM_Advanced_5

EVM для задротов, часть 6 - https://teletype.in/@ortomich/EVM_Advanced_6

———————

Погружение в Юнисвап - https://teletype.in/@ortomich/Uniswap_V3_deepdive_1

SeaPort - https://teletype.in/@ortomich/SeaPort_fast

Новый вид скама - https://teletype.in/@ortomich/new_scam

———————

MEV 1.1 - https://teletype.in/@ortomich/MEV_1.1

MEV 1.2 - https://teletype.in/@ortomich/MEV_1.2

Флэшботы: короли мемпула - https://teletype.in/@ortomich/flashbots_kings_of_the_mempool

———————

Легкий клиент - https://teletype.in/@ortomich/light_client_eth

Оммер блоки - https://teletype.in/@ortomich/Ommer_Block

Дерево меркла - https://teletype.in/@ortomich/Merkle_Tree

Сумбурный конспект по эфиру - https://teletype.in/@ortomich/ethereum_start

Memory / Calldata / Storage - https://teletype.in/@ortomich/memory_calldata_storage

Что такое веб3 - https://teletype.in/@ortomich/simple_web3

NFT мини техничка - https://teletype.in/@ortomich/NFT_mini_advanced

Ораклы - https://teletype.in/@ortomich/oracles_junior

Войс «Развитие в крипто дев» - https://news.1rj.ru/str/ortomich_crypto/402

Переминт - https://teletype.in/@ortomich/remint

Unix - https://teletype.in/@ortomich/unix_fast

Адреса ethereum - https://teletype.in/@ortomich/address_eth

———————

Мой гитхаб - https://github.com/ortomich
Девятый урок (Оптимизация смарт-контрактов и газ)
Мой код с комментариями
Десятый урок (Стрим: практика "Голандский аукцион")

Для урока потребуется установка:
npm install --save-dev solidity-coverage

Так же добавить в файл hardhat.config.js:
require("solidity-coverage");

После этого сможем использовать команду для измерения покрытия тестами
npx hardhat coverage

Далее можно в файл package.json в объект noscripts добавить строку:
"test": "npx hardhat coverage"
Это позволит писать:
npm test
вместо:
npx hardhat coverage

Так же в директории проекта можно найти папку coverage->index.html и смотреть покрытие тестами в браузерной версии (можно прям по строчкам проверять какая строчка сколько раз была вызвана)

Мой код контракта с комментариями
Мой код тестов
У меня не 100% покрытие тестами так как в контракте есть пара функций, которых нет в уроке
Можно использовать эту возможность как практику)
1
Одиннадцатый урок (Наследование, конструкторы, super, override, virtual)

Сложный урок для тех, кто не сталкивался с ООП, абстрактными классами итд
Мне помогло, то что я в своё время учил C++ и понимаю как это работает там
С++, кстати, был моим первым языком программирования
Я так же учил по ютубу на канале SimpleCode
Всем советую)
Если пройдете 155 уроков +-, вы не станете гуру конечно, но будете понимать что к чему в любом языке программирования

Opensource проект openzeppelin-contracts с готовыми базовыми контрактами от которых можно наследоваться

Мой код с комментариями
Двенадцатый урок (Интерфейсы, библиотеки, тесты)

Практика к тому, что уже изучено:
Сделать голосовалку, к примеру. У кого есть токены - тот может голосовать. Можно сделать ещё сложнее и совместить голосовалку с Timelock (видео есть про него на канале). То есть кто-то предлагает транзакцию и ставит в очередь, потом идёт голосование (с токенами), а через некоторое время, если нужное кол-во голосов набрано, то транзакцию можно выполнить

Код интерфейса
Код контракта Lesson, который реализует интерфейс
Код контракта Demo, который вызывает функции из сторонних контрактов
Код тестов контракта Demo
Код библиотек
Код с использованием библиотек
Код тестов использования библиотек
Тринадцатый урок (Стрим: реализация ERC20)

Практика к контракту: написать функцию, позволяющая владельцу списать вырученные средства за продажу токенов + тесты к ней

Запускаем hardhat
npx hardhat node

Команда для деплоя контракта в хардхет:
npx hardhat run path_to_deploy.js

добавляем сеть hardhat в метамаск:
Имя сети: hardhar
Новый URL-адрес RPC: http://127.0.0.1:8545/
ID цепочки: 1337
Символ валюты: ETH

Импортируем токены по адресу (берем из консоли после деплоя контракта)

Код интерфейса
Код контракта
Код тестов
Код деплоя
По сути, закончив этот урок, я своими ручками написал интерфейс ERC20, реализовал его в своём токене (токен получается свой создал), создал «магазин» где этот токен можно купить/продать и задеплоил это всё в тестовый блокчейн
Ну и с этим всем можно взаимодействовать через метамаск

Прикольное ощущение
Особенно когда понимаешь на практике, что почти любой токен и ваш баланс в нем - по сути «словарик» в одном из миллионов смарт контрактов
На эти 2 дня курс по солидити был поставлен на паузу так как готовил бесплатный мини-курс из 8 уроков "python с нуля для криптанов (и не только)"
Кидаю линк на чатик, в котором будут задаваться вопросы по курсу и в этот же чат будут скидываться сами уроки по python

Я понимаю, что сейчас как минимум половина подписчиков пришли из чата Money Flow, но скажу для потомков, что это гемный чат с Максом (@samege)
Макс, кстати, тоже будет проходить обучение)
Четырнадцатый урок (Фронт-энд на NextJS, часть 1)

Создаём next приложение с помощью команды
npx create-next-app

Код контракта
Код скрипта для деплоя

Разворачиваем hardhat
npx hardhat node

Деплоим контракт в hardhat:
npx hardhat run noscripts/deploy.js --network localhost

Не забываем добавить ethers в зависимости проекта next (файл package.json)
"ethers": "^5.6.4"

Далее создаем внутри проекта next директорию components и внутри неё файл ConnectWallet.js и NetworkErrorMessage.js
Код ConnectWallet.js
Код NetworkErrorMessage.js

В директории pages пишем файл index.js
Код этого файла

Когда всё готово, в директории next запускаем команду:
npm run dev

Если уже что-то делали в мм с аккаунтом в локальной сети, то переходим в мм -> settings -> advanced -> reset account

Чувствую, что придется подтянуть js (опять же по учебнику)
Ссылки на разделы, которые перечитываю по js буду скидывать сюда
Темы, которые я освежил по js:
Оператор нулевого слияния
Function Expression
Стрелочные функции, основы
Особенности JavaScript
Автоматическое тестирование c использованием фреймворка Mocha
Объекты
Копирование объектов и ссылки
Сборка мусора
Методы объекта, "this"
Конструкторы, создание объектов через "new"
Опциональная цепочка '?.'
Преобразование объектов в примитивы
Методы примитивов
Методы массивов
Деструктурирующее присваивание
Формат JSON, метод toJSON
Остаточные параметры и оператор расширения
Замыкания
Глобальный объект
Планирование: setTimeout и setInterval
Привязка контекста к функции
Повторяем стрелочные функции
Введение: колбэки
Промисы
Цепочка промисов
Async/await
Модули, введение
Экспорт и импорт
Разница npm/npx
Node JS - Быстрый Курс за 1 час
Полезные команды из видоса:
Запустить программу:
node filepath.js

Инициализация проекта (создание файла package.json):
npm init

Установка пакетов (в проекте создастся папка node_modules и название пакета добавится файл packege.json в поле Dependencies) :
npm install packagename
npm i packagename

Установка пакетов для разработки (тоже загрузит файл, но в файле packege.json будет находиться в поле devDependencies):
npm i packagename -D

Папку node_modules обычно никому не скидывают. Все зависимости устанавливаются автоматически с помощью команды:
npm i

Next JS быстрый курс SSR на React JS с нуля до деплоя
Полезные команды из видоса:
Создание Next приложения:
npx create-next-app

Создание проекта с нуля:
1) Инициализируем проект:
npm init -y
2) Устанавливаем зависимости:
npm i next react react-dom
3) В packege.json можем добавить быстрые команды на вкладке noscripts:
"dev": "next dev"
4) создаем папку pages в корне проекта (тут будут все страницы приложения) и обязательно файл pages/index.js
rsc - сниппет для развертывания компонента в index.js
5) Запуск приложения:
npm run dev

Если создать новый файл в pages, то доступ к этому файлу будет осуществляться по пути:
http://domain:port/filename

Чтобы переход между страницами был без обновления браузера, используем компонент
import Link from "next/Link";
<Link><a>...</a></Link>
так же для понимания того, что происходит в этом видосе, нужно хотя бы немного почитать документации:
MetaMask
Ethers JS
Пятнадцатый урок (Фронт-энд на Next.js, часть 2)

Устанавливаем set-interval-async в наш проект next.js

Документация по методу componentWillUnmount

Этот урок превратился в настоящую головную боль из-за того, что в ММ ID цепочки был указал 31337 (так по умолчанию hardhat работает)
Я постоянно вылетал на ошибку «cannot estimate gas» когда пытался что-то купить с аукциона
Как лечить:
заходим в файл hardhat.config.js
И туда добавляем настройку:
...
networks: {
hardhat: {
chainId: 1337
}
},
...


Ещё столкнулся с проблемой, что после покупки, на странице постоянно висело сообщение "auction stopped!"
То есть hardhat не очищался
npx hardhat clean не помогал
Вылечилось как-то само после того, как я редактировал контракт (надо будет еще изучить этот вопрос)

Далее я столкнулся с проблемой "Nonce too high. Expected nonce to be 0 but got 2. Note that transactions can't be queued when automining."
Эта проблема решилась с помощью ресета аккаунта (про это я писал тут)

Следующая проблема была: "Transaction ran out of gas"
Ну тут понятно - в мм ставим побольше газа и погнали

Ссылка из урока про обработку старых событий
Гит Ильи (хозяин ютуб канала, по которому я обучаюсь) с кодом для каждого урока

Код компонента TransactionErrorMessage
Код компонента WaitingForTransactionMessage
Код index.js с комментариями
👍1
Оказывается, если текст в телеге преобразовать в моноширинный, он станет синим 😳
🤔1
Семнадцатый урок (Низкоуровненые вызовы и безопасность)
Сразу скажу, что 16 урок я не пропустил
Я его посмотрел и он будет постом ниже. Просто я считаю, что лучше сначала пройти 17 урок и только потом 16 (так как в 16 уроке есть низкоуровненые вызовы и для их понимания нужно обязательно посмотреть урок 17)

На этот урок я потратил больше всего времени (но зато разобрался) так как в видео была небольшая неточность (сообщение с описанием проблемы оставил в чате автора)

Линки, которые помогли разобраться:
1) Delegatecall | Solidity 0.8
2) Unsafe Delegatecall (part 1) | Hack Solidity (0.6)
3) Unsafe Delegatecall (part 2) | Hack Solidity (0.6)

Плейлист, который в будущем точно надо будет чекнуть: Hack Solidity (0.6 - 0.7)

Код работы call
Код работы delegatecall
Код с примером небезопасного использования delegatecall (в начале файла написал как работает delegatecall в этом случае)
Шестнадцатый урок (Безопасность: Reentrancy, DoS)
Полезный линк из урока:
openzeppelin

Код контракта reentrancy
Код тестов для контракта reentrancy
Код контракта dos
Код тестов для контракта dos