Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
555 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Chainlink Data Feeds. Часть 1

Chainlink Data Feeds - это одна из 4 частей сервиса chainlink, позволяющий подключать смарт контракты к сети оракулов, чтобы получить достоверную информацию о цене на криптовалюту, балансы бирж и состояния L2 секвенсеров.

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

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

Итак, Data Feeds состоят из трех компонентов:

1. Нашего контракта, в котором нам нужно получить некую информацию, например, о цене на какую-либо криптовалюту;
2. Прокси контракт, к которому мы подключаемся, и который в свою очередь подключается к Агрегатору для получения нужно информации;
3. Агрегатор. Именно он получает всю информацию от оракулов.

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

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

Далее мы рассмотрим Solidity код подключения.

#chainlink #datafeeds #feeds
Chainlink Data Feeds. Часть 2

Удобнее всего практиковаться с Data Feeds в Remix IDE в браузере. Конечно, для вашей большей практики деплоя контрактов в различные сети, в том числе в goerly, можно писать и в VS Code или другом редакторе кода, но Remix в данном случае проще.

Лично я сначала пробовал делать в Ремиксе, потом в VS практиковался с интерфейсом и js.

Для начала пойдем простым способом и посетим эту ссылку. Скролим ниже до Solidity кода и нажимаем "Open in Remix".

Мы увидим самый простой пример валидного кода с подключенным уже интерфейсом агрегатора.

ВАЖНО! На данный момент практики с кодом у вас на счету в тестовой сети в кошельке Метамаск уже должны быть некоторые средства, 0.02 Эфира будет самый раз.

Справа в меню (иконки) сначала переходим в раздел Compile и компилируем наш контракт.

Далее идем в раздел Deploy (иконка с эфиром). В поле "Environment" выбираем "Injected Provider - Metamask". Под этим полем, после подключения, должна появиться ваша тестовая сеть, обычным текстом, типа "Goerly network", а в поле "Account" - отобразиться ваш адрес в кошельке. В поле "Contract" проверяем, чтобы был именно наш контракт. И жмем "Deploy".

Возможно, в первые разы у вас будет появляться окошко Метамаска для авторизации. Тут нужно будет все одобрить.

В момент деплоя снова появится окошко Метамаска, где нужно будет одобрить транзакцию и заплатить немного эфира. После этого в консоли Ремикс появится ссылка на ваш контракт в Etherscan, и справа, где вы нажимали кнопку деплоя, можно будет развернуть ваш контракт и попробовать вызвать функцию getLatestPrice().

По сути, это самый простой вариант работы с chainlink.

Далее рассмотрим другие функции, которые можно вызывать с Data Feeds.

#chainlink #datafeeds #feeds
Chainlink Data Feeds. Часть 3

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

decimals - возвращает, даже не знаю, как перевести, эти самые decimals. Помните в одном из постов мы разбирали из чего состоит Эфир? Эфир, потом Gwei, потом в самом конце Wei, который равен "0, семнадцать нулей и 1", всего после запятой 18 символов. Так вот эти 18 символов и называются decimals. И в отношении других валют, это количество символов после запятой может быть разным.

description - описание контракта Агрегатора, на который указывает Прокси контракт.

getRoundData - получение данных с определенного раунда.

latestRoundData - получение данных с последнего раунда.

version - версия контракта Агрегатора.

В своем контракте вы можете создать свою функцию, которая внутри будет вызывать одну из функций интерфейса.

Для getRoundData() - все таки потребуется знать id интересующего раунда.

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

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

Далее узнаем, как подключать функции из Агрегатора и как его найти.  

#chainlink #datafeeds #feeds
👍1
Chainlink Data Feeds. Часть 4

Итак, есть несколько основных блокчейн сетей, к которым вы можете подключаться. В каждом из них есть список конкретных смарт контрактов, из которых мы и получаем основные сведения, типа стоимости ETH/USD.

И когда в Ремиксе была строка в конструкторе

priceFeed = AggregatorV3Interface(0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e);

то тут указывался адрес в тестовой сети goerly для пары ETH/USD.

Вы можете поэкспериментировать с различными контрактами сами. Просто замените адрес контракта в строке в конструкторе.

Однако учтите, что за каждый деплой контракта вы должны будете заплатить.

Все адреса контрактов и сети можно посмотреть тут.

#chainlink #datafeeds #feeds
Chainlink Data Feeds. Часть 5

Возможно, вам потребуется узнать Прокси контракт или Агрегатор для данной пары, типа ETH/USD, как это сделать?

1. Прежде всего выбираем интересующий нас контракт Data Feed с парой валюты, представленных в официальной документации chainlink. Ссылку на их список я давал в прошлом посте.

2. Открываем контракт в etherscan.

3. Выбираем вкладку "Contract" и жмем "Read contract".

4. Далее из показанных там функций жмем на "Agregator". Это и будет адрес контракта AccessControlledOffchainAggregator.

5. Если в этом же окне функций спуститься ниже и нажать на "Owner", то вы получите адрес прокси контракта.

#chainlink #datafeeds #feeds
Chainlink Data Feeds. Часть 6

Если мы хотим подключить контракт Агрегатор (AccessControlledOffchainAggregator) в свой контракт, то это будет чуть сложнее.

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

1. Прежде всего, способ описанным в предыдущем посте, мы находим Агрегатор контракта, который нам нужен, и во вкладке "Contract" внизу ищем его ABI.

2. Копируем ABI и переходим по данной ссылке. В поле ABI вставляем скопированный код, жмем на кнопку внизу и получаем интерфейс контракта.

3. Сохраняем этот интерфейс в свой контракт.

4. Далее в своем контракте создаем новую переменную объекта.

5. И в конструкторе в эту переменную кладем адрес контракта.

Все, после деплоя можно вызывать функции с Агрегатора.

Пример, как это сделал я, можно найти в файле в моем репозитории на GitHub тут.

P.S. Этот код можно скопировать в Ремикс и потестить там.

#chainlink #datafeeds #feeds
Chainlink Data Feeds. Часть 7

Забыл еще сказать одну штуку.

Если вы хотите подключать интерфейсы в своем контракте из редакторов кода, типа VS Code, то можно добавить пакет chainlink в свой проект, выполнив команду в консоли

npm install @chainlink/contracts --save

После этого можно использовать import.

#chainlink #datafeeds #feeds