Почему у блокчейна нет точного времени

Почему у блокчейна нет точного времени

Смарт-контракт в эфириусм не получает реальное время с системных часов и не обращается к интернету за синхронизацией. Вместо этого он использует специальное значение — метку времени блока, или timestamp.

После перехода эфириум на Proof of Stake блоки стали появляться с более стабильным ритмом, примерно раз в 12 секунд. Этого достаточно для базовой логики вроде разблокировки токенов или завершения аукционов, но недостаточно для того, чтобы определять точное времея до секунды и тем более для генерации случайных значений.

Что такое block.timestamp

В Solidity (язык програмирования, на котором пишут смарт-контракты для эфириума) есть встроенная переменная block.timestamp. Она возвращает время создания текущего блока в секундах, считая от 1 января 1970 года по UTC.

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

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

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

Откуда берется время в блокчейне

До перехода на Proof of Stake Ethereum работал на Proof of Work, где блоки создавались майнерами. Они могли немного влиять на значение времени, но протокол ограничивал такие изменения.

После обновления The Merge блоки создают валидаторы, которые участвуют в стейкинге и обеспечивают работу сети. Теперь время стало более предсказуемым, но все равно не абсолютно точным.

Сеть организует время через слоты — фиксированные интервалы примерно по 12 секунд. Каждый слот дает возможность одному валидатору предложить блок. Несколько слотов объединяются в эпоху, которая длится около 6 минут 24 секунд.

При этом время блока не задается вручную. Протокол требует, чтобы оно соответствовало текущему слоту. Если валидатор попытается изменить timestamp, такой блок будет отклонен сетью.

Почему блоки не приходят строго каждые 12 секунд

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

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

Почему нельзя проверять точное время

В смарт-контрактах иногда можно встретить сравнение вида block.timestamp == deadline. На практике это ошибка, потому что сеть не гарантирует попадание в конкретную секунду.

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

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

Почему транзакции могут опаздывать

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

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

Что такое deadline

Deadline — это ограничение по времени, после которого транзакция становится недействительной. Он используется как защита от устаревших операций.

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

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

Где используется время в реальных приложениях

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

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

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

Timelock и задержка решений

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

Это дает пользователям возможность отреагировать, если что-то изменилось, например вывести средства или отменить взаимодействие с протоколом.

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

Почему в Solidity нет месяцев и лет

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

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

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

Почему timestamp не подходит для случайности

Значение block.timestamp предсказуемо, потому что блоки создаются по расписанию. Это позволяет примерно оценить, когда появится следующий блок.

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

Поэтому timestamp не подходит для лотерей и других задач, где требуется честная случайность.

Почему контракт не может работать сам

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

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

Автоматизация и внешние сервисы

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

Также используется формат cron, который задает регулярные интервалы выполнения задач.

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

Источник

Добавить комментарий

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

Bitcoin

Рост притока крупных инвесторов усиливает давление на биткоин

Давление предложения на крипторынке усиливается на фоне роста притока крупных инвесторов и сохранения слабого спотового спроса. На это указали контрибьюторы CryptoQuant, аналитики XWIN Japan. По их наблюдениям, структура рынка биткоина начинает меняться. Эксперты зафиксировали рост Whale Inflow Ratio на Binance — метрика указывает на заметную долю крупных транзакций в притоках на биржу. Источник: CryptoQuant/XWIN Japan. […]

Читать дальше
Bitcoin

YouTube изменит подсчет просмотров: ожидается рост цифр, но не доходов

С 24 августа YouTube будет засчитывать просмотр с первой секунды воспроизведения видео — минимальной длительности просмотра теперь нет. Новое правило касается обычных загрузок, Shorts и прямых трансляций по всему миру. Число публичных просмотров резко вырастет. Однако метрика, от которой зависит начисление денег, уйдет в отдельное меню, куда почти никто из авторов не заходит. Для тех, […]

Читать дальше
Bitcoin

Бутерин предложил масштабировать Ethereum по модели биткоина

Виталик Бутерин поддержал идею пересмотреть систему простых платежей в Ethereum и предложил взять на вооружение подход, который биткоин применяет с 2009 года. В соцсети X он поблагодарил разработчиков биткоина за подсказку. Этот шаг отвечает на проблему, которая тянется за Ethereum уже много лет: каждый новый аккаунт немного утяжеляет работу сети. Почему Ethereum становится «тяжелее» Тысячи […]

Читать дальше