En Solidity, algunas propiedades pueden ser block.timestamp
atacadas por mineros y no están (fuertemente) protegidas por el protocolo. ¿Qué tal block.number
si un minero podría introducir un número alto al azar?
EDITAR: Estoy pensando en asegurar un juego que facilite acciones como un pago, después de que haya transcurrido un cierto período de tiempo.
El número de bloque siempre será correcto por definición: es el número x en la cadena, porque está encadenado encima de x-1.
Sin embargo, como usted dice, block.timestamp
se puede jugar un poco, o con la cooperación de la mayoría económica de los nodos de validación, lo que también significa que la relación block.number
con el tiempo real se puede jugar. Entonces, si no confía en que el block.timestamp
01-01-2017 será realmente aproximadamente el 01-01-2017, tampoco puede confiar en contar los bloques que se supone que se extraerán entre ahora y el 01-01-2017.
PD. Es posible que las personas puedan brindarle consejos más útiles si nos dice para qué propósito quiere estar seguro y contra qué quiere estar seguro.
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.
: si mi juego comienza en el bloque número 1M y debería durar 100 bloques hasta el pago, entonces podría verificar si ya llegamos al bloque 1'000'100. Estoy aquí confiando en el algoritmo de consenso de que el tiempo intermedio fue de 100 * 14 s y no solo en un solo minero.block.number
, es significativamente más seguro que block.timestamp
el que puede ser manipulado (hasta cierto punto) por un solo minero. Dado que el tiempo de bloqueo no es constante, esta es, sin embargo, solo una solución viable si no se necesita el tiempo exacto. ¿Correcto?block.timestamp
se puede manipular fácilmente sin costo dentro de la ventana del bloque (es decir, si extrajo 15 segundos después del último bloque, podría fingir que como 3 segundos después del último bloque), pero la precisión que pierdes con este ataque ya se pierde si estás usando la altura del bloque.block.timestamp
si lo que le interesa es el tiempo humano para averiguar algo a través de los canales sociales, o altura de bloque si lo que le interesa es la capacidad de enviar una transacción a través de un proceso automatizado, o ambos si le interesa ambas cosas. 100 bloques se siente un poco límite.
Edmundo Edgar
mikko ohtamaa
block.timestamp
especulación generalmente no tiene garantía.block.timestamp
es muy seguro en escenarios de la vida real.block.timestamp
es seguro para el 99% de los casos de uso. Si tiene miedo del problema de la delantera, entonces usarblock.number
no lo resuelve realmente. Si tiene miedo de que los mineros se metan con su transacción, entonces tiene una vía de otros vectores de ataque que el usoblock.number
no resuelve.