домашки / домашка 3
сдача через SDK · lab.hw.submit

Выход в настоящую сеть

домашка 3
оценку ставят на защите

Выдаётся после лекции 3. Срок — 7 сентября, 10:00. Последняя домашка курса.

Три занятия всё происходило внутри класс-чейна: кошелёк за тебя хранил сервис, код писал помощник, монеты ничего не стоили. Эта домашка выводит наружу — в Sepolia, тестовую сеть Ethereum. Она устроена как настоящая: те же кошельки, те же инструменты, тот же обозреватель, что у людей, которые этим занимаются каждый день. Отличие одно: эфир в ней тестовый, его раздают бесплатно.

Задача — проделать полный путь разработчика и оставить в сети след, который мы проверим: кошелёк → тестовый эфир → Remix → деплой → верификация → вызовы → whitepaper. Пошаговый гайд по каждому инструменту — в приложении внизу страницы.

/01Часть 1. Кошелёк

Поставь MetaMask (расширение браузера) и создай кошелёк. Двенадцать слов — запиши на бумагу: это и есть ключ, восстановить его никто не сможет, включая нас. Переключи сеть на Sepolia.

Адрес у тебя один во всех сетях Ethereum — это следствие того, что адрес выводится из ключа, а не выдаётся сетью.

/02Часть 2. Тестовый эфир

За каждую запись в сети платят. Эфир для Sepolia дают краны — два рабочих:

  • Кран Google Cloud — 0,05 ETH в сутки на аккаунт Google. Хватит на всё задание.
  • PoW-кран pk910 — эфир надо намайнить в браузере: то же, что ты делал на лекции 3, только за настоящий тестовый эфир. Медленнее, но без аккаунта.

Если оба не сработали — напиши преподавателю адрес, он переведёт.

/03Часть 3. Remix и деплой

Remix — браузерная среда разработки, в которой пишут и деплоят большинство учебных и немало боевых контрактов. Возьми свой контракт из мастерской (или напиши новый, простой), вставь в Remix, скомпилируй той же версией, что в pragma, и задеплой в Sepolia через MetaMask.

MetaMask покажет транзакцию перед подписью: сколько газа, какая плата. Подписал — подожди подтверждения, скопируй адрес контракта из «Deployed Contracts» и хеш транзакции из MetaMask.

Что менять в контракте из мастерской: там CLASS был родной монетой чейна, здесь родная — ETH. msg.value и payable работают так же, только единица другая. Импорты OpenZeppelin в Remix подхватываются сами.

/04Часть 4. Обозреватель и верификация

Найди свой контракт на sepolia.etherscan.io. По адресу лежит байткод — его никто не прочтёт, и вкладка «Contract» пустая. Верификация — публикация исходника: после неё любой человек читает код, а вкладки «Read Contract» и «Write Contract» позволяют звать функции прямо с сайта, без Remix. Так контракт становится продуктом, а не просто адресом.

Способ без ключей: в Remix плагин Contract Verification → Sourcify. Способ через Etherscan: на странице контракта «Verify and Publish» — та же версия компилятора и тот же исходник.

/05Часть 5. Использование

Позови функции своего контракта два-три раза со своего кошелька. Потом попроси одноклассника позвать хотя бы одну со своего адреса — через «Write Contract» на Etherscan. Ему нужен свой тестовый эфир на газ; если у него нет — переведи со своего, это тоже транзакция.

Сохрани хеши всех вызовов: они идут в сдачу.

Найди транзакцию деплоя на Etherscan и выпиши в whitepaper: номер блока, кто его собрал (Fee Recipient), базовую плату, чаевые, сколько сожжено. Это ответ на вопрос первой лекции — кто записал твой пакет и что он за это получил, — только теперь на живой сети.

/06Часть 6. Whitepaper

Страница текста про твой продукт, по которой посторонний человек поймёт замысел:

  1. Какую задачу решает и для кого.
  2. Как работает по шагам: кто какую функцию зовёт, что записывается, кто кому платит.
  3. Где лежат деньги и кто может их забрать.
  4. Три способа сломать или обмануть — свои, не из головы помощника.
  5. Разбор пакета с деплоем (из части 5).
  6. «Что делал LLM, что делал я, где LLM ошибся» — обязательный раздел, как в первых двух домашках.
/07Формат сдачи

Тот же SDK и тот же вход, что в первых двух домашках:

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")

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: есть ли код по адресу, твой ли деплой, опубликован ли исходник, прошли ли вызовы и был ли среди них чужой. Что не сошлось — написано словами. Исправил — сдай ещё раз; на странице домашки то же самое видно кнопкой «проверить».

/08Защита

Письменно, 15 минут, как раньше: lab.hw.defense_start(3), затем lab.hw.defense(3) и lab.hw.defense_say(text, n=3). Экзаменатор спрашивает по whitepaper и коду, просит объяснить цифры твоего пакета и даёт одну живую правку под таймером. Оценку подтверждает преподаватель.

/09За что ставят оценку
A. Свой контракт и его использованиевес 35
  • Объясняет, что делает контракт, по шагам и на языке вызовов: кто зовёт функцию, что записывается в память, кто кому и сколько платит.
  • Знает, где в контракте лежат деньги и кто может их забрать: владелец, любой, никто.
  • Три способа сломать или обмануть — конкретные, со строкой кода, хотя бы один найден сам.
  • Объясняет, что делали чужие вызовы из parts.testnet и почему они прошли.
