Смарт-контракты

  • Смарт-контракты и их влияние на криптовалюты
  • Разбивка смарт-контрактов Uniswap
  • Руководство для начинающих по взлому смарт-контрактов
  • Верификация смарт-контрактов с помощью Hardhat: пошаговое руководство

Смарт-контракты и их влияние на криптовалюты

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

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

Преимущества смарт-контрактов

Смарт-контракты были придуманы для работы децентрализованных приложений, которые можно создавать на базе некоторых блокчейн-сетей. Крупнейшая блокчейн-платформа для DApp (децентрализованных приложений) — это Ethereum. Помимо нее, смарт-контракты можно писать на Tezos, EOS или Tron.

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

Благодаря этим свойствам отпадает потребность в посредниках и доверии между сторонами — они лишь должны быть согласны на условия контракта, известные заранее.

С помощью смарт-контрактов пользователи взаимодействуют с приложениями, работающими на базе блокчейна. В частности, на смарт-контрактах работают проекты из сферы децентрализованных финансов (DeFi), включая MakerDAO, Compound или Uniswap.

Как работают смарт-контракты

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

К примеру, в Ethereum смарт-контракты по форме — еще один вид адреса, у которого есть свой баланс, а также входящие и исходящие транзакции. Фактически смарт-контракт связывает между собой разных пользователей одного и того же приложения.

Смысл смарт-контракта можно представить на примере отношений Элис и Боба. Предположим, что они заключили пари. Элис ставит по $500 долларов на то, что цена Биткойна на следующих выходных упадет на X долларов, а Боб столько же — на прогноз о росте его цены на ту же сумму. Победитель забирает обе ставки.

Они решают создать смарт-контракт для своего пари. Ставки обоих друзей блокируются в смарт-контракте. Согласно условиям смарт-контракта, если исполнится прогноз Элис, то она автоматически получит деньги. В противном случае победителем и обладателем денег автоматически станет Боб.

Где используют смарт-контракты

Как мы уже написали, смарт-контракты применяются во всех децентрализованных приложениях, а их популярность растет с каждым годом. Согласно отчету DApp Radar, сфера DeFi стала лидером среди других блокчейн-приложений в 2020 году по стоимостному объему выполненных транзакций. Переводы в DeFi-сервисах составили 99% всего объема транзакций, совершенных в децентрализованных приложениях за год.

При этом по количеству пользователей лидирует все еще не DeFi-сфера, а другие децентрализованные приложения — например, игровые, гэмблинговые или страховые dApps. По данным того же DApp Radar, общее число активных децентрализованных приложений сейчас превышает 2500.

Продемонстрируем роль умных контрактов на примере конкретного приложения. Без смарт-контрактов была бы невозможна работа DeFi-протокола Compound, где одни пользователи открывают депозит в криптовалюте и становятся кредиторами, а другие берут через протокол кредиты в криптовалютах. Все операции, связанные с депозитами и кредитами, в том числе определение ставок и выплата процентов, автоматизированы и обезличены. Аналогичным образом смарт-контракты применяются в децентрализованных приложениях для ставок на прогнозы, самым популярным из которых является Augur.

Смарт-контракты за пределами крипторынка

Смарт-контракты стали неизменной частью блокчейн-решений в реальной экономике. Эту технологию в свои бизнес-процессы внедряют такие компании как BBVA, Bankia, Sabadell, CaixaBank, IBM, Microsoft, Google, Ernst & Young и другие.

Существуют примеры и за пределами IT и финансов. Так, российская авиакомпания S7 еще в 2018 году успешно реализовала совместный проект с «Газпромнефть-Аэро» по внедрению смарт-контрактов в процесс заправки самолетов. Нововведение позволило повысить скорость расчетов, а также автоматизировать планирование и учет поставок топлива.

Проверка смарт-контрактов

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

Смарт-контракты, созданные на основе публичной сети (той же Ethereum), общедоступны. Однако далеко не все пользователи обладают достаточными навыками, чтобы проверить код смарт-контракта, оценить его качество и безопасность.

Поэтому разработчики смарт-контрактов передают их для аудита независимым программистам или специализированным IT-компаниям, которые ищут в коде уязвимости и баги. Итоги проверки вместе с выводами открыто публикуются.

Особенно популярной эта практика стала в DeFi-протоколах, в смарт-контракты которых пользователи отправляют существенные суммы. Контракт, код которого не прошел публичную проверку, считается небезопасным.

Влияние смарт-контрактов на цены криптовалют

Чтобы использовать смарт-контракт, пользователь должен заплатить комиссию сети, на которой данный смарт-контракт работает. Следовательно, цена нативного токена блокчейн-сети зависит в том числе от популярности смарт-контрактов, которые на ней работают.

Так, рост цены токена эфира (ETH) в первой половине прошлого года была во многом обусловлена бумом в сфере DeFi, большинство приложений которой работают на Ethereum.

С другой стороны, в последнее время собственные токены выпустили многие известные DeFi-протоколы. Цены на эти монеты зависят в том числе от качества смарт-контрактов. Есть, по крайней мере, несколько DeFi-проектов, смарт-контракты которых стабильны и безопасны, а их популярность в ближайшем будущем не будет падать: MakerDAO (MKR), Uniswap (UNI) и yEearn Finance (YFI).

