Estimación de generación de tiempos de bloques programáticamente

¿Cuál es la forma correcta de estimar la generación de tiempo de bloques para la cadena con Web3?

Respuestas (4)

Porque sabemos que los tiempos de bloque no se superponen con el enfoque más fácil (tomando solo 3 consultas). Simplemente tome el bloque actual y un bloque X bloques antes del bloque actual, reste el tiempo del bloque antiguo del bloque nuevo. Eso le dará cuánto tiempo tomó X bloques. Buceé eso por X para obtener el tiempo promedio por bloque.

Así que aquí conX = 500

  var nowBlock;
  // Get the current block number
  web3.eth.getBlockNumber(function(err, nowBlockNumber) {
    // Get the current block
    web3.eth.getBlock(nowBlockNumber, function(err, nb) {
      nowBlock = nb;
      // Get the block 500 blocks ago
      web3.eth.getBlock(nowBlockNumber - 500, function(err, thenBlock) {
        // Take the average of the then and now timestamps
        KTC.averageBlockTime = (nowBlock.timestamp - thenBlock.timestamp) / 500.0;
      });
    });
  });
var avg = ((esperar web3.eth.getBlock(bloque)).timestamp - (esperar web3.eth.getBlock(block - 500)).timestamp) / 500;

Aquí hay una versión ampliada de la respuesta de Viktor Baranov que toma el promedio de los últimos 100 bloques.

const getBlockAverageTime = async () => {
  const span = 100
  const times = []
  const currentNumber = await web3.eth.getBlockNumber()
  const firstBlock = await web3.eth.getBlock(currentNumber - span)
  let prevTimestamp = firstBlock.timestamp

  for (let i = currentNumber - span + 1; i <= currentNumber; i++) {
    const block = await web3.eth.getBlock(i)
    let time = block.timestamp - prevTimestamp
    prevTimestamp = block.timestamp
    times.push(time)
  }

  return Math.round(times.reduce((a, b) => a + b) / times.length)
}
calculateBlockTimeGeneration(web3, function(err, blockTimeGeneration) {
    if (err) return console.log(err);
    console.log("Block time generation in seconds: " + blockTimeGeneration);
});


function calculateBlockTimeGeneration(web3, cb) {
    web3.eth.getBlockNumber(function(err, curBlock) {
        if (err) return cb(err);
        let prevBlock = curBlock - 1;
        let prevBlockInfo = web3.eth.getBlock(prevBlock);
        let curBlockInfo = web3.eth.getBlock(curBlock);
        let blockTimeGeneration = curBlockInfo.timestamp - prevBlockInfo.timestamp;
        cb(null, blockTimeGeneration);
    });
}

Por favor, publique su respuesta, si pudiera ser más fácil.

Los tiempos de bloque tienen una variación bastante alta, por lo que consideraría tomar el tiempo de bloque promedio de muchos bloques anteriores. Además, habrá cambios drásticos en actualizaciones clave como Metropolis, parte 2.
Este es solo el tiempo entre el último bloque y el anterior. Podría variar ampliamente de un par de bloques a otro. El valor de interés sería el tiempo medio de generación de bloques, ya sea el promedio durante un cierto período de tiempo o el promedio durante una cantidad de bloques. Supongo que la calculateBlockTimeGenerationfunción podría modificarse para mirar los últimos N bloques en lugar de solo el anterior, y tomar un promedio de la diferencia de tiempo entre cada par de bloques consecutivos.

Escribí dos artículos de Medium ( aquí y aquí ) que analizaban la producción de bloques por semana.

Observar cuántos bloques se producen durante una cantidad constante de tiempo del "mundo real" es revelador. El efecto de la bomba de dificultad (incluso si es de doble naturaleza) se vuelve obvio.

Todo lo que realmente hice fue escanear el bloque timestampsy cada vez que era domingo por la mañana a las 12:00 de la noche, imprimía el número de bloque desde el domingo anterior a la medianoche y sus diferencias para obtener blocks/week.