Может ли контракт безопасно полагаться на block.timestamp?

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

17 голосов | спросил Joris Bontje 22 Jpm1000000pmFri, 22 Jan 2016 22:06:30 +030016 2016, 22:06:30

2 ответа


25

Не особенно , но это зависит от того, что используется.

Время блокировки зависит от следующих ограничений:

  • Если вы запечатаете свой блок с слишком большим временем в будущем, никто другой не построит его (майнеры не будут строить на блоке, отмеченном временем "из будущего").
  • Время вашего блока не может быть отпечатано раньше, чем его родитель.
  • Сложность остается самой низкой (лучшее предложение для шахтеров), не блокируя штампы, как раньше, чем они на самом деле происходят.

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

Ultimate, нет криптографического способа проверки самой метки времени - только заказ некоторые криптографические структуры . Поэтому block.timestamp необходимо дополнить некоторой другой стратегией в случае приложений с высокой стоимостью /рисками.

ответил Jeff Coleman 23 Jam1000000amSat, 23 Jan 2016 02:31:15 +030016 2016, 02:31:15
12

Во-первых, базовое: использование строгого равенства == block.timestamp не будет безопасным, так как блок с такой точной меткой никогда не сможет быть добыт. Поэтому используйте >= block.timestamp

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

В «Желтой бумаге» нет ответа на вопрос «сколько он может быть выключен, прежде чем он будет отклонен другими узлами». Если используется block.timestamp, единственная гарантия (уравнение 43) заключается в том, что block.timestamp больше, чем у его родителя. Но есть теоретические причины игры, почему block.timestamp не будет сильно ошибочным.

Из Solidity docs еще одна вещь, на которую нужно следить: Вы публикуете транзакцию за раз X, эта транзакция содержит код, который вызывает block.timestamp и включается в блок, временная метка которого Y, и этот блок включен в каноническую цепочку (опубликованную) на время Z. Значение block.timestamp будет идентично Y, а X <= Y <= Z

ответил eth 23 Jam1000000amSat, 23 Jan 2016 03:00:41 +030016 2016, 03:00:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132