Skip to content

Commit

Permalink
add blockNumber page + change willMembers detail
Browse files Browse the repository at this point in the history
change willMembers detail : print certifications with same issuer if their "blockstamp validity status" is different
  • Loading branch information
Éloïs committed Apr 10, 2017
1 parent 525170b commit 216fc74
Showing 1 changed file with 246 additions and 44 deletions.
290 changes: 246 additions & 44 deletions lib/webserver.js
Expand Up @@ -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);
Expand Down Expand Up @@ -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 = "";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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++;
}
}
}

}
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -364,7 +368,8 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow,
contenu += '<br>';
contenu += '<div align="right"><a href="https://github.com/librelois/duniter-special-node-members/blob/master/LICENSE">'+tabTxt["LICENSE"]+'</a><br>';
contenu += '<a href="https://github.com/librelois/duniter-special-node-members/">'+tabTxt["SRC"]+'</a></div><br>';
contenu += '<b>'+tabTxt["BLOCKCHAIN_TIME"]+' : '+timestampToDatetime(currentBlockchainTimestamp)+'.</b> ';
contenu += '<b>'+tabTxt["BLOCKCHAIN_TIME"]+' : '+timestampToDatetime(currentBlockchainTimestamp)+'</b> ';
contenu += '(<b>#'+currentBlockNumber+'</b>). ';

// On parcour toutes les identités
var nbPrintMembers = 0;
Expand All @@ -384,10 +389,6 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow,
{ contenu += "<td align='left' colspan="+nbMaxCertifs+">"+tabTxt['COL_4']+"</td>"; }
contenu += "</tr>";
}

// 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;
Expand Down Expand Up @@ -425,18 +426,23 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow,
+parseInt(pendingSigProportion).toString(16)+parseInt(pendingSigProportion).toString(16);
}
else { colorPendingSig = "#FF8000"; }


// Printer la certification
contenu += "<td align='center' style=\"background:"+colorPendingSig+"\">";
if (j == 4 ) { contenu += "<b>"; }
contenu += idtysListOrdered[i]['pendingCertifications'][j]['from']
+"<br>"+timestampToDatetime(idtysListOrdered[i]['pendingCertifications'][j]['timestampExpire'])
+"<br>#"+idtysListOrdered[i]['pendingCertifications'][j]['blockNumber'];
if ( idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'] > currentBlockchainTimestamp )
if (idtysListOrdered[i]['pendingCertifications'][j]['validBlockStamp'] == false)
{
contenu += "<br><font color='red'>["+tabTxt['INVALID_BLOCKSTAMP']+"]</font>";
}
else if ( idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'] > currentBlockchainTimestamp )
{
contenu += "<br><font color='DarkRed'>["+timestampToDatetime(idtysListOrdered[i]['pendingCertifications'][j]['timestampWritable'])+"]</font>";
}
else { contenu += "<br><font color='green'>"+tabTxt['SIG_PERIOD_OK']+"</font>"; }
else { contenu += "<br><font color='green'>["+tabTxt['SIG_PERIOD_OK']+"]</font>"; }
if (j == 4 ) { contenu += "</b>"; }
contenu += "</td>";
}
Expand Down Expand Up @@ -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<membersCertifsList[m].length;j++)
{
membersPendingCertifsList[m].push({
from: tmpQueryGetUidIssuerPendingCert[0].uid,
blockNumber: tmpQueryPendingCertifsList[i].block_number,
timestampExpire: tmpQueryPendingCertifsList[i].expires_on,
timestampWritable: (tmpQueryLastIssuerCert[0].chainable_on)
});
nbValidPendingCertifs++;
if (membersCertifsList[m][j].issuer == tmpQueryGetUidIssuerPendingCert[0].uid) { doubloonIssuer = true; }
}
if (!doubloonIssuer)
{
// 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)
{


membersPendingCertifsList[m].push({
from: tmpQueryGetUidIssuerPendingCert[0].uid,
blockNumber: tmpQueryPendingCertifsList[i].block_number,
timestampExpire: tmpQueryPendingCertifsList[i].expires_on,
timestampWritable: (tmpQueryLastIssuerCert[0].chainable_on)
});
nbValidPendingCertifs++;
}
}
}
}
Expand Down Expand Up @@ -983,7 +1000,192 @@ module.exports = (host, port, duniterServer, sigValidity, msValidity, sigWindow,
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));

/****************************************
* 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<idtys.length;i++)
{
tabNbBlockByMember.push ({
uid: idtys[i].uid,
pubkey: idtys[i].pub,
nbBlocks: 0,
writtenPercent: 0,
meanNonce: 0
});
tabIndexMembers[idtys[i].pub] = i;
}

for (let b=0;b<=currentBlockNumber;b++)
{
for (let m=0;m<tabNbBlockByMember.length;m++)
{
if (tabNbBlockByMember[m].pubkey == blockchain[b].issuer)
{
tabNbBlockByMember[m].nbBlocks++;
tabNbBlockByMember[m].meanNonce += blockchain[b].nonce;
}
}
}

// calculate writtenPercent and meanNonce
for (let m=0;m<tabNbBlockByMember.length;m++)
{
tabNbBlockByMember[m].writtenPercent = ((tabNbBlockByMember[m].nbBlocks * 100) / (currentBlockNumber+1)).toFixed(2);
if (tabNbBlockByMember[m].nbBlocks > 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<tabNbBlockByMember.length;m++)
{
let max = -1;
let idMax = 0;
for (let m2=0;m2<tabNbBlockByMember.length;m2++)
{
if (tabNbBlockByMember[m2].nbBlocks > max)
{
let exclude = false;
for (let e=0;e<tabExcluded.length;e++)
{
if (tabExcluded[e] == tabNbBlockByMember[m2].uid) { exclude = true; }
}
if (!exclude)
{
max = tabNbBlockByMember[m2].nbBlocks;
idMax = m2;
}
}
}
tabNbBlockByMemberSort[m] = tabNbBlockByMember[idMax];
tabExcluded.push(tabNbBlockByMember[idMax].uid);
}

// Appeler le module blockChart
let blockChartMod = blockChart(req, res, tabNbBlockByMemberSort, currentBlockNumber);

// renvoyer les données en JSON
//var response = JSON.stringify(tabNbBlockByMemberSort);
//res.status(200).send(response);

} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));

/******************************************
* 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<blockchain.length;b++)
{
if (blockchain[b].membersCount != previousMemberCount || blockchain[b].monetaryMass != previousMonetaryMass)
{
tabMembersCount.push(blockchain[b].membersCount);
tabMonetaryMass.push(blockchain[b].monetaryMass);
tabCurrency.push({
blockNumber: b,
timestamp: blockchain[b].medianTime,
membersCount: blockchain[b].membersCount,
monetaryMass: blockchain[b].monetaryMass,
relativMonetaryMass: 0
});

if ( blockchain[b].dividend > 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<tabMonetaryMass.length;i++)
{
tabRelativMonetaryMass.push(tabMonetaryMass[i] / currentDividend);
tabCurrency[i].relativMonetaryMass = tabMonetaryMass[i] / currentDividend;
}

// Send JSON response
var response = JSON.stringify(tabCurrency);
res.status(200).send(response);

} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));

// Lancer le serveur web
let httpServer = http.createServer(app);
httpServer.on('error', function(err) {
Expand Down

0 comments on commit 216fc74

Please sign in to comment.