Получить время добычи блока

Мой внешний интерфейс отображает временные метки различных действий контракта, которые имели место.

Однако ток, block.timestampкоторый он использует, не очень точен, потому что у майнера есть некоторая свобода действий при его настройке.

Может ли внешний интерфейс получить точную временную метку блока, который уже был намайнен? Таким образом, вместо того, чтобы полагаться на контракт для выхода block.timestampв событии, мы можем просто запросить у какой-либо третьей стороны getTimestampForBlock(blockNumber)?

Кажется расточительным выводить block.timestampв событии, когда эти данные должны быть запрошены постфактум... Есть ли другой способ записи/доступа к отметкам времени для транзакций?

Ответы (1)

На самом деле это не столько отвечает на ваш вопрос, сколько объясняет, почему я не думаю, что альтернативы не намного лучше, чем block.timestamp.

Значение block.timestamp, как известно, задает майнер. Однако временная метка не может быть слишком далекой от нормы, иначе она будет отклонена сетью. Предположим, что часы майнера идут медленно (поэтому время на метке времени находится в прошлом) и он добывает блок. Большинство узлов, которые получают этот блок, не могут узнать, просто ли они поздно узнали о блоке (потому что для его получения потребовалось много переходов) или часы другого узла медленные. Только тот объект, который может отслеживать почти все узлы сети, может сказать, откуда возник блок и не отстала ли временная метка.

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

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