Как читать исторические данные блокчейна с помощью URL-адреса конечной точки Infura RPC

Введение

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

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

Оглавление

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

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

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

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

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

Типы узлов Ethereum

Полный узел

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

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

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

Легкий узел

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

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

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

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

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

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

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

Спецификации для запуска узла архива

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

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

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

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

Поставщики узлов архива

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

Инфура

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

Случаи использования

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

Трюфель / Каска

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

Ганаш

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

ganache --fork

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

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

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

Проект

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

Что мы узнаем:

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

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

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

URL-адрес API Infura

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

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

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

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

Фронтенд

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

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

npm --version
git --version

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

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

  1. В командной строке перейдите в папку, из которой вы хотите работать, и клонируйте репозиторий для нашего проекта:
git clone https://github.com/paul-mcaviney/archive-node-project-frontend.git

2. Перейдите в новую папку проекта и установите необходимые зависимости:

cd archive-node-project-frontend
npm i

3. После завершения установки зависимостей давайте запустим проект, чтобы убедиться, что он работает правильно:

npm start

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

Там есть текстовое поле, которое мы будем использовать для ввода адреса кошелька. Нажав кнопку «Отправить», мы попадаем на страницу результатов. Отсюда также можно вернуться на страницу ввода, нажав кнопку Ввести новый адрес.

4. Прежде чем мы начнем программировать, нам нужно установить еще одну зависимость. Мы будем использовать web3.js для доступа к узлу архива с нашим URL-адресом Infura. Чтобы установить web3.js, введите следующую команду в каталоге нашего проекта:

npm install web3

5. Мы будем выполнять весь код в файле App.js в папке src. Первый фрагмент кода, который нам нужно написать, — это импортировать web3 в наш проект и подключить его к нашему URL-адресу Infura. Под операторами импорта и перед функцией App добавьте следующий код:

const Web3 = require('web3'); 
const infuraURL = 'YOUR_INFURA_URL_HERE'; 
const web3 = new Web3(new Web3.providers.HttpProvider(infuraURL));

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

6. Мы будем использовать хук 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);

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

const handleInput = event => { 	
    setAddress(event.target.value); 
};

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

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

// 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);    
};

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

<button onClick={accessEthereum} className='form-button' type='submit' name='submit' id='submit'>

10. Последний кусок кода, который нам нужен, — это HTML, который будет отображать данные, которые мы собрали с нашего Архивного узла. В операторе return прокрутите вниз до комментария с надписью Ваш код HTML будет здесь и добавьте следующее:

<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.

11. Теперь давайте протестируем наше приложение и посмотрим, работает ли оно! Сначала запустите приложение:

npm start

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

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

Заключение

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

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