В Solidity некоторые свойства, например, block.timestamp
могут быть атакованы майнерами и не (сильно) защищены протоколом. Как насчет того block.number
, может ли майнер ввести случайно большое число?
РЕДАКТИРОВАТЬ: я думаю о защите игры, которая облегчает такие действия, как выплата, по истечении определенного периода времени.
Номер блока всегда будет правильным по определению: это номер x в цепочке, потому что он связан поверх x-1.
Однако, как вы говорите, block.timestamp
можно немного поиграть — или в сотрудничестве с экономическим большинством проверяющих узлов — это также означает, что отношение block.number
к реальному времени можно сыграть. Поэтому, если вы не верите, что block.timestamp
01.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 с, а не только один майнер.block.number
, он значительно более безопасен, чем block.timestamp
тот, которым может манипулировать (в некоторой степени) один майнер. Поскольку время блока не является постоянным, это, однако, жизнеспособное решение только в том случае, если точное время не требуется. Правильный?block.timestamp
можно легко и бесплатно манипулировать в окне блока (например, если вы добыли 15 секунд после последнего блока, вы можете притвориться, что это через 3 секунды после последнего блока), но точность, которую вы теряете при этой атаке, уже теряется, если вы используете высоту блока.block.timestamp
, если вам важно время человека, чтобы узнать о чем-то через социальные каналы, или высоту блока, если вам важна возможность отправлять транзакцию через автоматизированный процесс, или и то, и другое, если вас волнует оба. 100 блоков кажутся немного пограничными.
Эдмунд Эдгар
Микко Отамаа
block.timestamp
спекуляции обычно безосновательны.block.timestamp
очень безопасно в реальных сценариях.block.timestamp
безопасен для 99% случаев использования. Если вы боитесь проблемы опережения, то использованиеblock.number
на самом деле ее не решает. Если вы боитесь, что майнеры испортят вашу транзакцию, то у вас есть множество других векторов атак, которые использованиеblock.number
не решает.