Semolina Code Solidity – Telegram
Semolina Code Solidity
549 subscribers
27 links
Канал про кодинг и крипту
Download Telegram
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
Семнадцатый урок (Решение задач Ethernaut)
Урок посвящен практике
Так что решаем её тут
Несколько дней точно уйдёт на это

Во время решения задач пришлось подтянуть эти темы:
1) tx.origin
2) self.destruct()
3) Работа со слотами ethers.provider.getStorageAt(...)
4) Байт код (посмотреть длину байт кода можно с помощью
msg.sender.code.length
Если в контракте есть переменные и функции, то длина будет > 0
Но если все действия делаются в конструкторе, то длина байт кода будет = 0
5) Битовые операции (&, |, ^, ~)
6) Фунция abi.encodePacked() для преобразования address->bytes
7) Оказывается, что преобразование типов
uint64->uint32 работает не самым очевидным способом (uint64 переводятся в 16-ую систему счисления и для того, чтобы перевести в uint32, просто обрезается половина битов СЛЕВА и то, что получилось, преобразуется в 10-ую систему счисления. Но когда преобразуем байты bytes2->bytes1 происходит наоборот: обрезаются байты СПРАВА)
8) Следующий момент по поводу преобразования байтов (нашел тут в одном из ответов):
"Thereby if you have something bytes32 and want it to be uint128, you first have to explicitly convert it to bytes16, and therafter can convert it to uint128, via regular solidity. Of course, you'll wish to debug/test to see which parts of that bytes32 may get truncated yourself before proceeding with this, as there's converse cases where it may make more sense to convert it to uint256 first and then cut it down to uint128."
Если коротко: то когда мы хотим преобразовать bytes->uint мы должны это сделать так, чтобы размерность uint была в 8 раз больше или в 8 раз меньше размерности байт
9) All about Bytes

Решение задач, которые не были разобраны на уроке:
Elevator
Gatekeeper One до этого я тут писал, что нихрена не понял. Но в итоге с байтами разобрался (в пунктах 5-9 сверху можно найти всю информацию). В итоге получился вот такой код с решением (решение, которое по ссылке тут - не работает). Ну и еще я не понял пока что как пройти gateTwo (проверка газа)
👍1
Вижу тут новые лица и всех рад приветствовать)
Изучение солидити на некоторое время поставлено на паузу так как сейчас появилось несколько проектов проектов, которые требуют моего активного участия чуть ли не 24/7
1 из таких проектов - бесплатные курсы по python (если вы начинающий разработчик, то начинать с солидити - не самая лучшая идея)
А вот в том бесплатном курсе по python мы изучаем не только синтаксис python, но и программирование в целом (на примере языка python) с нуля до парсинга за месяц
В том чате есть теория, практика, разбор практики, а так же я там отвечаю на все вопросы подряд (так что не стесняйтесь задавать ЛЮБЫЕ вопросы)
Welcome!!
🔥12
Как я уже говорил, я сейчас немного отошел от солидити так как появились проекты, требующие моей 100% отдачи
Сейчас наткнулся на одну очень интересную тему, которая скорее всего сильно стрельнет в ближайшие пару лет
Тема эта - gRPC (Remote Procedure Calls) - альтернатива REST API
Почему это стрельнет и почему многие сервисы пересядут именно на gRPC?
1) Потому что gRPC использует для передачи данных бинарный формат Protobuf (следовательно можно уменьшить размер сообщения и ускорить передачу данных в 7-10 раз)
2) gRPC использует протокол HTTP 2 вместо HTTP 1.1 (следовательно стримить потоки данных значительно легче)
3) Есть автоматическая генерация кода для популярных ЯПов из простого файла .proto (что позволяет быстро и просто развернуть сервер и клиента)
4) Многие компании, предоставляющие апи, переходят на микросервисную архитектуру, а используя gRPC можно очень легко разрабатывать эти микросервисы с хорошим уровнем абстракции (хоть на разных ЯПах их писать можно)
В любом случае все программисты будут когда-то взаимодействовать с апи, но так как скоро многие сервисы перейдут на gRPC (google, netflix уже перешли, из российских компаний - тинькофф предоставляет OpenAPI через gRPC и я уверен, что кто-то еще есть) поэтому с этой темой нужно хотя бы ознакомиться
Вот есть видео для супер поверхностного понимания
А вот официальная документация от гугл с описанием языка proto3 и с туториалами на основных языках
🔥134👍4😁1