Reino: Time and State

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

Abstract
Una función utiliza block.timestamp o block.number como un proxy de tiempo.
Explanation
Los valores asociados con 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');
}
References
[1] Enterprise Ethereum Alliance Don't misuse block data
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 2.0
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2.0
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 3
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[6] Standards Mapping - Smart Contract Weakness Classification SWC-116
desc.structural.solidity.swc116