Все перечисленные монеты можно приобрести в Alfacash. Он работает уже свыше 8 лет и позволяет обменять почти три десятка различных монет.

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

При этом Alfacash — регулируемый сервис: чтобы получить доступ к обменам на фиатные валюты, пользователю необходимо пройти процедуру верификации (KYC). Впрочем, сделать это можно быстро и просто. Соблюдение процедур KYC гарантирует отсутствие проблем с законом.

Разбивка смарт-контрактов Uniswap

Вы, наверное, знаете формулу постоянного произведения (x*y=k), на которой работает Uniswap. Но как на самом деле работает смарт-контракт Uniswap под капотом?

В этой статье мы разберемся, как реализуется Uniswap, разбив его смарт-контракт. Мы собираемся изучить пару сотен строк кода Solidity, которые ежедневно приносят доход в размере 1,28 миллиарда долларов.

Спойлер: впереди вы увидите очень эффективный, элегантный и безопасный код Solidity.

Вот краткое содержание этой статьи:

  • Как Uniswap работает на высоком уровне
  • Как организован код Uniswap
  • Функциональные возможности Uniswap
  • Основные контракты: Пара (жесткие)
  • Основные контракты: Фабрика (легко)
  • Периферийный контракт: Маршрутизатор (простой)
  • Полностью аннотированный код

Как Uniswap работает на высоком уровне

Вся цель Uniswap состоит в том, чтобы позволить вам обменять один токен ERC20 на другой. Например, вам нужен Dogecoin, но у вас есть только монета Shiba. Uniswap позволяет вам продать свой Shiba и получить взамен Dogecoin. Все это делается автоматически и децентрализованно. Uniswap — это просто децентрализованная биржа.

Обмены могут быть реализованы двумя способами.

  1. Модель книги заказов: Покупатели и продавцы подают заказы. А централизованная система сопоставляет ордера на покупку с ордерами на продажу. Так работает традиционная фондовая биржа.
  2. Автоматизированные маркет-мейкеры (AMM): Централизованной свахи нет. Есть люди, которые предоставляют оба токена (Dogecoin и Shiba). Их называют поставщиками ликвидности. Эти поставщики ликвидности создают пул токенов Dogecoin и Shiba. Теперь трейдеры могут прийти и внести Dogecoin, а взамен получить Shiba. Это делается автоматически, без централизованного объекта. Трейдеры платят небольшую процентную комиссию за сделку, которая идет поставщикам ликвидности за их услуги.

