¿Alguien tiene una fórmula para la duración de los bloques dinámicos?

Quiero implementar esto, entonces, ¿alguien tiene una fórmula para la duración de los bloques dinámicos en lugar de un objetivo fijo de 10 minutos?

Esencialmente, tendrías que cambiar la dificultad de cada bloque o definir la dificultad en términos de tiempo transcurrido. AFAIR El Kimoto Gravity Well hace ambas cosas: ¿ Cómo regula la dificultad el Kimoto Gravity Well?
@Murch Ya uso Kimoto Gravity Bueno, ¿pero cambia la dificultad pero no la duración del bloqueo?
Lo siento, ha pasado un año desde que leí sobre KGW. Si no recuerdo mal, hubo algunas monedas alternativas que aceptaron bloques con una dificultad decreciente a medida que pasaba el tiempo, pensé que era KGW quien hizo eso, pero, por desgracia, parece que no recuerdo bien. Además, ahora que lo pienso, eso podría venir con algunos vectores de ataque únicos para reemplazar la hoja de la cadena al extraer un bloque de mayor dificultad con fecha anterior.
¿Cómo quieres que cambie la duración del bloque? Esa es la parte difícil. Después de eso, la fórmula es esencialmente la misma, uno de los parámetros de entrada (el tiempo de bloque objetivo), simplemente cambia.
@StephenM347 Quiero un intervalo más rápido cuando sea necesario y más lento si la red está infrautilizada. Un buen indicador podría ser la cantidad de transacciones en los últimos X bloques, creo. Pero tal vez hay mejores medidas? Pero, por ejemplo: si los últimos 100 bloques se llenan en más del 50 % del máximo permitido, aumente la velocidad. si están llenos menos del 50%, disminuya la velocidad. ¿qué piensas? Lo que será un desafío es que también me gusta tener un tamaño de bloque máximo flotante, por lo que el ejemplo anterior sería muy complejo de implementar, ya que el tamaño de bloque máximo también podría crecer mientras tanto :)
@Muis, tenga cuidado con soluciones como esa, suena fácil de manipular y los problemas introducidos podrían ser peores que los que está tratando de resolver.
@ StephenM347 Lo sé, es solo un experimento personal, no se dañará a ningún novato :)
Parece que lo que realmente quieres es una fórmula para mantener la duración del bloque estática y la dificultad del bloque dinámica.
@NickODell ¿No? Suponga que tiene una cadena que casi no recibe transacciones durante 10 años, pero debe estar lista para 1 mes de alto tráfico. Si acorta la duración del bloque para estar preparado, entonces tiene 10 años de bloques vacíos para almacenar. Si la duración fuera dinámica, podría tener bloques que abarquen 1 mes (solo 120 durante 10 años) y luego cambiar a 1 minuto cuando sea necesario.

Respuestas (2)

La duración del bloque solo está controlada por la dificultad (aunque indirectamente) y el hashrate de la red, por lo que le conviene aumentar la dificultad cuando hay muy pocas transacciones en los últimos X bloques, y viceversa, disminuir la dificultad cuando los bloques están demasiado llenos, pero también disminuir dificultad cuando hay un hashrate bajo, y aumenta la dificultad cuando hay un hashrate alto.

Al mismo tiempo, necesitaría incentivar la minería, por lo que es posible que desee tener una recompensa relativa al tiempo objetivo, en lugar de una constante por bloque, ya que, de lo contrario, los mineros podrían enviar spam a la red para aumentar los ingresos.

Un bosquejo

Digamos que nuestro objetivo es ajustarnos al mirar los últimos 100 bloques para bloques que están llenos al 50%.

findNewBlockTime():
  newTimeTarget = (avBlockInterval100)*(0.5/averageFullness); //shorter interval with many transactions, longer with less

setReward():
  newReward = newTimeTarget*totalIntervalReward/rewardInterval; //rewardInterval could be four years like Bitcoin, or some other interval, with four years totalIntervalReward would be 11.5M coins for first interval

calculateDifficulty():
  newDifficulty = sumDiffLast100/last100BlocksTime*newTimeTarget;

Quizás te interese lo que escribí sobre el tema aquí . Puede realizar un cambio de protocolo donde los mineros pueden elegir el "peso" de su bloque, y su decisión se puede usar para establecer los parámetros de frecuencia global.