Номер блока Ethereum задаёт высоту блока. Хеш вычисляется на основе данных блока, а временная метка описывает его время. Эти поля отвечают на разные вопросы, даже когда находятся рядом в одной записи.
Различие особенно полезно при чтении состояния аккаунта. Для понимания запроса баланса одного адреса недостаточно: параметр блока определяет запрашиваемую высоту. Явно указанный номер делает этот выбор видимым, чтобы при последующем разборе было понятно, к какой высоте относился запрос.
Номер блока и хеш описывают разные свойства
В документации Ethereum JSON-RPC параметр блока для запросов состояния описан как параметр, определяющий высоту блока. Таким образом, номер служит для выбора высоты. У хеша другая связь с записью: он криптографически вычисляется на основе данных блока.
В документированном объекте блока JSON-RPC поле хеша содержит значение размером 32 байта. Предусмотрено явное исключение: у ожидающего блока поле hash равно null. Это условие нужно сохранять вместе с определением поля, а не ожидать заполненного хеша в каждом ответе, представляющем блок.
При разборе записи подписывайте номер и хеш отдельно. Рядом с номером полезно поставить вопрос: какая высота выбрана? Рядом с хешем — какой хеш блока указан в этом ответе? Так различие остаётся понятным, а выбор высоты не превращается в обещание неизменности конкретного блока.
Связь хеша с данными блока объясняется в первичном источнике — документации Ethereum о блоках. Здесь это объяснение помогает различать поля; подробный разбор подтверждений и финальности выходит за рамки материала.
Почему временная метка отличается от высоты
Поле timestamp объекта блока сообщает временную метку Unix, соответствующую моменту формирования блока. Оно описывает время блока, тогда как параметр запроса состояния выбирает высоту. Отдельно стоит записывать и время получения ответа: это ещё одна характеристика наблюдения, которую не следует смешивать со временем самого блока.
В Ethereum время разделено на слоты продолжительностью двенадцать секунд. Однако документация поясняет, что слот может остаться пустым, если назначенный предложить блок валидатор находится вне сети. Поэтому из продолжительности слота не следует, что между каждой парой созданных блоков обязательно проходит двенадцать секунд.
Из этих двух положений следует ограниченный вывод: умножение количества блоков на двенадцать секунд не гарантирует восстановления временной метки блока. Это не означает, что каждый интервал отличается от двенадцати секунд, и не даёт другой формулы восстановления времени. При учебном разборе конкретного блока сохраняйте указанную в ответе временную метку рядом с номером, вместо того чтобы заменять её расчётом с фиксированным интервалом.
Как выбрать высоту для запроса состояния
Параметр блока принимает целочисленный номер, записанный шестнадцатеричной строкой. Числовые величины JSON-RPC используют компактную шестнадцатеричную запись с префиксом 0x. В приведённом ниже гипотетическом примере десятичная высота 1024 записывается как 0x400. Это две записи одного числа, а не две разные высоты.
Тег latest, напротив, выбирает последний предложенный блок в контексте отвечающего узла. Отдельный метод eth_blockNumber возвращает текущий номер блока, на котором находится клиент. Такой результат следует рассматривать как наблюдение со стороны клиента, а не как независимо установленное показание для всей сети.
Эти определения позволяют сделать ещё один вывод. Если сохранять явный целочисленный параметр, запрашиваемая высота остаётся той же. Если повторять latest, каждый раз повторяется относительный выбор последнего предложенного блока. Вывод относится именно к высоте в запросе: он не гарантирует неизменности конкретного блока, одинаковых ответов или того, что значения на двух выбранных высотах обязательно будут различаться.
Описание методов и правила параметров приведены в документации Ethereum JSON-RPC. Они объясняют механизм выбора. Из этого описания не установлено, какие исторические высоты способен обслужить конкретный провайдер. Само наличие допустимого формата параметра не гарантирует доступность ответа на любой запрос.
Отделяйте запись блока от вопроса о состоянии
Метод eth_getBlockByNumber возвращает сведения о блоке, выбранном по номеру. Его назначение помогает различать два вопроса: какие данные содержит запись блока и каков баланс аккаунта на выбранной высоте. Для первого и второго вопроса используются разные методы.
eth_getBalance возвращает баланс аккаунта по указанному адресу. Его результат нужно рассматривать вместе с адресом и выбранным параметром блока. Этот метод не является универсальным способом получения балансов токенов, поэтому наш пример ограничен чтением баланса аккаунта.
Для обращений к контрактам параметр блока предусмотрен и у eth_call. Этот метод выполняет вызов без создания транзакции в блокчейне. Такое описание определяет способ выполнения, но не гарантирует успешного результата произвольного вызова. Здесь достаточно понимать, что выбор высоты может быть частью контекста такого запроса.
Если при чтении записей возникает вопрос, что именно подтверждают сведения о блоке и исполнении, полезен опубликованный материал о проверке транзакции Ethereum. В этой статье основное внимание остаётся на выборе высоты и сохранении контекста запроса.
Гипотетический пример двух записей запросов
Представим учебный лист для одной условно выбранной сети и аккаунта A. Все обозначения и значения в примере вымышлены. Запросы не выполнялись; этот лист не является отчётом о реальных данных аккаунта.
- Запись A: метод
eth_getBalance; адрес — аккаунт A; параметр блока —0x400, то есть десятичная высота 1024; поле результата оставлено пустым. - Запись B: метод
eth_getBalance; адрес — аккаунт A; параметр блока —latest; поле результата оставлено пустым.
В записи A баланс запрашивается с явно выбранной высотой. В записи B используется выбор последнего предложенного блока. Пустые поля результатов позволяют сосредоточиться на механизме: инструкции выбора различаются ещё до рассмотрения числового ответа. Сам пример не предполагает, что балансы обязательно окажутся разными.
Теперь добавим отдельную запись сведений о блоке на высоте 1024, оставив места для возвращённых хеша и временной метки. Эти поля следует хранить отдельно от ответа на запрос баланса. Такая организация связывает высоту, запись блока и вопрос о состоянии, не представляя хеш или время как другую запись номера.
При повторном обращении к учебному листу сохраняйте исходные параметры, а новое наблюдение записывайте отдельно. Это помогает видеть, какой вопрос был задан первоначально и какой — позднее. Пример не предполагает обязательного различия результатов, доступности исторических запросов или того, что сохранение высоты гарантирует неизменность конкретного блока.
Что проверить при чтении сохранённого запроса
- Раздельно обозначьте номер блока, хеш и временную метку, чтобы каждому полю соответствовал свой вопрос.
- Запишите метод и адрес аккаунта либо входные данные рассматриваемого вызова.
- Сохраните точное значение целочисленного параметра блока или использованный относительный тег.
- При отображении шестнадцатеричной высоты десятичным числом явно покажите соответствие между двумя записями.
- Различайте ответ со сведениями о блоке и ответ на запрос состояния аккаунта.
- Отделяйте выбранную высоту от утверждений о доступности данных у провайдера или неизменности конкретного блока.
Образовательный материал подготовлен с помощью ИИ. Гипотетический пример поясняет чтение контекста запроса.