Quiero una función bloqueada durante un cierto período de tiempo, ¿cuál es la forma más segura de lograrlo?

Quiero una tienda en la que alguien pueda convertirse tokenOwnerdurante un tiempo determinado. Las siguientes soluciones parecen las más fáciles:

pragma solidity ^0.4.24;

import "../node_modules/zeppelin-solidity/contracts/ownership/Ownable.sol";

contract PromotedDapp is Ownable{

    uint price;
    address tokenOwner;
    uint nextOwnerAllowed;

    constructor() public {
        owner = msg.sender;
    }

    function becomeOwner() public {
        require(now >= nextOwner);
        nextOwnerAllowed = now + 604800; // In a week
        tokenOwner = msg.sender;
    }

}

Sé que otra opción es trabajar con blockHeight ya que se acuña un bloque +/- cada 10 segundos, ¿cuál sería la razón para elegir blockHeight con el tiempo en segundos?

Corrección: se extrae un bloque cada 10 segundos aproximadamente .
Tienes toda la razón, editado.

Respuestas (1)

El tiempo es algo interesante en la cadena de bloques. Las dos opciones son usar el tiempo (o la marca de tiempo) y la altura del bloque.

Por lo general , no se recomienda el número de bloque , ya que el tiempo promedio de bloque es de 15 s. Debido a que es promedio, esto significa que los bloques pueden ser más cortos (1 s) o más largos (1 min+). Dependiendo de su aplicación, esta variación podría estropear sus cálculos. Además, si bien los tiempos de bloqueo son ~15 segundos ahora, eso puede cambiar en el futuro debido a la edad de hielo o posibles actualizaciones futuras que reduzcan este número. Nuevamente, casi nunca es una buena idea usar el número de bloque.

Las marcas de tiempo generalmente se recomiendan en un código como este. Los mineros envían marcas de tiempo en Ethereum en cada bloque que extraen. Hay reglas que rodean esto para evitar cualquier acción maliciosa: los mineros no pueden enviar una marca de tiempo que sea menor que la del bloque anterior y no pueden enviar una que sea mayor a 15 segundos en el futuro. Debido a estos límites, usar una marca de tiempo en Solidity es una opción mucho mejor.

Parece que para mi aplicación, las marcas de tiempo son sin duda la mejor manera de hacerlo, un margen de 15 segundos no importaría. muchas gracias shan :)