¿El valor de block.timestamp está en Solidity segundos o milisegundos?

Estoy buscando usar block.timestampen uno de mis contratos y quiero saber si block.timestampson segundos como en Python o milisegundos como en Java o algún otro valor.

Además, ¿es seguro usarlo block.timestamppara verificar si han pasado 30 días desde la última hora actualizada o algo así?

Es blocks.timestampuna marca de tiempo de Unix. Por lo tanto, tiene la información completa sobre la fecha, horas, minutos y segundos (en UTC) cuando se creó el bloque.
Te agradezco tu respuesta. Se lo agradezco mucho y por proporcionar más detalles y aclaraciones.
Consulte también esta publicación sobre el mismo tema: ethereum.stackexchange.com/questions/68064/…

Respuestas (4)

De la documentación de Solidity ( aquí y aquí ):

... marca de tiempo del bloque actual en segundos desde la época

Para tu otra pregunta:

Además, ¿es seguro usar block.timestamp para verificar si han pasado 30 días desde la última vez que se actualizó o algo así?

Su pregunta no está completamente clara, pero suponiendo que está cuestionando la validez de una marca de tiempo durante un período de tiempo determinado, entonces esta respuesta anterior debería cubrirla: ¿Block.timestamp es seguro durante períodos de tiempo más largos?

Gracias por señalar la documentación. De alguna manera lo perdí, son segundos. Digamos que establezco un valor de marca de tiempo: lastUpdated en un bloque anterior. En un bloque futuro, verifico si la última actualización tiene más de 30 días o no para realizar alguna acción. ¿Sería este un cheque seguro? ¿Asumiendo que la diferencia en la diferencia horaria es razonable (orden de días) y no demasiado cercana?
30 días funcionará bien. Debería tener una precisión de media hora más o menos en el peor de los casos.

block.timestampes un uint256valor en segundos desde la época.

Es seguro comparar como:

function f(uint start, uint daysAfter) {
    if (block.timestamp >= start + daysAfter * 1 days) { ... }
}

o

if (block.timestamp > start + 30 days) { ... }

Las unidades de tiempo son útiles para algunos cálculos con la advertencia:

Tenga cuidado si realiza cálculos de calendario con estas unidades, porque no todos los años equivalen a 365 días y ni siquiera todos los días tienen 24 horas debido a los segundos intercalares. Debido al hecho de que los segundos bisiestos no se pueden predecir, un oráculo externo debe actualizar una biblioteca de calendario exacta.

¿Cómo defino la variable "inicio". ¿Debería simplemente hacer: uint250 start = 1512918335?
start = block.timestamp(ahora) o start = 23 daysetc.
No es seguro comparar de esta manera, especialmente por la lógica que exhibió, donde está verificando que haya transcurrido al menos una cierta cantidad mínima de tiempo, ya block.timestampque puede establecerse arbitrariamente en el futuro, siempre que sea mayor que la marca de tiempo principal: ethereum.stackexchange.com/a/428/82179 ethereum.stackexchange.com/a/432/82179
@LukeHutchison ethereum.stackexchange.com/questions/5927/… tiene algunas respuestas de por qué block.timestampno termina siendo arbitrariamente lejano en el futuro.
@eth parece que algunas implementaciones son mucho más estrictas que la especificación, entonces. Gracias por la info.

1-timestamp es la marca de tiempo de Unix, por lo que para convertirla a la fecha normal, use http://www.epochconverter.com/ indica cuándo se creó el bloque.

2-para responder si es más seguro usar block.timestamp <30 días: sí porque el minero podría cambiar la marca de tiempo en 900 segundos .

Genial, uso de esta manera desde que vi tu comentario. Déjame preguntarte: En caso de que quiera pasar los días en el constructor, ¿cómo puedo hacer esto? ¿Debo especificar días en segundos o se permite que pase como "1 semana", por ejemplo?

block.timestamp puede no ser la hora correcta establecida por el minero. Por lo tanto, depende de la precisión del reloj de los mineros.

El block.timestamp actual tiene que ser mayor que el block.timestamp padre. Esto está establecido en el protocolo. Algunos bloques incluso tienen una diferencia de 1s.

Blockchain no tiene reloj, ya que significaría la sincronización de todos los nodos y eso sería casi imposible de lograr.