Выход в настоящую сеть
оценку ставят на защите
Выдаётся после лекции 3. Срок — 7 сентября, 10:00. Последняя домашка курса.
Три занятия всё происходило внутри класс-чейна: кошелёк за тебя хранил сервис, код писал помощник, монеты ничего не стоили. Эта домашка выводит наружу — в Sepolia, тестовую сеть Ethereum. Она устроена как настоящая: те же кошельки, те же инструменты, тот же обозреватель, что у людей, которые этим занимаются каждый день. Отличие одно: эфир в ней тестовый, его раздают бесплатно.
Задача — проделать полный путь разработчика и оставить в сети след, который мы проверим: кошелёк → тестовый эфир → Remix → деплой → верификация → вызовы → whitepaper. Пошаговый гайд по каждому инструменту — в приложении внизу страницы.
Поставь MetaMask (расширение браузера) и создай кошелёк. Двенадцать слов — запиши на бумагу: это и есть ключ, восстановить его никто не сможет, включая нас. Переключи сеть на Sepolia.
Адрес у тебя один во всех сетях Ethereum — это следствие того, что адрес выводится из ключа, а не выдаётся сетью.
За каждую запись в сети платят. Эфир для Sepolia дают краны — два рабочих:
- Кран Google Cloud — 0,05 ETH в сутки на аккаунт Google. Хватит на всё задание.
- PoW-кран pk910 — эфир надо намайнить в браузере: то же, что ты делал на лекции 3, только за настоящий тестовый эфир. Медленнее, но без аккаунта.
Если оба не сработали — напиши преподавателю адрес, он переведёт.
Remix — браузерная среда разработки, в которой пишут и деплоят большинство учебных и немало боевых контрактов. Возьми свой контракт из мастерской (или напиши новый, простой), вставь в Remix, скомпилируй той же версией, что в pragma, и задеплой в Sepolia через MetaMask.
MetaMask покажет транзакцию перед подписью: сколько газа, какая плата. Подписал — подожди подтверждения, скопируй адрес контракта из «Deployed Contracts» и хеш транзакции из MetaMask.
Что менять в контракте из мастерской: там CLASS был родной монетой чейна, здесь родная — ETH. msg.value и payable работают так же, только единица другая. Импорты OpenZeppelin в Remix подхватываются сами.
Найди свой контракт на sepolia.etherscan.io. По адресу лежит байткод — его никто не прочтёт, и вкладка «Contract» пустая. Верификация — публикация исходника: после неё любой человек читает код, а вкладки «Read Contract» и «Write Contract» позволяют звать функции прямо с сайта, без Remix. Так контракт становится продуктом, а не просто адресом.
Способ без ключей: в Remix плагин Contract Verification → Sourcify. Способ через Etherscan: на странице контракта «Verify and Publish» — та же версия компилятора и тот же исходник.
Позови функции своего контракта два-три раза со своего кошелька. Потом попроси одноклассника позвать хотя бы одну со своего адреса — через «Write Contract» на Etherscan. Ему нужен свой тестовый эфир на газ; если у него нет — переведи со своего, это тоже транзакция.
Сохрани хеши всех вызовов: они идут в сдачу.
Найди транзакцию деплоя на Etherscan и выпиши в whitepaper: номер блока, кто его собрал (Fee Recipient), базовую плату, чаевые, сколько сожжено. Это ответ на вопрос первой лекции — кто записал твой пакет и что он за это получил, — только теперь на живой сети.
Страница текста про твой продукт, по которой посторонний человек поймёт замысел:
- Какую задачу решает и для кого.
- Как работает по шагам: кто какую функцию зовёт, что записывается, кто кому платит.
- Где лежат деньги и кто может их забрать.
- Три способа сломать или обмануть — свои, не из головы помощника.
- Разбор пакета с деплоем (из части 5).
- «Что делал LLM, что делал я, где LLM ошибся» — обязательный раздел, как в первых двух домашках.
Тот же SDK и тот же вход, что в первых двух домашках:
pip install https://defilab.insights-forge.com/sdk/defilab-0.1.5-py3-none-any.whlfrom defilab import Lab
lab = Lab("https://api.defilab.insights-forge.com",
class_code="КОД_КЛАССА", name="Твоё Имя", pin="твой PIN")
r = lab.hw.submit(3,
parts={"wallet": "0x…", # твой адрес в MetaMask
"contract": "0x…", # адрес контракта в Sepolia
"deploy_tx": "0x…", # хеш транзакции деплоя
"tx": ["0x…", "0x…", "0x…"], # хеши вызовов, включая чужой
"name": "как называется продукт"},
report_md=open("whitepaper.md").read(),
files=[{"path": "Contract.sol", "content": open("Contract.sol").read()}])
print(r["testnet"])Ответ на submit содержит проверку в Sepolia: есть ли код по адресу, твой ли деплой, опубликован ли исходник, прошли ли вызовы и был ли среди них чужой. Что не сошлось — написано словами. Исправил — сдай ещё раз; на странице домашки то же самое видно кнопкой «проверить».
Письменно, 15 минут, как раньше: lab.hw.defense_start(3), затем lab.hw.defense(3) и lab.hw.defense_say(text, n=3). Экзаменатор спрашивает по whitepaper и коду, просит объяснить цифры твоего пакета и даёт одну живую правку под таймером. Оценку подтверждает преподаватель.
- Объясняет, что делает контракт, по шагам и на языке вызовов: кто зовёт функцию, что записывается в память, кто кому и сколько платит.
- Знает, где в контракте лежат деньги и кто может их забрать: владелец, любой, никто.
- Три способа сломать или обмануть — конкретные, со строкой кода, хотя бы один найден сам.
- Объясняет, что делали чужие вызовы из
parts.testnetи почему они прошли.
- Кошелёк: что такое двенадцать слов, почему адрес один во всех сетях, что будет при потере.
- Кран и плата: за что платится газ, откуда взялась цена деплоя в MetaMask, почему тестовый эфир бесплатный, а транзакция всё равно стоит.
- Верификация: что лежало по адресу до неё и что изменилось после; зачем публиковать код.
- Живая правка под таймером в своём контракте: «сделай так, чтобы вывести мог только тот, кто вносил», «добавь срок, до которого забрать нельзя», «ограничь сумму долей баланса» — в нужном месте, компилируется, меняет поведение, не переписывает файл целиком.
- По цифрам своего деплоя: кто собрал блок, сколько сожжено, сколько ушло сборщику, почему разделено именно так; почему транзакцию нельзя подменить задним числом.
- Где в его проекте цена или обмен и что будет, если монет на другой стороне не окажется.
- Что произойдёт с памятью контракта, если платы не хватит на середине функции, и кто останется с деньгами.
- Whitepaper читается посторонним: задача, участники, шаги, деньги — без общих слов.
- Раздел про LLM заполнен честно: граница «я / инструмент» проходит по фактам.
Читать по порядку: каждый шаг опирается на предыдущий. В каждом — что это за вещь и какую проблему решает, как устроена, что сделать руками и как проверить, что получилось. Названия кнопок — как в интерфейсе.
Карта пути: ключ → адрес → сеть → эфир на плату → код → байткод в сети → адрес контракта → транзакции к нему → обозреватель, где всё это видно.
1. Ключ и кошелёк
Проблема. В классе твой ключ хранил наш сервис: ты нажимал кнопку, сервис подписывал. В настоящей сети никакого «нашего сервиса» нет. Подписывать транзакции должен ты сам, значит, ключ должен лежать у тебя.
Как устроено. Ключ — большое случайное число. Из него вычисляется публичный ключ, из публичного — адрес 0x… (сорок шестнадцатеричных знаков). В обратную сторону не вычисляется: адрес знают все, ключ — только ты. Двенадцать слов, которые покажет кошелёк, — это тот же ключ, записанный словами из фиксированного словаря, чтобы его можно было переписать на бумагу без ошибок. Кто знает слова — владеет всем, что лежит на адресе. Восстановить потерянные слова нельзя никому: сеть не знает, кто ты, она знает только подписи.
Кошелёк (MetaMask) — программа, которая хранит ключ и по твоей команде подписывает транзакции. Пароль, который она попросит, — от программы на этом компьютере. Это не ключ: с другого компьютера ты войдёшь только по двенадцати словам.
Адрес один во всех сетях Ethereum — потому что он вычисляется из ключа, а не выдаётся сетью.
Что сделать.
- metamask.io → «Download» → расширение для своего браузера.
- «Create a new wallet» → пароль от расширения.
- «Secure my wallet» → Secret Recovery Phrase: двенадцать слов. Перепиши на бумагу в том же порядке. Никому не отправляй, включая «поддержку» — её у MetaMask нет, а кто просит слова, тот хочет твой кошелёк.
- Подтверди фразу словами по порядку.
Проверка. Вверху расширения — имя аккаунта и адрес 0x…. Нажми на адрес — скопируется. Это тот адрес, который пойдёт в сдачу.
2. Сети: основная и тестовая
Проблема. В основной сети Ethereum эфир стоит настоящих денег, а ошибка в контракте — это потерянные деньги, и переписать реестр нельзя. Учиться там дорого.
Как устроено. Тестовая сеть — та же программа, тот же формат транзакций, те же кошельки и инструменты, но отдельный реестр и эфир, который раздают бесплатно. Sepolia — главная тестовая сеть Ethereum сейчас. У каждой сети есть номер (chain id): у основной 1, у Sepolia 11155111. Номер входит в подпись каждой транзакции, поэтому транзакцию из тестовой сети нельзя повторить в основной — подпись не сойдётся.
Кошелёк показывает баланс *в выбранной сети*. Один и тот же адрес в Mainnet и в Sepolia — два разных баланса.
Что сделать. Кружок сети слева вверху (там написано «Ethereum Mainnet») → переключатель «Show test networks» → выбрать Sepolia.
Проверка. Вверху написано Sepolia, баланс — 0 SepoliaETH.
3. Эфир и плата за запись
Проблема. Каждая запись в реестр исполняется тысячами узлов и хранится вечно. Если записи бесплатные, сеть забьют мусором за час. Поэтому за каждую запись платят — и в тестовой сети тоже, иначе тестовую сеть забьют так же. Разница в том, что тестовый эфир раздают.
Как устроено. Плата считается в газе: каждая операция контракта стоит фиксированное число единиц газа (это была лекция 3), а цена единицы в эфире зависит от загрузки сети. Деплой простого контракта — 200–800 тысяч газа, вызов — 30–100 тысяч. В Sepolia цена газа обычно 1–10 gwei (миллиардных долей эфира), так что деплой стоит 0,0005–0,005 ETH.
Кран — сайт, который переводит немного тестового эфира на адрес. Раздавать без ограничений нельзя: кто-нибудь выкачает всё и начнёт продавать или спамить. Поэтому краны требуют либо аккаунт (Google), либо работу — PoW-кран заставляет браузер перебирать хеши, как ты делал на лекции, и платит пропорционально найденному. Это тот же принцип, что у майнинга: доказательство потраченного усилия вместо доказательства личности.
Что сделать. Один из двух:
- Кран Google Cloud: cloud.google.com/application/web3/faucet/ethereum/sepolia → войти аккаунтом Google → вставить адрес → «Receive 0.05 Sepolia ETH». Приходит за минуту, раз в сутки.
- PoW-кран: sepolia-faucet.pk910.de → вставить адрес → «Start Mining». Счётчик растёт; когда набралось больше минимума, написанного на странице, — «Stop Mining» → «Claim Rewards». Полчаса на ноутбуке дают 0,02–0,05 ETH.
0,05 хватает с запасом — на деплой, десяток вызовов и перевод одноклассник на его вызов. Оба крана не дали — напиши преподавателю адрес.
Проверка. Баланс в MetaMask в Sepolia стал ненулевым. Если ноль — проверь, что выбрана Sepolia, а не Mainnet.
4. Remix: из кода в байткод, из байткода в сеть
Проблема. Сеть не понимает Solidity. Она исполняет байткод — набор инструкций для виртуальной машины. Нужно превратить код в байткод и положить его в реестр так, чтобы у него появился адрес.
Как устроено. Компилятор берёт .sol и выдаёт две вещи: байткод и ABI — описание функций (имена, аргументы, типы), по которому кошельки и сайты узнают, как звать контракт. Деплой — это обычная транзакция, у которой нет получателя, а в поле данных лежит байткод. Сеть исполняет конструктор и сохраняет результат по новому адресу. Адрес вычисляется из твоего адреса и номера транзакции, поэтому Remix знает его ещё до подтверждения.
Remix — среда разработки в браузере: редактор, компилятор и кнопка деплоя. Сам он ничего не подписывает: в режиме «Injected Provider» он передаёт транзакцию в MetaMask, и подпись ставишь ты. В классе то же делал помощник, здесь — ты руками.
Что сделать.
- remix.ethereum.org. Слева иконки: File explorer, Solidity compiler, Deploy & run.
- File explorer → папка
contracts→ правой кнопкой «New File» →MyContract.sol. Вставь код — свой из мастерской или новый. Импорты@openzeppelin/contracts/…Remix скачает сам. Что поменять в контракте из мастерской: там родной монетой былCLASS, здесь — ETH.msg.valueиpayableработают так же, единица другая. - Solidity compiler → «Compiler» — версия та же, что в
pragma(для^0.8.20подойдёт 0.8.20 и выше) → «Compile MyContract.sol». Зелёная галочка на иконке — собралось; ошибки внизу, красным, с номером строки. - Deploy & run → «Environment» → Injected Provider – MetaMask. MetaMask попросит подключить сайт — «Connect». Под полем Environment должно стоять
Custom (11155111) network— номер Sepolia. Другой номер — переключи сеть в MetaMask. - «Contract» — выбери свой контракт (в файле с импортами их несколько, нужный не обязательно первый). Параметры конструктора — поля рядом с кнопкой «Deploy».
- «Deploy». MetaMask покажет окно: сколько газа, какая плата в ETH. Это и есть цена записи — «Confirm».
- Через 15–30 секунд внизу Remix, в «Deployed Contracts», появится контракт с адресом. Скопируй его (иконка рядом с именем).
- Хеш транзакции деплоя: MetaMask → «Activity» → «Contract deployment» → «View on block explorer»; или в консоли Remix внизу — строка
transaction hash.
Позвать функцию из Remix: раскрой контракт в «Deployed Contracts». Оранжевые кнопки меняют состояние — это транзакция, MetaMask попросит подпись. Синие только читают — бесплатно, без подписи. Если функция payable, сумма вводится в поле «Value» выше, единицы (wei / gwei / ether) выбираются рядом.
Проверка. У тебя два значения: адрес контракта 0x… (40 знаков) и хеш транзакции 0x… (64 знака). Оба идут в сдачу.
5. Обозреватель: где сеть видна человеку
Проблема. Реестр — это байты на тысячах узлов. Чтобы человек мог посмотреть «что лежит по адресу» и «прошла ли моя транзакция», нужен сайт, который читает реестр и показывает его страницами.
Как устроено. Обозреватель (Etherscan) держит собственную копию сети и индексирует её: адрес → все его транзакции, транзакция → блок, отправитель, плата, результат. Он ничего не меняет и ничего не решает — только показывает. Всё, что ты там видишь, видит любой человек в мире.
На странице транзакции — те самые вещи из лекции 1, только с настоящими именами:
- Block — номер пакета, в который попала запись.
- Fee Recipient — кто собрал пакет (в Sepolia это валидатор; в классе это был ты или сосед).
- Transaction Fee — сколько ты заплатил.
- Под «More Details» → «Click to show more»: Gas Fees — Base (базовая цена единицы газа, её назначает сеть по загрузке) и Max Priority (чаевые, которые ты предложил сборщику); Burnt Fees — базовая часть платы уничтожается, а не достаётся никому. Сборщик получает только чаевые. Так сделано, чтобы сборщики не могли завышать базовую цену себе в карман.
Что сделать. sepolia.etherscan.io → вставь адрес контракта в поиск. Вкладка Transactions — все вызовы: кто, когда, какой метод, прошло ли (галочка или «Fail»). Первая снизу — деплой. Открой её и выпиши в whitepaper: номер блока, Fee Recipient, Base, Priority, Transaction Fee, Burnt Fees.
Проверка. Вкладка Contract на странице контракта: сейчас там байткод — длинная строка шестнадцатеричных знаков. Это то, что реально лежит в сети. Следующий шаг это исправит.
6. Верификация: опубликовать исходник
Проблема. По адресу лежит байткод. Из него нельзя восстановить исходник, значит, никто не может прочитать, что контракт делает, а обозреватель не знает имён функций, чтобы дать их позвать. Контракт есть, а пользоваться им нельзя — только тому, у кого есть исходник и Remix.
Как устроено. Ты отправляешь исходник и настройки компилятора (версию, флаг оптимизации) сервису верификации. Он компилирует их сам и сравнивает результат с байткодом в сети байт в байт. Сошлось — исходник опубликован рядом с адресом с пометкой «verified»: теперь любой видит код, а обозреватель показывает вкладки Read Contract и Write Contract, через которые функции зовут прямо с сайта. Не сошлось — версия или настройки отличаются от тех, с которыми деплоил.
Баз верификации две: Sourcify (открытая, без регистрации, туда умеет отправлять Remix) и Etherscan (своя). Проверка домашки принимает любую.
Что сделать — один из двух способов.
Через Remix, без регистрации: менеджер плагинов (иконка вилки слева внизу) → найти «Contract Verification» → «Activate». В плагине: сеть Sepolia, адрес контракта, контракт из скомпилированных, параметры конструктора, если были → отметить Sourcify → «Verify». Etherscan там попросит ключ API — пропусти.
Через Etherscan: страница контракта → вкладка «Contract» → «Verify and Publish» → Compiler Type «Solidity (Single file)», версия компилятора та же, что в Remix, лицензия MIT → «Continue» → вставить исходник целиком, Optimization «No» (если не включал в Remix) → «Verify and Publish». С импортами OpenZeppelin — сначала в Remix правой кнопкой по файлу → «Flatten»: получишь один файл со всем кодом, его и вставляй.
Проверка. На странице контракта во вкладке Contract — исходник и зелёная галочка, рядом появились Read Contract и Write Contract.
7. Вызовы: свои и чужой
Проблема. Задеплоенный контракт — ещё не продукт. Продукт — то, чем пользуются. Нужно показать, что функции работают, и что позвать их может кто-то, кроме автора.
Как устроено. Вызов — транзакция, у которой получатель — адрес контракта, а в данных — имя функции и аргументы, закодированные по ABI. Каждый вызов — своя плата за газ, у того, кто зовёт. Поэтому одноклассник, который зовёт твой контракт, платит своим тестовым эфиром — ему тоже нужен кран или перевод от тебя. В классе это скрывал сервис, здесь видно как есть.
Что сделать.
- Позови две-три функции своего контракта — из Remix (оранжевые кнопки) или с Etherscan (Write Contract → «Connect to Web3» → функция → «Write»). Каждый раз MetaMask просит подпись.
- Дай одному однокласснику адрес контракта. Он открывает sepolia.etherscan.io → Write Contract → «Connect to Web3» (его MetaMask) → любая функция → «Write». Если у него нет эфира — переведи ему 0,005 из MetaMask («Send» → его адрес): это тоже транзакция, и она тоже стоит.
- Собери хеши всех вызовов: MetaMask → Activity, или вкладка Transactions на Etherscan.
Проверка. На странице контракта во вкладке Transactions — твои вызовы и хотя бы один с другого адреса, все с галочкой. «Fail» означает, что функция откатилась: require не прошёл или не хватило газа — память вернулась к прежнему состоянию, плата осталась у сборщика. Это третья лекция, увиденная вживую.
8. Сдача: что проверяет робот и почему верит сети
Ты сдаёшь адреса и хеши через SDK. Мы не читаем отчёт на веру — мы идём в Sepolia и смотрим сами, как любой человек мог бы:
- по адресу контракта лежит код;
- транзакция деплоя создала именно этот контракт и подписана твоим кошельком;
- исходник опубликован (Sourcify или Etherscan);
- вызовы прошли без отката, адресованы твоему контракту, и среди отправителей есть не ты.
Ответ на submit говорит по каждому пункту, сошлось или нет, и словами — что именно не так. Плюс разбор пакета с деплоем: блок, сборщик, база, чаевые, сожжено. Сравни с тем, что выписал на Etherscan, — числа должны совпасть. Исправил — сдай ещё раз; та же проверка есть кнопкой на странице домашки.
9. Если что-то не так
- MetaMask пишет «insufficient funds» — нет эфира в Sepolia: проверь сеть и баланс, сходи на кран.
- Remix не видит MetaMask — обнови страницу Remix при открытом расширении; в Brave отключи щит для remix.ethereum.org.
- Деплой «Fail» на Etherscan — конструктор откатился: параметры или
requireв нём. - Верификация не проходит — версия компилятора или флаг оптимизации отличаются от тех, с которыми деплоил. Смотри вкладку компилятора в Remix.
- Одноклассник не может позвать — у него нет эфира на газ: переведи 0,005.
- Проверка говорит «деплой подписан не твоим кошельком» — в сдаче адрес другого аккаунта MetaMask; сравни с тем, что вверху расширения.
- Проверка говорит «исходник не опубликован», а на Etherscan галочка есть — верификация только в базе Etherscan; либо добавь Sourcify через Remix, либо подожди: преподаватель может включить проверку по Etherscan.
Сдача и защита — из кода, кнопок на этой странице нет. Порядок такой:
pip install https://defilab.insights-forge.com/sdk/defilab-0.1.5-py3-none-any.whl
from defilab import Lab
lab = Lab("https://api.defilab.insights-forge.com",
class_code="КОД_КЛАССА", name="Твоё Имя", pin="твой PIN")
# сдать работу (можно пересдавать, пока не начал защиту)
lab.hw.submit(3, parts={...}, report_md=open("report.md").read(),
files=[{"path": "MyContract.sol", "content": src}])
# защита: начинается один раз, после старта пересдача закрывается
lab.hw.defense_start()
lab.hw.defense() # прочитать вопрос экзаменатора
lab.hw.defense_say("ответ", code=None)
lab.hw.defense_stop() # закончить и получить предварительную оценкуЧто писать в parts — в разделе «Формат сдачи» выше. Пока защита не начата, каждый новый submit заменяет предыдущий.