¿Cuál es la forma correcta de estimar la generación de tiempo de bloques para la cadena con Web3?
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;
});
});
});
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.
calculateBlockTimeGeneration
funció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 timestamps
y 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
.
EvgenyKolyakov