From 216fc7443e37f991a8c1e55e6db62d3e7eb3bae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lo=C3=AFs?= Date: Mon, 10 Apr 2017 21:40:33 +0200 Subject: [PATCH] add blockNumber page + change willMembers detail change willMembers detail : print certifications with same issuer if their "blockstamp validity status" is different --- lib/webserver.js | 290 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 246 insertions(+), 44 deletions(-) diff --git a/lib/webserver.js b/lib/webserver.js index 2c72a80..3edf2c8 100644 --- a/lib/webserver.js +++ b/lib/webserver.js @@ -10,6 +10,8 @@ const bodyParser = require('body-parser'); const fsreadline = require('./fs-readline.js'); +const blockChart = require('./blockChart.js'); + function timestampToDatetime(timestamp) { // Convertir le timestamp en datetime let tmptimestampExpireCertif = new Date(timestamp*1000);//tmpQueryGetTimeWrittenCert[0].medianTime)*1000); @@ -50,11 +52,12 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, ***************************************/ app.get('/willMembers', (req, res) => co(function *() { - + //var willMembersMod=willMembers.willMembers_(req, res, duniterServer, sigValidity, msValidity, sigWindow, idtyWindow); try { // get blockchain timestamp - let resultQueryCurrentBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime` FROM block ORDER BY `medianTime` DESC LIMIT 1 '); + let resultQueryCurrentBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block ORDER BY `medianTime` DESC LIMIT 1 '); const currentBlockchainTimestamp = resultQueryCurrentBlock[0].medianTime; + const currentBlockNumber = resultQueryCurrentBlock[0].number; // Initaliser les variables var contenu = ""; @@ -106,7 +109,7 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, // récupérer l'ensemble des certifications en attente destinées à l'identité courante let tmpQueryPendingCertifsList = yield duniterServer.dal.peerDAL.query( - 'SELECT `from`,`block_number`,`expires_on` FROM certifications_pending WHERE `to`=\''+resultQueryIdtys[i].pubkey+'\' AND `target`=\''+resultQueryIdtys[i].hash+'\' ORDER BY `expires_on` DESC'); + 'SELECT `from`,`block_number`,`block_hash`,`expires_on` FROM certifications_pending WHERE `to`=\''+resultQueryIdtys[i].pubkey+'\' AND `target`=\''+resultQueryIdtys[i].hash+'\' ORDER BY `expires_on` DESC'); // Calculer le nombre de certifications en attentes destinées au membre courant let nbPendingCertifs = tmpQueryPendingCertifsList.length; @@ -134,31 +137,32 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, { validBlockStamp = true; } - - // Vérifier que l'identité courant n'a pas déjà reçu d'autre(s) certification(s) de la part du même membre - let doubloonPendingCertif = false; - for (const idtyPendingCertifsList of idtysPendingCertifsList[i]) - { - if (idtyPendingCertifsList.from == tmpQueryGetUidIssuerPendingCert[0].uid) + + // Vérifier que l'identité courant n'a pas déjà reçu d'autre(s) certification(s) de la part du même membre ET dans le même état de validité du blockstamp + let doubloonPendingCertif = false; + for (const idtyPendingCertifsList of idtysPendingCertifsList[i]) { - doubloonPendingCertif = true; + if (idtyPendingCertifsList.from == tmpQueryGetUidIssuerPendingCert[0].uid && idtyPendingCertifsList.validBlockStamp == validBlockStamp) + { + doubloonPendingCertif = true; + } } - } - if (!doubloonPendingCertif) - { - // Stoker la liste des certifications en piscine qui n'ont pas encore expirées - if (tmpQueryPendingCertifsList[j].expires_on > currentBlockchainTimestamp) + if (!doubloonPendingCertif) { - idtysPendingCertifsList[i].push({ - from: tmpQueryGetUidIssuerPendingCert[0].uid, - blockNumber: tmpQueryPendingCertifsList[j].block_number, - timestampExpire: tmpQueryPendingCertifsList[j].expires_on, - timestampWritable: certTimestampWritable, - validBlockStamp: validBlockStamp - }); - nbValidPendingCertifs++; + // Stoker la liste des certifications en piscine qui n'ont pas encore expirées + if (tmpQueryPendingCertifsList[j].expires_on > currentBlockchainTimestamp) + { + idtysPendingCertifsList[i].push({ + from: tmpQueryGetUidIssuerPendingCert[0].uid, + blockNumber: tmpQueryPendingCertifsList[j].block_number, + timestampExpire: tmpQueryPendingCertifsList[j].expires_on, + timestampWritable: certTimestampWritable, + validBlockStamp: validBlockStamp + }); + nbValidPendingCertifs++; + } } - } + } } @@ -207,7 +211,7 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, blockNumber: idtysPendingCertifsList[i][idMin].blockNumber, timestampExpire: idtysPendingCertifsList[i][idMin].timestampExpire, timestampWritable: idtysPendingCertifsList[i][idMin].timestampWritable, - validBlockStamp: idtysPendingCertifsList[i][idMin].validBlockStamp + validBlockStamp: idtysPendingCertifsList[i][idMin].validBlockStamp }); // Exclure la valeur min avant de poursuivre le tri @@ -364,7 +368,8 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, contenu += '
'; contenu += '
'+tabTxt["LICENSE"]+'
'; contenu += ''+tabTxt["SRC"]+'

'; - contenu += ''+tabTxt["BLOCKCHAIN_TIME"]+' : '+timestampToDatetime(currentBlockchainTimestamp)+'. '; + contenu += ''+tabTxt["BLOCKCHAIN_TIME"]+' : '+timestampToDatetime(currentBlockchainTimestamp)+' '; + contenu += '(#'+currentBlockNumber+'). '; // On parcour toutes les identités var nbPrintMembers = 0; @@ -384,10 +389,6 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, { contenu += ""+tabTxt['COL_4']+""; } contenu += ""; } - - // Convertir timestamp en date - let tmpDateCreationIdty = new Date(idtysListOrdered[i]['creationTimestamp']*1000); - let tmpDateExpire = new Date((idtysListOrdered[i]['expires_on'])*1000); // Calculer la proportion de temps restant avant l'expiration de l'identité (en pour 200ème) let idtyProportion = ((idtysListOrdered[i]['expires_on']-currentBlockchainTimestamp)*200)/idtyWindow; @@ -425,6 +426,7 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, +parseInt(pendingSigProportion).toString(16)+parseInt(pendingSigProportion).toString(16); } else { colorPendingSig = "#FF8000"; } + // Printer la certification contenu += ""; @@ -432,11 +434,15 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, contenu += idtysListOrdered[i]['pendingCertifications'][j]['from'] +"
"+timestampToDatetime(idtysListOrdered[i]['pendingCertifications'][j]['timestampExpire']) +"
#"+idtysListOrdered[i]['pendingCertifications'][j]['blockNumber']; - if ( idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'] > currentBlockchainTimestamp ) + if (idtysListOrdered[i]['pendingCertifications'][j]['validBlockStamp'] == false) + { + contenu += "
["+tabTxt['INVALID_BLOCKSTAMP']+"]"; + } + else if ( idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'] > currentBlockchainTimestamp ) { contenu += "
["+timestampToDatetime(idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'])+"]"; } - else { contenu += "
"+tabTxt['SIG_PERIOD_OK']+""; } + else { contenu += "
["+tabTxt['SIG_PERIOD_OK']+"]"; } if (j == 4 ) { contenu += ""; } contenu += ""; } @@ -601,19 +607,30 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, // Vérifier que l'émetteur de la certification correspond à une identié connue if ( tmpQueryGetUidIssuerPendingCert.length > 0 ) { - // récupérer le timestamp d'écriture de la dernière certification écrite par l'émetteur - let tmpQueryLastIssuerCert = yield duniterServer.dal.peerDAL.query('SELECT `chainable_on` FROM c_index WHERE `issuer`=\''+tmpQueryPendingCertifsList[i].from+'\' ORDER BY `expires_on` DESC LIMIT 1'); - - // Stoker la liste des certifications en piscine qui n'ont pas encore expirées - if (tmpQueryPendingCertifsList[i].expires_on > currentBlockchainTimestamp) + // vérifier que l'émetteur de la certification n'a pas déjà certifié le membre m + let doubloonIssuer = false; + for(let j=0;j currentBlockchainTimestamp) + { + + + membersPendingCertifsList[m].push({ + from: tmpQueryGetUidIssuerPendingCert[0].uid, + blockNumber: tmpQueryPendingCertifsList[i].block_number, + timestampExpire: tmpQueryPendingCertifsList[i].expires_on, + timestampWritable: (tmpQueryLastIssuerCert[0].chainable_on) + }); + nbValidPendingCertifs++; + } } } } @@ -983,7 +1000,192 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow, res.status(500).send('
' + (e.stack || e.message) + '
'); } })); + + /**************************************** + * Lister les blocs calculés par membres + ***************************************/ + + app.get('/blockMembers', (req, res) => co(function *() { + try { + // get GET parameters + var begin = 0;// Default Value + if( typeof(req.query.begin) != 'undefined' ) { begin = req.query.begin; } + var end = -1;// Default Value is current timestamp + if( typeof(req.query.end) != 'undefined' ) { begin = req.query.end; } + + // get full blockchain + if (end >= begin && begin >= 0) + { + var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `number` < '+end+' AND `number` > '+begin+' ORDER BY `medianTime` ASC'); + } + else + { + var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `number` > '+begin+' ORDER BY `medianTime` ASC'); + } + //var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `medianTime` < '+end+' AND `medianTime` > '+begin+' ORDER BY `medianTime` ASC'); + + // get blockchain timestamp + const currentBlockNumber = blockchain.length-1; + const currentBlockchainTimestamp = blockchain[currentBlockNumber].medianTime; + + // get idtys list + var idtys = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`pub` FROM i_index WHERE `wasMember`=1'); + + // get current membersCount + const currentMembersCount = blockchain[currentBlockNumber].membersCount; + //console.log("blockchain[currentBlockNumber].membersCount %s", blockchain[currentBlockNumber].membersCount); + + // create and initialize tabNbBlockByMember and tabIndexMembers + var tabNbBlockByMember = [ [] ]; + var tabIndexMembers = []; + for (let i=0;i 0) + { + tabNbBlockByMember[m].meanNonce = (tabNbBlockByMember[m].meanNonce / (tabNbBlockByMember[m].nbBlocks*1000000000)).toFixed(0)+"*10^9"; + } + } + + // trier le tableau par ordre croissant de nbBlocks + var tabNbBlockByMemberSort = [ [] ]; + var tabExcluded = []; + for (let m=0;m max) + { + let exclude = false; + for (let e=0;e' + (e.stack || e.message) + ''); + } + })); + + /****************************************** + * Lister les infos de la monnaie M, N, etc + *****************************************/ + + app.get('/currency', (req, res) => co(function *() { + try { + // get GET parameters + var begin = 0;// Default Value + if( typeof(req.query.begin) != 'undefined' ) { begin = req.query.begin; } + var end = -1;// Default Value is current timestamp + if( typeof(req.query.end) != 'undefined' ) { begin = req.query.end; } + + // get full blockchain + if (end >= begin && begin >= 0) + { + var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`monetaryMass`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `number` < '+end+' AND `number` > '+begin+' ORDER BY `medianTime` ASC'); + } + else + { + var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`monetaryMass`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `number` > '+begin+' ORDER BY `medianTime` ASC'); + } + + // get blockchain timestamp + const currentBlockNumber = blockchain.length-1; + const currentBlockchainTimestamp = blockchain[currentBlockNumber].medianTime; + + // create and fill tabMembersCount, tabMonetaryMass, tabCurrency and currentDividend + var tabMembersCount = []; + var tabMonetaryMass = []; + var tabCurrency = []; + var currentDividend = 0; + let previousMemberCount = 0; + let previousMonetaryMass = 0; + for (let b=0;b 0 ) + { + currentDividend = blockchain[b].dividend; + } + previousMemberCount = blockchain[b].membersCount; + previousMonetaryMass = blockchain[b].monetaryMass; + } + } + console.log("currentDividend %s", currentDividend); + // create and fill tabRelativMonetaryMass + var tabRelativMonetaryMass = [] + for (let i=0;i' + (e.stack || e.message) + ''); + } + })); + // Lancer le serveur web let httpServer = http.createServer(app); httpServer.on('error', function(err) {