Является ли Solidity block.number более безопасным, чем отметка времени?

В Solidity некоторые свойства, например, block.timestampмогут быть атакованы майнерами и не (сильно) защищены протоколом. Как насчет того block.number, может ли майнер ввести случайно большое число?

РЕДАКТИРОВАТЬ: я думаю о защите игры, которая облегчает такие действия, как выплата, по истечении определенного периода времени.

Если мы говорим о часах или днях и просто хотим знать, прошло ли время или нет, я не думаю, что использование номеров блоков, а не временных меток, принесет какое-либо существенное преимущество с точки зрения безопасности. Однако, если время предназначено для того, чтобы дать людям возможность отреагировать на что-то происходящее путем отправки транзакций, например, чтобы оспорить предлагаемое действие, вы можете также включить номер блока на случай, если в сети произойдет что-то странное. . Я думаю, что это гранично, стоит ли ценность этого дополнительных затрат на безопасность дополнительной сложности.
Обратите внимание, что block.timestampспекуляции обычно безосновательны. block.timestampочень безопасно в реальных сценариях. block.timestampбезопасен для 99% случаев использования. Если вы боитесь проблемы опережения, то использование block.numberна самом деле ее не решает. Если вы боитесь, что майнеры испортят вашу транзакцию, то у вас есть множество других векторов атак, которые использование block.numberне решает.

Ответы (1)

Номер блока всегда будет правильным по определению: это номер x в цепочке, потому что он связан поверх x-1.

Однако, как вы говорите, block.timestampможно немного поиграть — или в сотрудничестве с экономическим большинством проверяющих узлов — это также означает, что отношение block.numberк реальному времени можно сыграть. Поэтому, если вы не верите, что block.timestamp01.01.2017 действительно будет примерно 01.01.2017, вы также не можете полагаться на подсчет блоков, которые должны быть добыты между настоящим моментом и 01.01.2017.

PS. Люди могут дать вам более полезный совет, если вы сообщите нам, для какой цели вы хотите быть в безопасности и от чего вы хотите быть в безопасности.

Я не понимаю So if you don't trust that a block.timestamp of 2017-01-01 will really be approximately 2017-01-01, you can't rely on counting the blocks that are supposed to be mined between now and 2017-01-01 either.: если моя игра начинается с блока номер 1M и должна длиться 100 блоков до выплаты, я могу просто проверить, достигли ли мы уже блока 1'000'100. Я здесь, доверяя алгоритму консенсуса, что время между ними было 100 * 14 с, а не только один майнер.
Алгоритм консенсуса предотвращает перемещение блоков назад или дальше вперед, чем текущее время. И любой честный майнер может довести его до нужного времени. Так что это не должно быть за горами без большого сотрудничества майнеров. Если со временем будет много вреда майнерам, это также повлияет на перенацеливание, поэтому интервал блока не будет надежно составлять 14 секунд.
Для максимальной ясности позвольте мне попытаться перефразировать: без существенного сотрудничества майнеры не могут повлиять на то, когда блок номер X появится в сети. Следовательно block.number, он значительно более безопасен, чем block.timestampтот, которым может манипулировать (в некоторой степени) один майнер. Поскольку время блока не является постоянным, это, однако, жизнеспособное решение только в том случае, если точное время не требуется. Правильный?
Это не совсем правильно. Майнер может влиять на то, когда блок с номером X появится в сети: он может отложить добытые им блоки на потом или включить больше майнеров, чтобы ускорить работу на какое-то время. (например, если у вас есть блок майнинга ETC, временное переключение на ETH почти бесплатно.) Это правда, что block.timestampможно легко и бесплатно манипулировать в окне блока (например, если вы добыли 15 секунд после последнего блока, вы можете притвориться, что это через 3 секунды после последнего блока), но точность, которую вы теряете при этой атаке, уже теряется, если вы используете высоту блока.
Мое вытянутое из моей задницы предложение, не прибегая к математике, будет заключаться в том, что вы хотите использовать высоту блока (или и то, и другое, если вам нужно человеческое время) для небольших чисел, таких как 10 блоков, потому что если меньше блоков не прошло ничего Блокчейн может сказать вам о времени надежен. В течение нескольких дней и недель вы должны использовать block.timestamp, если вам важно время человека, чтобы узнать о чем-то через социальные каналы, или высоту блока, если вам важна возможность отправлять транзакцию через автоматизированный процесс, или и то, и другое, если вас волнует оба. 100 блоков кажутся немного пограничными.
хорошо, спасибо за разъяснение. Насколько майнер действительно может изменить временную метку — это еще одна тема, которую мы должны обсудить в другой ветке. Я думаю, что это не так очевидно (белая или желтая бумага или гет).
@Sebastian Протокол не имеет ограничений на то, насколько высокой может быть временная метка, но маловероятно, что другие майнеры будут строить поверх такого блока: ethereum.stackexchange.com/questions/5927/…