Доступ к архивным узлам Ethereum с помощью Infura


Введение

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

В этой статье мы рассмотрим различные типы узлов Ethereum, углубимся в тему архивных узлов и представим новые возможности архивных узлов Infura. Затем мы рассмотрим реальный проект, чтобы показать, как подключить Infura API и web3.js к предварительно созданному react frontend. После завершения проекта пользователь сможет запросить у архивного узла некоторую статистику для заданного адреса кошелька Ethereum.

Оглавление

  • Что такое узлы Ethereum?
  • Типы узлов Ethereum
  • Архивные узлы
  • Провайдеры архивных узлов
  • Проект
  • Заключение

Что такое узлы Ethereum?

Проще говоря, узел — это просто точка соединения в сети. Однако в случае с Ethereum различные типы узлов выполняют различные функции в сети.

Блокчейн Ethereum работает на так называемой виртуальной машине Ethereum (EVM), которая представляет собой тип децентрализованного глобального компьютера. Узлы, в данном случае, обеспечивают вычислительную мощность этого компьютера. Они обслуживают запрошенные данные, создают и проверяют блоки, хранят данные о транзакциях или код смарт-контракта и многое другое. Любой человек, обладающий необходимым оборудованием, может загрузить клиент Ethereum и создать свой собственный узел для участия в работе сети. Это также предотвращает контроль над всей сетью со стороны одного субъекта и способствует децентрализации Ethereum.

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

Типы узлов Ethereum

Полный узел

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

Узел майнинга (обычно именуемый «майнер»)

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

Световой узел

Узел Light Node — это «облегченная» версия узла Full Node, которая содержит только данные заголовка блока, такие как хэш предыдущего блока и временная метка, а не данные блока целиком. Они выполняют запросы по требованию к полным узлам и подтверждают только определенные части состояния по требованию пользователей. Например, они используются для проверки баланса, подтверждения транзакции, проверки журналов событий и выполнения других легких задач. Легкие узлы могут легко запускаться устройствами с меньшей емкостью, такими как мобильный телефон или RaspberryPi.

Архивный узел

Архивный узел — это тип полного узла, который работает в «архивном режиме». Они содержат все те же данные, что и полные узлы, а также все исторические данные о состоянии всего блокчейна, начиная с блока Genesis. В оставшейся части этой статьи мы сосредоточимся на архивных узлах.

Подробнее об архивных узлах

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

Зачем обращаться к архивному узлу?

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

Особенности управления архивным узлом

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

Вот технические характеристики, необходимые для запуска собственного узла архивации Ethereum:

  • процессор с не менее чем четырьмя ядрами
  • 16 ГБ или более оперативной памяти
  • SSD-накопитель с объемом памяти не менее 6 ТБ
  • Пропускная способность не менее 25 МБит/с

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

Архивные провайдеры узлов

Node Providers упрощают доступ к блокчейну Ethereum и взаимодействие с ним с помощью простых в использовании API. Все, что вам нужно сделать, — это создать новый проект, а затем легко вызвать методы JSON RPC с помощью предоставленного ими URL.

Infura

Infura является, пожалуй, самым популярным Node-провайдером в этой области. Он был создан ConsenSys, командой, стоящей за MetaMask и фреймворком для разработки блокчейна Truffle. Они существуют уже давно, и их услуги отлично подходят как для начинающих, так и для организаций, стремящихся к масштабированию.

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

Примеры использования

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

Truffle / Hardhat

Если вы пишете смарт-контракты, которые взаимодействуют с историческими данными, то вам подойдет такой пакет разработки, как Truffle или Hardhat. Они оба имеют ряд встроенных инструментов, которые значительно упрощают весь жизненный цикл разработки вашего dApp. Подключение к архивному узлу в данном случае осуществляется просто — достаточно установить конечную точку API URL в качестве переменной для использования в коде фронтенда.

Ganache

Если вам нужен быстрый доступ к архивному узлу для локальной разработки или тестирования, Truffle предлагает персональный блокчейн, который отлично справляется с этой задачей. Этот блокчейн называется Ganache. Начиная с версии Ganache 7.0, запуск локального экземпляра блокчейна Ethereum с доступом к архиву осуществляется всего одной командой:

ganache --fork
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем вы можете взаимодействовать с ним аналогично тому, как описано выше, используя URL: http://localhost:8545 или любой другой порт, который вы установили.

Прямая интеграция