Uniswap использует технику AMM. Как он определяет обменный курс в пуле? т.е. сколько токенов Shiba стоит 1 Dogecoin? Это определяется формулой постоянного продукта (количество (Dogecoin amount)*(Shiba amount)=k. Во время торгов этот продукт должен оставаться постоянным.

Не волнуйтесь, если это не совсем понятно. Мы узнаем больше об этой формуле и динамике рынка в оставшейся части статьи.

Примечание о версиях Uniswap

Uniswap имеет 3 версии.

  • Мы будем работать с v2.
  • v1 слишком прост и не обладает всеми современными функциями.
  • V3 по сути является v2, но улучшен и оптимизирован — его код намного сложнее, чем v2.

Ознакомьтесь с моей статьей, если вы хотите узнать больше о различиях между версиями Uniswap.

Как организован код Uniswap

Всего у Uniswap 4 смарт-контракта. Они делятся на ядро и периферию.

  1. Ядро предназначено для хранения средств (токенов) и предоставления функций для обмена токенами, добавления средств, получения вознаграждений и т. Д.
  2. Периферия предназначена для взаимодействия с ядром.

Core состоит из следующих смарт-контрактов:

  1. Пара — смарт-контракт, реализующий функционал по обмену, чеканке, сжиганию токенов. Этот контракт создается для каждой биржевой пары, такой как Dogecoin ↔ Shiba.
  2. Factory — создает и отслеживает все контракты Pair
  3. ERC20 — для учета прав собственности на пул. Думайте о бассейне как о собственности. Когда поставщики ликвидности предоставляют средства в пул, они получают взамен «токены владения пулом». Эти токены владения приносят вознаграждение (трейдеры платят небольшой процент за каждую сделку). Когда поставщики ликвидности хотят вернуть свои средства, они просто возвращают токены собственности и получают свои средства + накопленные вознаграждения. Контракт ERC20 отслеживает токены владения.

Периферия состоит всего из одного смарт-контракта:

  1. Маршрутизатор предназначен для взаимодействия с ядром. Предоставляет такие функции, как swapExactETHForTokens swapETHForExactTokens т. д.

Функционал Uniswap

Мы поговорили о 4 смарт-контрактах, которые есть у Uniswap, и о том, как они организованы. Но каков основной функционал, который реализуют эти контракты? Основной функционал следующий:

  1. Управление средствами (как токены, такие как Dogecoin и Shiba, управляются в пуле)
  2. Функции для поставщиков ликвидности — вносите больше средств и выводите средства вместе с вознаграждениями
  3. Функции для трейдеров — своппинг
  4. Управление токенами владения пулом
  5. Плата за протокол — Uniswap v2 ввел переключаемую плату за протокол. Этот плата за протокол достается команде Uniswap за их усилия по поддержанию Uniswap. На данный момент эта плата за протокол отключена, но она может быть включена в будущем. Когда он включен, трейдеры по-прежнему будут платить ту же комиссию за торговлю, но 1/6 этой комиссии теперь пойдет команде Uniswap, а остальные 5/6 пойдут поставщикам ликвидности в качестве вознаграждения за предоставление своих средств.

В дополнение к основному функционалу, описанному выше, у Uniswap есть еще один, который не является основным для Uniswap, но является полезным помощником для других контрактов в экосистеме Ethereum:

  1. Ценовой оракул — Uniswap отслеживает цены токенов относительно друг друга и может использоваться в качестве ценового оракула для других смарт-контрактов в экосистеме Ethereum. Из-за арбитража (о котором мы узнаем далее в статье) цены Uniswap, как правило, внимательно следят за реальными рыночными ценами токенов. Таким образом, ценовой оракул Uniswap является довольно хорошим приближением к реальным рыночным ценам.
Эти теги будут использоваться во всем коде в оставшейся части статьи

Основные контракты: Пара (жесткие)

Давайте теперь углубимся в фактический код Solidity смарт-контрактов Uniswap. Начнем с контракта Pair. Это самый сложный из 4 смарт-контрактов. Остальное станет легче.

Контракт Pair реализует обмен между парой токенов, таких как Dogecoin и Shiba. Полный код смарт-контракта Pair можно найти на Github в разделе v2-core/contracts/UniswapV2Pair.sol

Давайте разберем это по строкам.

Во-первых, операторы импорта:

Далее декларация контракта:

  • Имя контракта — UniswapV2Pair
  • В нем реализован интерфейс IUniswapV2Pair, который является как раз интерфейсом для этого контракта (можно найти здесь). Он также продлевает контракт UniswapV2ERC20. Почему? Для управления токенами владения пулом. Подробнее об этом мы узнаем позже.
  • SafeMath — это библиотека для работы с переполнением/недоливом. UQ112x112 — библиотека для поддержки чисел с плавающей задаткой. Solidity по умолчанию не поддерживает плавающую запятую. Эта библиотека представляет числа с плавающей запятой, используя 224 бита. Первые 112 бит предназначены для целого числа, а последние 112 бит — для дробной части.

Далее мы сгруппируем код по функционалу, который он реализует.

Управление денежными средствами

Uniswap Pair — это обмен между парой токенов, таких как Dogecoin и Shiba. Эти токены представлены в контракте как token0 и token1. Это адреса смарт-контрактов ERC20, которые их реализуют.

reserve переменные хранят, сколько токена у нас есть в этой паре.

Код имеет цветовую кодировку в соответствии с тегом («управление средствами» в данном случае)

Вы можете задаться вопросом, где хранится фактический токен? Это делается в контракте ERC20 самого токена. Это не делается в контракте Pair. Контракт Pair просто отслеживает резервы. С точки зрения ERC20, контракт Pair — это просто обычный пользователь, который может передавать и получать токены, у него есть собственный баланс и т. д.

Вот как средства управляются с помощью 3 смарт-контрактов

Контракт Pair вызывает функции ERC20, такие как balanceOf (с owner=Pair contract’s address) и transfer для управления токенами (см. мой ERC20 Smart Contract Breakdown, если вы запутались). Вот пример того, как transfer функция ERC20 используется в контракте Pair.

SELECTOR позволяет вызвать контракт ERC-20 через его ABI

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

Несколько вещей, происходящих в этой функции:

  • balance0 и balance1 — это балансы токенов в ERC20. Они являются возвращаемым значением функции balanceOf ERC20.
  • _reserve0 и _reserve1 являются ранее известными балансами Uniswap (в последний раз balanceOf).
  • Все, что мы делаем в этой функции, — это проверка переполнения (строка 74), обновление ценового оракула (это будет объяснено в следующем разделе), обновление резервов и обновление события Sync.

В чем разница между аргументами _reserve0, _reserve1 и хранимыми переменными reserve0, reserve1 (показано ниже)? Они по сути одинаковы. Вызывающие функции _update уже _update прочитали reserve переменные из хранилища и просто передают их в качестве аргументов _update. Это всего лишь способ сэкономить на газе. Чтение из хранилища обходится дороже, чем чтение из памяти

Вы будете замечать это снова и снова: Uniswap очень любит эффективность и экономию газа. Они выжимают из Solidity все возможные баллы производительности. _reserve0 и _reserve1 являются одним из примеров этого.

Чеканка и сжигание

Теперь перейдем к следующему функционалу — чеканке и прожиганию. Минтинг — это когда поставщик ликвидности добавляет средства в пул, и в результате для поставщика ликвидности чеканятся новые токены владения пулом (создаются из воздуха). Сжигание происходит наоборот — поставщик ликвидности выводит средства (и накопленные вознаграждения), а токены владения его пулом сжигаются (уничтожаются).

Давайте посмотрим на функцию mint.

  • Сразу же можно заметить экономию газа: reserve0 и totalSupply переносятся из хранилища в память (строки reserve1 и 118), так что считывать эти значения дешевле.
  • Мы читаем балансы нашего контракта (контракта Pair) в строках 112 и 113, а затем вычисляем сумму каждого токена, который был внесен.
  • Розовая часть кода предназначена для оплаты дополнительного протокола. Мы рассмотрим это позже.
  • totalSupply указывает общее количество токенов владения пулом и является хранимой переменной в контракте UniswapV2ERC20 (см. мою разбивку здесь). Контракт Pair расширяет UniswapV2ERC20, поэтому он имеет доступ к переменной totalSupply.
  • Если totalSupply равен 0, это означает, что этот пул совершенно новый, и нам нужно зафиксировать MINIMIUM_LIQUIDITY количество токенов владения пулом, чтобы избежать деления на ноль при расчетах ликвидности. Он блокируется путем отправки его на нулевой адрес. (никто не знает закрытого ключа, который приведет к нулевому адресу, поэтому, отправляя средства на нулевой адрес, вы, по сути, блокируете средства навсегда).
  • Переменная ликвидности — это количество новых токенов владения пулом, которые необходимо отчеканить поставщику liquidity. Поставщик ликвидности получает пропорциональное количество токенов владения пулом в зависимости от того, сколько новых средств он предоставляет (строка 123)
  • Наконец, мы чеканим новые токены владения пулом по адресу to (строка 126). to — адрес поставщика ликвидности (он будет предоставлен контрактом Periphery, называемым Router, который вызывает функцию mint)

Способ добавления средств заключается в следующем: они просто зачисляются на контракты ERC20 (путем вызова transfer(from: liquidity provider’s address, to: Pair contract’s address, amount)). Затем контракт Pair прочитает балансы (строки 112 и 113) и сравнит их с последними известными балансами (строки 114 и 115). Таким образом, контракт Pair может вывести внесенные суммы.

Функция burn является лишь зеркальным отражением функции mint:

  • Мы снова видим экономию газа на линиях 135, 136, 137 и 143
  • balance0 и balance1 — это суммарные балансы токенов в этом пуле. liquidity — это количество токенов владения пулом, которое есть у поставщика ликвидности (который хочет обналичить деньги). Зачем обращаться к ликвидности как к балансу address(this)? Потому что ликвидность была передана в контракт Pair контрактом Periphery до вызова функции burn.
  • Мы рассчитываем суммы токенов для вывода поставщику ликвидности пропорционально тому, сколько у него ликвидности (токенов владения пулом) (строки 144 и 145)
  • Затем мы сжигаем его ликвидность и переводим ему токены.
  • Вознаграждения поставщику ликвидности автоматически снимаются вместе с его средствами. Математика следит за тем, чтобы вознаграждения накапливались должным образом и чтобы вы получали больше, чем внесли.

Вот и все для Части 1! Я разбил эту статью на 2 части, потому что она становилась слишком длинной. Я надеюсь, что это было полезно. Дайте мне знать в комментариях, если у вас есть какие-либо вопросы.

Разбивка смарт-контрактов Optimism

Optimism — это оптимистичный роллап, построенный на основе Ethereum. Что такое оптимистичный роллап? И как это работает на уровне кода? Эта статья объяснит.

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

Вот план этой статьи

  • Что такое оптимистичный роллап?
  • Общий обзор контрактов Optimism
  • Код для моста L1 — L2
  • Код для свертывания транзакций
  • Кодекс для разрешения споров

Что такое оптимистичный роллап?

Во-первых, что такое роллап? Это один из способов сделать Ethereum более эффективным, широко известный как решения L2. Существует 3 типа решений L2: каналы состояния, плазма и роллапы. Скоро у меня появится статья «Классификация решений L2», в которой об этом будет подробно рассказано. Вот краткое изложение того, что такое роллап и, в частности, оптимистичный роллап.

На Ethereum есть смарт-контракт (назовем его RollupL1), который позволяет вводить/снимать ETH. Когда ваши деньги находятся в RollupL1, вы можете считать, что они находятся в L2. Деньги L2 движутся намного быстрее, чем деньги L1, потому что транзакции L2 (txns) намного эффективнее и быстрее. Как это достигается?

Есть программа, которая живет за пределами Ethereum (назовем ее RollupL2). Он может обрабатывать txns намного быстрее, потому что ему не нужно проходить через медленный и дорогой механизм консенсуса Ethereum. Он может обрабатывать кучу txn, объединять их (сворачивать) в пакет и отправлять пакет в RollupL1 .

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

Обрабатывая txns вне сети, вы экономите по 2 осям:

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

Есть еще одна ось экономии: вам не нужно вычислять новое состояние после каждого txn на Ethereum. Видите ли, когда вы отправляете txn напрямую на Ethereum, Ethereum необходимо рассчитать новое состояние учетных записей. Это дорого. Переложив эту работу на L2, вы избежите этих дорогостоящих вычислений на Ethereum.

Но должен ли RollupL1 просто доверять новому состоянию, представленному ему RollupL2?RollupL1 Должен ли он проверять? Если он проверяет, он тратит впустую те же вычисления, поэтому смысл свертывания теряется.

Оптимистичные роллапы обходят это слепым доверием: они просто доверяют вновь представленному государству, не проводя никакой проверки (они очень оптимистичны ✨). Но они блокируют только что отправленную партию на неделю (так называемое «окно вызова»). Любой желающий может представить математическое доказательство во время этого окна испытаний и получить награду, если обнаружит мошенническое обновление штата. Если партия не оспаривается в течение недели, она считается окончательной.

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

Вот так работают оптимистичные роллапы на высоком уровне. ZK-роллапы работают по-другому (читайте мою статью L2).

Общий обзор контрактов Optimism

Оптимистичные роллапы нуждаются в 3 функциях на высоком уровне:

  1. двухсторонний мост для перемещения денег между L1 и L2
  2. обработка транзакций и сворачивание их в пакет;
  3. Споры/доказательство неверного обновления состояния

Вот схема смарт-контрактов Optimism, которые реализуют вышеизложенное:

из документации Optimism

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

Код для моста L1 — L2

Мост работает, блокируя средства на L1 и чеканя эквивалент на L2. Для вывода средств мост сжигает средства L2 и высвобождает заблокированные средства L1.

Вот функция для внесения средств:

https://betterprogramming.pub/media/becd7862ebfb5ab65828703a0b406416

Функция является частью контракта L1StandardBridge, который живет на Ethereum. Все очень просто: принимаете ETH (делается автоматически по ключевому слову payable), кодируете все параметры функции в сообщение и отправляете сообщение в междоменный мессенджер.

Междоменный мессенджер транслирует сообщения между L1 и L2. Мы расскажем об этом немного.

Для прослушивания этих сообщений на L2 есть соответствующая функция. L2StandardBridge делает это. Этот контракт живет на отдельном блокчейне L2 (то есть быстрее, чем Ethereum).

https://betterprogramming.pub/media/04f385d02f291203796cdfc850dc6ba9

Функция просто запускает несколько проверок и чеканит новые токены. Я должен был упомянуть, что вы можете перемещать произвольные токены ERC-20 с помощью этого моста, а не только ETH (ETH просто упакован в интерфейс ERC-20).

Есть соответствующие функции для перемещения средств с L2 на L1. Также делается с помощью мессенджера x-domain. Я пропущу их для краткости.

Междоменный обмен сообщениями

Связь между L1 и L2 происходит через контракт мессенджера x-domain (в каждой цепочке есть копия). Внутренне этот контракт просто хранит сообщение и полагается на «ретрансляторов», чтобы уведомить другую цепочку (L1 или L2) о новом сообщении.

Нет родной связи L1 ↔ и L2. На каждой стороне есть такие функции, как onNewMessage, и предполагается, что ретрансляторы вызывают их с помощью традиционных веб-2 HTTP.

Например, вот как транзакции L1 → L2 хранятся/ставятся в очередь на L1:

https://betterprogramming.pub/media/2fcb737689b2e31e6ae545238ae57c96

Ретрансляторы уведомят L2 о том, что в очереди появилось новое сообщение.

Код для свертывания транзакций

В Optimism есть секвенсор, задача которого состоит в том, чтобы принимать транзакции L2, проверять их действительность и применять обновление состояния к его локальному состоянию в виде ожидающего блока. Эти отложенные блоки периодически отправляются большими партиями в Ethereum (L1) для доработки.

Функцией, принимающей эти пакеты в Ethereum, является appendSequencerBatch, которая является частью контракта CanonicalTransactionChain на L1. appendSequencerBatch использует приведенную ниже функцию для обработки пакетов.

https://betterprogramming.pub/media/90ff6f52fce06005b4e2a96b8d7e4bc7

  • batchesRef — это вспомогательный контракт, используемый для хранения данных. Там хранятся партии.
  • Функция сначала вычисляет заголовок пакета, а затем вычисляет его хэш.
  • Затем он вычисляет контекст пакета. Заголовок пакета и контекст — это просто дополнительная информация о пакете.
  • затем он сохраняет хэш и контекст в хранилище (batchesRef).

Позже хэш и контекст будут использоваться для проверки споров.

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

Кодекс для разрешения споров

На высоком уровне споры работают, отправляя доказательство того, что одно обновление состояния является недействительным, и проверяя это доказательство на соответствие хранимым обновлениям состояния (метаданные хранимого пакета: хэш и контекст).

Контрактом, ответственным за разрешение споров, является OVMFraudVerifier. Этот контракт является частью виртуальной машины OVM — Optimism (аналог EVM — виртуальной машины Ethereum). Вот основные функции для споров:

https://betterprogramming.pub/media/fed9874348a170703efd90f0b82c48a2

  • finalizeFraudVerification проверяет, не совпадает _postStateRoot (отправленный верификатором) с корнем, отправленным секвенсором.
  • Если это не так, то мы удаляем батч в _cancelStateTransition и сокращаем депозит секвенсора (для того, чтобы стать секвенсором, нужно заблокировать депозит. Когда вы отправляете мошенническую партию, ваш депозит сокращается, и эти деньги идут верификатору в качестве стимула для поддержания работы всего механизма).

Руководство для начинающих по взлому смарт-контрактов

Как взломать смарт-контракт (Источник: https://www.youtube.com/watch?v=fyKadW-iLsQ)

Смарт-контракты играют важнейшую роль в мире блокчейна и децентрализованных приложений (DApps). Эти контракты содержат значительные суммы денег, что делает их привлекательной мишенью для злоумышленников, стремящихся использовать уязвимости и украсть средства.

$6,73 млрд взломано и украдено из протоколов DeFi (источник: DefiLlama)

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

Предпочитаете смотреть/слушать? Вот полное видеоруководство, которое охватывает те же концепции, которые обсуждались в этой статье:

Что такое взлом смарт-контрактов?

Взлом смарт-контрактов включает в себя анализ и эксплуатацию уязвимостей в децентрализованных приложениях (DApps), использующих смарт-контракты. Злоумышленники постоянно ищут слабые места и непреднамеренное поведение в этих контрактах, чтобы получить несанкционированный доступ или манипулировать функциями контракта.

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

Логические недочеты

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

Проблема с контролем доступа

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

Атаки с повторным входом

Атаки с повторным входом происходят, когда вредоносный контракт или внешняя сущность многократно вызывают функцию уязвимого контракта до того, как он завершит свое предыдущее выполнение. Это может привести к неожиданному поведению и сделать возможным несанкционированный доступ или манипулирование состоянием контракта.

Ошибки валидации входных данных

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

Для выявления уязвимостей в смарт-контрактах хакеры используют такие методы, как проверка кода (аудит смарт-контрактов) и фаззинг.

Взлом смарт-контрактов

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

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

Роль белых хакеров смарт-контрактов

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

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

Возможности безопасности блокчейна (Источник: https://www.openzeppelin.com/jobs)

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

Кроме того, блокчейн-фирмы часто поощряют этичный хакинг с помощью программ вознаграждения за найденные ошибки. Эти программы предлагают денежное вознаграждение белым хакерам, которые обнаруживают уязвимости в смарт-контрактах и сообщают об этом. Вознаграждение может быть существенным, отражая ценность и важность, придаваемые выявлению и устранению потенциальных угроз безопасности. Участвуя в программах bug bounty, белые хакеры имеют возможность продемонстрировать свои навыки, внести свой вклад в безопасность экосистемы блокчейна, а также получить признание и финансовое вознаграждение за свои усилия.

Вознаграждения за ошибки при взломе смарт-контрактов (Источник: https://immunefi.com/)

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

Создание хакерской основы смарт-контрактов

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

Понимание основ блокчейна

Чтобы понять основополагающие принципы технологии блокчейн, полезно изучить такие ресурсы, как Bitcoin Whitepaperофициальный веб-сайт Ethereum, который предлагает исчерпывающие руководства и документацию. Эти ресурсы охватывают такие темы, как технология распределенного реестра, механизмы консенсуса, проверка транзакций и роль смарт-контрактов в экосистеме блокчейна.

Bitcoin WhitePaper (Источник: https://bitcoin.org/bitcoin.pdf)

Общие сведения о EVM

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

Изучение языка программирования Solidity

Solidity является основным языком программирования, используемым для написания смарт-контрактов на Ethereum и других блокчейнах EVM. Чтобы получить опыт работы с Solidity, хакеры смарт-контрактов должны ознакомиться с его синтаксисом, типами данных, структурами управления и библиотеками. Документация Solidity содержит подробные объяснения и примеры, которые помогут в обучении.

Еще одним интерактивным бесплатным способом изучения Solidity является CryptoZombies. CryptoZombies — это интерактивная школа, которая научит вас всем техническим аспектам блокчейна. Вы научитесь писать смарт-контракты, создав свою собственную игру с крипто-коллекционированием.

Интерактивное учебное пособие по Solidity (Источник: https://cryptozombies.io/)

Анализ существующих смарт-контрактов

Эффективным способом изучения Solidity является изучение и анализ существующих смарт-контрактов. Такие веб-сайты, как Etherscan, предоставляют доступ к обширной коллекции развернутых смарт-контрактов, позволяя людям изучать их код и понимать различные функции контрактов. Изучая реальные примеры, хакеры могут получить представление о распространенных шаблонах кодирования и потенциальных уязвимостях.

Принятие мышления злоумышленника

Чтобы стать хакером смарт-контрактов, вы должны принять образ мышления злоумышленника. Это предполагает творческое и нестандартное мышление для выявления потенциальных уязвимостей. Для этого необходимо подумать о том, как взломать систему, и предвидеть векторы атаки. Таким образом, вы получите представление о потенциальных уязвимостях и разработаете эффективные стратегии защиты контрактов.

Курс по взлому смарт-контрактов (Источник: https://smartcontractshacking.com/)

Для тех, кто ищет структурированный и практический подход к обучению взлому смарт-контрактов, доступны комплексные курсы. Этот курс предлагает пошаговую учебную программу, охватывающую такие темы, как Reentrancy Attacks, DAO Attacks, Frontrunning Attacks и более продвинутые концепции безопасности смарт-контрактов. Курс Взлом Смарт-Контрактов является примером практического курса, он включает в себя:

Инструкции экспертов

Курсы ведут одни из лучших профессионалов в отрасли, известные своим опытом в области безопасности смарт-контрактов. Их обширный опыт и знания дают студентам ценные идеи и практические советы, позволяя им развивать продвинутые хакерские навыки.

Инструкторы курса по взлому смарт-контрактов

Закрытое сообщество Discord

Курс «Взлом смарт-контрактов» предлагает доступ к закрытому сообществу Discord, где студенты могут общаться и сотрудничать. Такой подход, ориентированный на сообщество, позволяет учащимся делиться своим опытом, задавать вопросы и получать поддержку от коллег и преподавателей.

Практические упражнения

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

Финальные испытания и сертификация

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

Сертифицированный хакер смарт-контрактов (Источник: https://smartcontractshacking.com/)

Испытания «Захвата флага» (CTF)

Чтобы улучшить навыки и получить практический опыт, хакеры смарт-контрактов могут принять участие в испытаниях Capture the Flag (CTF). Эти проблемы предоставляют хакерам уязвимые смарт-контракты, позволяющие им совершенствовать свои навыки и углублять понимание уязвимостей смарт-контрактов. Участие в CTF-челленджах дает практический опыт в выявлении и эксплуатации уязвимостей в контролируемой среде.

Одной из популярных платформ для испытаний CTF смарт-контрактов является Damn Vulnerable DeFi. Damn Vulnerable DeFi представляет собой ряд уязвимостей смарт-контрактов, обычно встречающихся в приложениях децентрализованных финансов. CTF предлагает различные задачи, каждая из которых сосредоточена на различных аспектах безопасности смарт-контрактов.

DVD CTF (Источник: https://www.damnvulnerabledefi.xyz/)

Еще одним ценным ресурсом для CTF-испытаний является Ethernaut. Ethernaut предоставляет полный набор уровней, предназначенных для проверки и улучшения хакерских навыков. Каждый уровень представляет собой отдельную уязвимость или концепцию и требует от участников использования или обхода этих уязвимостей для продвижения вперед.

Ethernaut CTF (Источник: https://ethernaut.openzeppelin.com/)

Конкурсы аудита и программы Bug Bounty

Чтобы еще больше повысить свои навыки и получить практический опыт, хакеры смарт-контрактов могут участвовать в конкурсах по аудиту и программах bug bounty. Эти опции дают возможность анализировать реальные смарт-контракты, выявлять уязвимости и потенциально получать огромные вознаграждения за ответственное раскрытие информации.

Одной из платформ, которая проводит конкурсы по аудиту, является Code4rena. Code4rena предлагает публичные конкурсы аудита, где участники могут оценить безопасность смарт-контрактов, которые не были развернуты на основном блокчейне.
Изучив кодовую базу контракта, хакеры могут выявить потенциальные уязвимости и ответственно сообщить о них. Участникам предлагается представить подробные отчеты с описанием выявленных уязвимостей и предложениями соответствующих мер по их устранению.

Code4rena (Источник: https://code4rena.com/)

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

Sherlock — это еще одна платформа, которая предоставляет хакерам возможность участвовать в конкурентных конкурсах аудита смарт-контрактов. Как и Code4rena, Sherlock проводит конкурсы по аудиту, где участники могут искать уязвимости в смарт-контрактах. Участники могут изучить код контракта, протестировать его функциональность и сообщить об обнаруженных уязвимостях. Платформа предлагает структурированный процесс сообщения об уязвимостях и вознаграждает участников в зависимости от серьезности и влияния раскрытых уязвимостей.

Шерлок (Источник: https://audits.sherlock.xyz/contests)

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

Заключение

  • Взлом смарт-контрактов включает в себя выявление и эксплуатацию уязвимостей в децентрализованных приложениях.
  • Белые хакеры играют решающую роль в обеспечении безопасности протоколов блокчейна и смарт-контрактов.
  • Создание фундамента в основах блокчейна и языка программирования Solidity имеет важное значение.
  • Комплексные курсы по взлому смарт-контрактов предлагают структурированное обучение с практическими упражнениями и доступом к поддерживающим сообществам.
  • Челленджи Capture the Flag (CTF) дают практический опыт в выявлении и эксплуатации уязвимостей смарт-контрактов.
  • Конкурсы аудита и программы вознаграждения за найденные ошибки позволяют хакерам анализировать реальные контракты, выявлять уязвимости и потенциально получать вознаграждение.
  • Участвуя в этих мероприятиях, хакеры могут отточить свои навыки, внести свой вклад в безопасность блокчейн-приложений и потенциально заработать признание и финансовое вознаграждение.

Верификация смарт-контрактов с помощью Hardhat: пошаговое руководство 🛠️

Технология блокчейн и смарт-контракты захватили мир, произведя революцию в отраслях и создав новые возможности для децентрализованных приложений (DApps). Однако неизменная природа блокчейна означает, что после развертывания смарт-контракта его нельзя изменить. Поэтому обеспечение корректности и безопасности кода смарт-контракта имеет первостепенное значение. В этом подробном руководстве мы рассмотрим, как программно проверить код смарт-контракта Solidity с помощью Hardhat, мощной среды разработки для Ethereum.

Фото Эммануэля Эдварда с сайта Unsplash

🔧 Общие сведения о проверке смарт-контрактов

Прежде чем углубляться в детали того, как использовать Hardhat для проверки смарт-контрактов, давайте уточним, что означает верификация в контексте смарт-контрактов.

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

Верификация служит нескольким важным целям:
1. Прозрачность: позволяет любому желающему просматривать исходный код контракта на наличие уязвимостей безопасности.
2. Доверие: Укрепляет доверие между пользователями и инвесторами, доказывая легитимность контракта.
3. Функциональная совместимость: обеспечивает взаимодействие с другими смарт-контрактами и DApps.

Теперь давайте запачкаем руки и изучим пошаговый процесс программной проверки кода смарт-контракта Solidity с помощью Hardhat.

🏗️ Настройка среды разработки

Прежде чем мы начнем, убедитесь, что у вас установлены Node.js и npm (Node Package Manager). Если нет, вы можете скачать и установить их с официального сайта.

1. Инициализация проекта: Создайте новый каталог для вашего проекта и выполните следующие команды:mkdir smart-contract-verification
cd smart-contract-verification
npm init -y

2. Установите Hardhat: Установите Hardhat в качестве зависимости разработки:npm install — save-dev hardhat

3. Конфигурация каски: Инициализируйте конфигурацию каски, выполнив:npx hardhat

Эта команда поможет вам настроить проект. Выберите «Создать пример проекта», чтобы создать образец структуры проекта Hardhat.

4. Установите плагин Hardhat Ethers: Нам понадобится плагин Hardhat Ethers для взаимодействия со смарт-контрактами Ethereum. Установите его с помощью:npm install — save-dev @nomiclabs/hardhat-ethers

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

🔍 Проверка смарт-контрактов Solidity

В этом руководстве мы будем использовать простой смарт-контракт Solidity под названием «MyToken.sol» в качестве примера. Этот контракт представляет собой базовый токен с функцией передачи.

Вот код Solidity для «MyToken.sol»:// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import «@openzeppelin/contracts/token/ERC20/ERC20.sol»;
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20(«MyToken», «MTK») {
_mint(msg.sender, initialSupply);
}
}

Наша цель состоит в том, чтобы развернуть этот контракт в сети Ethereum, а затем проверить его исходный код на Etherscan с помощью Hardhat.

🛠️ Этапы развертывания и проверки

1. Скомпилируйте свой смарт-контракт: Используйте следующую команду для компиляции смарт-контракта Solidity:npx hardhat compile

Это сгенерирует необходимый байт-код и файлы ABI в каталоге «artifacts».

2. Разверните свой смарт-контракт: создайте сценарий развертывания, например, «deploy.js», и используйте возможности развертывания Hardhat. Вот упрощенный пример:const { ethers } = require(‘hardhat’);
async function main() {
const MyToken = await ethers.getContractFactory(‘MyToken’);
const myToken = await MyToken.deploy(1000000); // Initial supply: 1,000,000
await myToken.deployed();
console.log(‘MyToken deployed to:’, myToken.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

Запустите сценарий развертывания с помощью:npx hardhat run scripts/deploy.js

3. Проверьте свой контракт на Etherscan: Теперь наступает решающий шаг — проверка вашего контракта на Etherscan. Для этого вам понадобится адрес контракта и сведенный исходный код.

— Получите адрес контракта из выходных данных развертывания.
— Сведите код Solidity в один файл с помощью такого инструмента, как ‘hardhat-plugins/hardhat-tracer’. Установите его с помощью:npm install — save-dev hardhat-plugins/hardhat-tracer

Измените свой «hardhat.config.js», включив плагин трассировщика, и настройте его для выравнивания кода.

— Выполните следующую команду, чтобы свести код в порядок:npx hardhat flatten > MyTokenFlattened.sol

— Зайдите на сайт Etherscan и перейдите по адресу контракта. Перейдите на вкладку «Контракт», затем «Источник контракта». Там вы можете проверить свой контракт, предоставив плоский исходный код и аргументы конструктора.

4. Поздравляем! Теперь ваш контракт проверен в Etherscan, что обеспечивает прозрачность и доверие для ваших пользователей и заинтересованных сторон.

🧐 Дальнейшее изучение

В этом руководстве описаны основные шаги по программной проверке кода смарт-контракта Solidity с помощью Hardhat. Тем не менее, мир блокчейн-разработки огромен, и всегда есть чему научиться и исследовать:

— Продвинутые методы верификации: Узнайте больше о продвинутых методах проверки, таких как проверка контрактов с помощью нескольких исходных файлов или сложных аргументов конструктора.
— Аудит безопасности: Рассмотрите возможность проведения аудита безопасности, чтобы убедиться, что ваш контракт защищен от уязвимостей.
— Функциональная совместимость: Узнайте, как взаимодействовать с другими смарт-контрактами и децентрализованными приложениями, изучив экосистему Ethereum.
— Решения для масштабирования: Изучите решения для масштабирования Ethereum, такие как цепочки уровня 2 (например, Optimistic Rollups), чтобы улучшить масштабируемость ваших децентрализованных приложений.

🚀 Заключение

Проверка кода смарт-контракта Solidity является важным шагом в обеспечении целостности и безопасности вашего блокчейн-проекта. Hardhat предоставляет мощный набор инструментов для достижения этой цели, предлагая прозрачность и доверие как пользователям, так и инвесторам. Следуя шагам, описанным в этом руководстве, вы на пути к освоению проверки смарт-контрактов с помощью Hardhat.

Начните свое путешествие в захватывающий мир блокчейн-разработки и оставьте свой след в децентрализованном будущем!

Источник

Источник

Источник

Источник