B. Путь в сетьвес 30
  • Кошелёк: что такое двенадцать слов, почему адрес один во всех сетях, что будет при потере.
  • Кран и плата: за что платится газ, откуда взялась цена деплоя в MetaMask, почему тестовый эфир бесплатный, а транзакция всё равно стоит.
  • Верификация: что лежало по адресу до неё и что изменилось после; зачем публиковать код.
  • Живая правка под таймером в своём контракте: «сделай так, чтобы вывести мог только тот, кто вносил», «добавь срок, до которого забрать нельзя», «ограничь сумму долей баланса» — в нужном месте, компилируется, меняет поведение, не переписывает файл целиком.
C. Пакет и плата — связь с курсомвес 20
  • По цифрам своего деплоя: кто собрал блок, сколько сожжено, сколько ушло сборщику, почему разделено именно так; почему транзакцию нельзя подменить задним числом.
  • Где в его проекте цена или обмен и что будет, если монет на другой стороне не окажется.
  • Что произойдёт с памятью контракта, если платы не хватит на середине функции, и кто останется с деньгами.
D. Whitepaper и честность про LLMвес 15
  • Whitepaper читается посторонним: задача, участники, шаги, деньги — без общих слов.
  • Раздел про LLM заполнен честно: граница «я / инструмент» проходит по фактам.
/10Гайд: путь от ключа до продукта в настоящей сети

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

Карта пути: ключ → адрес → сеть → эфир на плату → код → байткод в сети → адрес контракта → транзакции к нему → обозреватель, где всё это видно.

1. Ключ и кошелёк

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

Как устроено. Ключ — большое случайное число. Из него вычисляется публичный ключ, из публичного — адрес 0x… (сорок шестнадцатеричных знаков). В обратную сторону не вычисляется: адрес знают все, ключ — только ты. Двенадцать слов, которые покажет кошелёк, — это тот же ключ, записанный словами из фиксированного словаря, чтобы его можно было переписать на бумагу без ошибок. Кто знает слова — владеет всем, что лежит на адресе. Восстановить потерянные слова нельзя никому: сеть не знает, кто ты, она знает только подписи.

Кошелёк (MetaMask) — программа, которая хранит ключ и по твоей команде подписывает транзакции. Пароль, который она попросит, — от программы на этом компьютере. Это не ключ: с другого компьютера ты войдёшь только по двенадцати словам.

Адрес один во всех сетях Ethereum — потому что он вычисляется из ключа, а не выдаётся сетью.

Что сделать.

  1. metamask.io → «Download» → расширение для своего браузера.
  2. «Create a new wallet» → пароль от расширения.
  3. «Secure my wallet» → Secret Recovery Phrase: двенадцать слов. Перепиши на бумагу в том же порядке. Никому не отправляй, включая «поддержку» — её у MetaMask нет, а кто просит слова, тот хочет твой кошелёк.
  4. Подтверди фразу словами по порядку.

Проверка. Вверху расширения — имя аккаунта и адрес 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, и подпись ставишь ты. В классе то же делал помощник, здесь — ты руками.

Что сделать.

  1. remix.ethereum.org. Слева иконки: File explorer, Solidity compiler, Deploy & run.
  2. File explorer → папка contracts → правой кнопкой «New File» → MyContract.sol. Вставь код — свой из мастерской или новый. Импорты @openzeppelin/contracts/… Remix скачает сам. Что поменять в контракте из мастерской: там родной монетой был CLASS, здесь — ETH. msg.value и payable работают так же, единица другая.
  3. Solidity compiler → «Compiler» — версия та же, что в pragma (для ^0.8.20 подойдёт 0.8.20 и выше) → «Compile MyContract.sol». Зелёная галочка на иконке — собралось; ошибки внизу, красным, с номером строки.
  4. Deploy & run → «Environment» → Injected Provider – MetaMask. MetaMask попросит подключить сайт — «Connect». Под полем Environment должно стоять Custom (11155111) network — номер Sepolia. Другой номер — переключи сеть в MetaMask.
  5. «Contract» — выбери свой контракт (в файле с импортами их несколько, нужный не обязательно первый). Параметры конструктора — поля рядом с кнопкой «Deploy».
  6. «Deploy». MetaMask покажет окно: сколько газа, какая плата в ETH. Это и есть цена записи — «Confirm».
  7. Через 15–30 секунд внизу Remix, в «Deployed Contracts», появится контракт с адресом. Скопируй его (иконка рядом с именем).
  8. Хеш транзакции деплоя: 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. Каждый вызов — своя плата за газ, у того, кто зовёт. Поэтому одноклассник, который зовёт твой контракт, платит своим тестовым эфиром — ему тоже нужен кран или перевод от тебя. В классе это скрывал сервис, здесь видно как есть.

Что сделать.

  1. Позови две-три функции своего контракта — из Remix (оранжевые кнопки) или с Etherscan (Write Contract → «Connect to Web3» → функция → «Write»). Каждый раз MetaMask просит подпись.
  2. Дай одному однокласснику адрес контракта. Он открывает sepolia.etherscan.io → Write Contract → «Connect to Web3» (его MetaMask) → любая функция → «Write». Если у него нет эфира — переведи ему 0,005 из MetaMask («Send» → его адрес): это тоже транзакция, и она тоже стоит.
  3. Собери хеши всех вызовов: 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.
/11Сдача

Сдача и защита — из кода, кнопок на этой странице нет. Порядок такой:

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 заменяет предыдущий.