¿Cómo puede agregar una cierta cantidad de meses a una marca de tiempo (uint)?

Estoy escribiendo un contrato que calculará el interés periódicamente utilizando la cantidad exacta de días en cada período. Entonces, por ejemplo, si uso del 1 de enero de 2018 al 31 de marzo de 2018 como ejemplo, habría 90 días en ese período. Luego necesito adelantar el período 3 meses para capturar el próximo trimestre de interés.

El código específico que estoy usando ahora es:

function nextPeriod() public {
    lastPeriodDate = currentPeriodDate;
    currentPeriodDate += 1 years/4;
}

Esto funciona pero es aproximado.

¿Alguien tiene alguna sugerencia?

¡Gracias!

phil

Respuestas (1)

En mi opinión , podría ser útil reformular la pregunta con un poco más de precisión.

Cuando dices "Necesito hacerlo", crea una pequeña duda sobre lo que se supone que debe suceder. Es difícil decir si necesita el contrato para determinar esto, o si necesita que el propietario del contrato determine esto, o alguien más. Esto será importante.

La solidez no tiene una monthpalabra y sospecho que esto se debe a la ambigüedad inherente, ya que los meses tienen diferentes números de días. Parece que "mes" y "30 días" se intercambian casualmente en una conversación informal, pero los contratos son más o menos lo contrario de lo informal. Habrá que definir, con precisión, qué se entiende por "mes" en el contexto del contrato.

Dejando a un lado la imprecisión de las marcas de tiempo, podría hacer algo como:

now + 30 days

Es decir, en el caso de que el contrato necesite poder resolverlo.

O bien, podría externalizarlo a un Oracle.

function setNextMonth(uint nextMonth) public onlyOwner ...

Es decir, en el caso de que quieras saber exactamente cuándo comienza cada mes y no quieras complicar demasiado el contrato.

Un tercer enfoque sería realizar un cálculo bastante engorroso, teniendo en cuenta el diferente número de días de cada mes y los años bisiestos. Esto empuja (bastante fuerte) contra el ideal del minimalismo en el diseño de contratos.

Incluso podría imaginarse el cómputo de fuentes colectivas a través de los mercados de opinión, ya que la elección correcta es obvia. En esa construcción, "el próximo mes" es el número de bloque decidido por mayoría en una plataforma como Auger o Gnosis.

Espero eso ayude.

gracias roberto Veo tus puntos. Edité la pregunta para agregar más precisión. Yo también entiendo lo que dices. No intentaré abusar de Solidity para hacer algo para lo que no fue diseñado, sino que pondré el trabajo pesado en el front-end de Javascript. Gracias por su esfuerzo en darme una respuesta completa y larga.