Если вам не требуется набор инструментов блокчейна, то вы можете использовать URL-адрес провайдера Node непосредственно в коде фронтенда и подключиться к нему с помощью библиотеки JavaScript, такой как ethers.js или web3.js. Именно этот вариант мы рассмотрим в проекте ниже.

Проект

Как уже упоминалось в начале статьи, мы сделаем простое приложение типа «Обзор года», которое будет отображать статистику по кошелькам за 2021 год. Мы будем клонировать предварительно созданный фронтенд, поэтому все, о чем нам нужно будет беспокоиться, — это запрос к узлу архива и последующее красивое отображение данных.

Чему мы научимся:

  • Как получить URL Infura API с доступом к архиву
  • Как собирать архивные данные с помощью URL Infura API и web3.js
  • JavaScript, необходимый для сбора данных из блокчейна
  • Как собрать данные вместе, чтобы красиво отобразить их в приложении

Что необходимо для завершения проекта:

  • учетная запись Infura
  • Git
  • Node / npm
  • Редактор кода

Дополнительные ресурсы

  • Документация Infura
  • Документация по Web3.js

URL API Infura

Первым шагом в нашем проекте будет создание учетной записи Infura и получение URL конечной точки API. Зайдите на сайт https://infura.io/ и создайте новую учетную запись или войдите в систему.

Создайте новый проект, чтобы получить URL конечной точки API, который понадобится нам позже в нашем проекте.

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

С этим покончено, давайте начнем работу над фронтендом!

Фронтенд

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

Чтобы правильно установить проект, мы будем использовать git и менеджер пакетов node (npm). Чтобы узнать, установлены ли они уже, мы можем проверить номера версий в командной строке:

npm --version
Войти в полноэкранный режим Выйти из полноэкранного режима
git --version
Войти в полноэкранный режим Выйти из полноэкранного режима

Если их все еще нужно установить на вашу машину, вы можете получить их по следующим ссылкам:

  • Node / npm: https://nodejs.org/en/
  • Git: https://git-scm.com/downloads

После установки мы готовы приступить к работе над остальной частью проекта:

  • В командной строке перейдите в папку, из которой вы хотите работать, и клонируйте репозиторий для нашего проекта:
 git clone https://github.com/paul-mcaviney/archive-node-project-frontend.git
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Измените директории в новой папке проекта и установите необходимые зависимости:
cd archive-node-project-frontend
Войти в полноэкранный режим Выйти из полноэкранного режима
npm i
Войти в полноэкранный режим Выйти из полноэкранного режима
  • После завершения установки зависимостей давайте запустим проект, чтобы убедиться, что он работает правильно:
npm start
Вход в полноэкранный режим Выйти из полноэкранного режима

Если все установлено правильно, то теперь у нас будет фронтенд, запущенный на http://localhost:3000, который выглядит следующим образом:

Здесь есть текстовое поле, которое мы будем использовать для ввода адреса кошелька. Нажав на кнопку Submit, мы переходим на страницу результатов. Мы также можем вернуться на страницу ввода, нажав кнопку Enter New Address.

  • Прежде чем мы начнем кодирование, нам нужно установить еще одну зависимость. Мы будем использовать web3.js для доступа к архивному узлу с нашим URL Infura. Чтобы установить web3.js, введите следующую команду в директории нашего проекта:
npm install web3
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Мы будем выполнять весь наш код в файле App.js в папке src. Первый фрагмент кода, который нам нужно написать, — это импорт web3 в наш проект и подключение его к нашему URL Infura. Под утверждениями import и перед функцией App добавьте следующий код:
const Web3 = require('web3'); 
const infuraURL = 'YOUR_INFURA_URL_HERE'; 
const web3 = new Web3(new Web3.providers.HttpProvider(infuraURL));
Войти в полноэкранный режим Выйти из полноэкранного режима

Примечание: Не загружайте этот проект в публичный репозиторий без предварительного скрытия вашего реального URL Infura. Для этого можно использовать переменные окружения.

  • Мы будем использовать крючок useState React для обновления нашего пользовательского интерфейса. Вы заметите, что он уже импортирован в верхней части нашего файла. Далее давайте добавим несколько переменных состояния React, чтобы упростить отображение данных, которые мы собираем с нашего узла архивации. В переменную состояния results добавьте следующее:
const [address, setAddress] = useState(''); 
const [currentBalance, setCurrentBalance] = useState(0); 
const [startOfYearBalance, setStartOfYearBalance] = useState(0); 
const [endOfYearBalance, setEndOfYearBalance] = useState(0); 
const [balanceDifference, setBalanceDifference] = useState(0); 
const [transactionCount, setTransactionCount] = useState(0);
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Теперь нам нужно обновить функцию handleInput, чтобы присвоить пользовательский ввод нашей переменной состояния адреса вместо регистрации комментария:
const handleInput = event => {  
    setAddress(event.target.value); 
};
Войти в полноэкранный режим Выход из полноэкранного режима

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

  • Последний фрагмент JavaScript — это асинхронная функция, которая будет собирать данные с узла архива, преобразовывать их в более читаемые значения и устанавливать наши переменные состояния. Под комментарием, в котором говорится Your JavaScript code will go here, введите следующий код:
// Access and process data from Ethereum blockchain
const accessEthereum = async () => {

    // 2021 Start and End Block variables 
    const START_2021_BLOCK = 11565019;
    const END_2021_BLOCK = 13916165;

    // Get current balance of address 
    const balance = await web3.eth.getBalance(address);

    // Convert balance from wei to ETH and set state variable
    setCurrentBalance(await web3.utils.fromWei(balance.toString(), 'ether'));

    // Get wallet balance at the start of 2021 (Block #11565019)
    const startBalance = await web3.eth.getBalance(address, START_2021_BLOCK);

    // Get wallet balance at the end of 2021 (Block #13916165)
    const endBalance = await web3.eth.getBalance(address, END_2021_BLOCK);

    // Convert startBalance to ETH and set state variable
    const startBalanceAsETH = await web3.utils.fromWei(startBalance.toString(), 'ether');
    setStartOfYearBalance(startBalanceAsETH);

    // Convert endBalance to ETH and set state variable
    const endBalanceAsETH = await web3.utils.fromWei(endBalance.toString(), 'ether');
    setEndOfYearBalance(endBalanceAsETH);

    // Set balanceDifference from start to end of 2021
    setBalanceDifference(endBalanceAsETH - startBalanceAsETH);

    // Get transaction count at start of 2021 (Block #11565019)
    let startTransactions = await web3.eth.getTransactionCount(address, START_2021_BLOCK);

    // Get transaction count at end of 2021 (Block #13916165)
    let endTransactions = await web3.eth.getTransactionCount(address, END_2021_BLOCK);

    // Set total transaction count in 2021
    setTransactionCount(endTransactions - startTransactions);

    // Received results, condition met to show them on screen
    setResults(true);    

};
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Переходя к HTML, первое, что нам нужно сделать, это заменить функцию кнопки на новую, которую мы только что написали. Измените вызов функции для кнопки под комментарием Change this button function:
<button onClick={accessEthereum} className='form-button' type='submit' name='submit' id='submit'>
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Последний необходимый нам фрагмент кода — это HTML, который будет отображать данные, собранные с нашего узла архива. В операторе return прокрутите вниз до комментария, в котором говорится Your HTML code will go here, и добавьте следующее:
<h3>{address}</h3>

<p className='result-heading'>Current Balance</p>
<p>{currentBalance} ETH</p>

<p className='result-heading'>Start of 2021 Balance</p>
<p>{startOfYearBalance} ETH</p>

<p className='result-heading'>End of 2021 Balance</p>
<p>{endOfYearBalance} ETH</p>

<p className='result-heading'>Difference from Start of 2021</p>
<p>{balanceDifference} ETH</p>

<p className='result-heading'>Number of transactions in 2021</p>
<p>{transactionCount}</p>
<br />
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы посмотреть полный код проекта, загляните в этот репозиторий Github.

  • Теперь давайте протестируем наше приложение и посмотрим, работает ли оно! Сначала запустите приложение:
npm start
Войти в полноэкранный режим Выйти из полноэкранного режима

Введите адрес кошелька Ethereum в текстовое поле и нажмите кнопку Submit. Если у вас нет адреса кошелька, который был активен в 2021 году, вы можете использовать адрес Виталика.

Потрясающе! Наши результаты отображаются правильно, и мы можем видеть всю активность адреса кошелька в 2021 году!

Заключение

Следуя этому руководству, вы получили доступ к данным на архивном узле с помощью URL конечной точки Infura API, а затем красиво отобразили их в простом приложении ETH Year in Review.

Архивный узел необходим для доступа к данным из блокчейна Ethereum до последних 128 блоков. Они хранят все исторические данные о состоянии с самого первого блока и предоставляют их гораздо быстрее и эффективнее, чем полные узлы. Теперь, когда Infura предлагает бесплатный доступ к Archive Node для всех пользователей, сбор исторических данных блокчейна никогда не был таким простым!

Оцените статью
Procodings.ru
Добавить комментарий