// Misst BIP110/RDTS-Signalisierung (Version-Bit 4) der letzten N Bloecke // direkt aus mempool.space-Daten. // Nutzung: node bip110-messung.js [N=144] — letzte N Bloecke // --testnet4 als erstes Argument: misst testnet4 statt mainnet // node bip110-messung.js seit — alle Bloecke ab // (Aktivierungsnacht: node bip110-messung.js seit 961632) (async () => { let BASE = 'https://mempool.space/api'; if (process.argv[2] === '--testnet4') { BASE = 'https://mempool.space/testnet4/api'; process.argv.splice(2, 1); } const tip = Number(await (await fetch(BASE + '/blocks/tip/height')).text()); let N; if (process.argv[2] === 'seit') { const von = Number(process.argv[3]); N = tip - von + 1; if (N < 1) { console.log(`Block ${von} liegt in der Zukunft (Tip ${tip}, noch ${von - tip} Bloecke).`); return; } } else { N = Number(process.argv[2] || 144); } const blocks = []; let h = tip; while (blocks.length < N) { const batch = await (await fetch(BASE + '/v1/blocks/' + h)).json(); for (const b of batch) { if (blocks.length < N) blocks.push(b); } h = blocks[blocks.length - 1].height - 1; } const sig = blocks.filter(b => (b.version >> 4) & 1); const byPool = {}; for (const b of blocks) { const pool = (b.extras && b.extras.pool && b.extras.pool.name) || 'unbekannt'; byPool[pool] = byPool[pool] || { total: 0, sig: 0 }; byPool[pool].total++; if ((b.version >> 4) & 1) byPool[pool].sig++; } console.log(`Tip: ${tip}. Bis Block 961632: ${961632 - tip} Bloecke.`); console.log(`Signalisierung (Bit 4) in den letzten ${N} Bloecken: ${sig.length}/${N} = ${(100 * sig.length / N).toFixed(1)}%`); console.log('\nNach Pool (signalisiert/gesamt):'); for (const [pool, s] of Object.entries(byPool).sort((a, b) => b[1].total - a[1].total)) { console.log(` ${pool}: ${s.sig}/${s.total}${s.sig ? ' <-- SIGNALISIERT' : ''}`); } console.log('\nSignalisierende Bloecke:'); for (const b of sig) { console.log(` ${b.height} ${(b.extras && b.extras.pool && b.extras.pool.name) || '?'} v=0x${b.version.toString(16)}`); } })();