La computación distribuida trata sobre el tiempo y el estado. Es decir, para que más de un componente se comunique, debe compartir el estado, y todo esto requiere tiempo.
La mayoría de programadores antropomorfizan su trabajo. Piensan en un único puesto de control que lleva a cabo todo el programa de igual forma que harían ellos si tuviesen que realizar la tarea ellos mismos. Sin embargo, los equipos modernos cambian entre tareas con gran rapidez y, en una CPU múltiple con varios núcleos, o en los sistemas distribuidos, dos eventos pueden llevarse a cabo a la vez exactamente. Estos defectos hacen que sea urgente que se unan posturas entre el modelo de los programadores sobre cómo un programa se ejecuta y lo que sucede en la realidad. Dichos defectos están relacionados con interacciones inesperadas entre los puestos, los procesos, el tiempo y la información. Estas interacciones se producen a través del estado compartido: semáforos, variables, el sistema de archivos y, básicamente, cualquier cosa que pueda guardar información.
Often Misused: Block Values
block.timestamp
o block.number
como un proxy de tiempo.block.timestamp
o block.number
suelen ser usados por los desarrolladores para activar eventos dependientes del tiempo; sin embargo, estos valores a menudo dan una sensación de tiempo que no es seguro usar.Debido a la naturaleza descentralizada de blockchain, los nodos pueden sincronizar el tiempo solo hasta cierto punto. En el mejor de los casos, usar
block.timestamp
no es fiable y, en el peor, los mineros maliciosos pueden alterar la marca de tiempo de sus bloques si ven una ventaja en hacerlo.En cuanto a
block.number
, aunque es posible predecir el tiempo entre bloques (aproximadamente 14 segundos), los tiempos de los bloques no son constantes y pueden variar dependiendo de la actividad de la red. Esto hace que block.number
no sea fiable para los cálculos relacionados con el tiempo.Ejemplo 1: El siguiente código utiliza
block.number
para desbloquear fondos después de un cierto período de tiempo.
function withdraw() public {
require(users[msg.sender].amount > 0, 'no amount locked');
require(block.number >= users[msg.sender].unlockBlock, 'lock period not over');
uint amount = users[msg.sender].amount;
users[msg.sender].amount = 0;
(bool success, ) = msg.sender.call.value(amount)("");
require(success, 'transfer failed');
}