Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Ethstats operators authorize trusted nodes and verify signed stats #6

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add node names and validator groups
  • Loading branch information
diminator committed Oct 31, 2019
commit 4b2980c3d61b5c8a2548f161c14cc404b533f348
3 changes: 2 additions & 1 deletion app.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,9 @@ api.on('connection', function (spark) {

stats.block.validators.registered.forEach(validator => {
validator.registered = true
validator.elected = stats.block.validators.elected.indexOf(validator.address) >= 0
const node = Nodes.getNodeOrNew({ id: validator.address }, validator)
// TODO: only if new node
node.setValidatorData(validator)
return node.name
})

Expand Down
17 changes: 12 additions & 5 deletions lib/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,7 @@ var Node = function (data) {
if (!data.registered) {
this.init(data);
} else {
this.info.name = data.name
this.validatorData = data
this.stats.mining = true
this.trusted = true
this.id = data.address
this.setValidatorData(data)
}

if (!!data.address) {
Expand Down Expand Up @@ -158,6 +154,17 @@ Node.prototype.setStats = function (stats, history, callback) {
callback('Stats undefined', null);
}

Node.prototype.setValidatorData = function (validatorData) {
if (!_.isUndefined(validatorData)) {
this.validatorData = validatorData
this.info.name = validatorData.name
this.info.contact = validatorData.url
this.stats.mining = true
this.trusted = true
this.id = validatorData.address
}
}

Node.prototype.setBlock = function (block, history, callback) {
if (!_.isUndefined(block) && !_.isUndefined(block.number)) {
if (!_.isEqual(history, this.history) || !_.isEqual(block, this.stats.block)) {
Expand Down
1 change: 1 addition & 0 deletions lib/utils/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ var trusted = [
'enode://b1d8deee4e5f4faf9b7e8e7fbd5e19545632d9023ff10de55e2e7a37464c52d1d6fb3ac8cb011757558b37309b83d915de19ef86eb27fe13209cc02d0098ee1f',
'enode://7f8b950b57ef0189637375e1aab3c6cc089501063089242ccdfb3982045025feeb64fdf343b08f2534372f5d636fa6804150c14e40bc2d395057a834c6be3932',
'enode://bdfd59ddf34656cf8e0076367517281b68816b2a241f154f58c6178ce9d59e3031d294f406dd7799b9f3b5425e5ab592700a81f8a59918a5e209a8826204f40f',
'enode://44ab8ac122f38e4cf20534f3fee9fc04280ebd5d208cf5009fe2a4743ef4b9402f27761450fd01a4e6e813717d360909996c4d52b3071c3fba168bc7e0c5a0b5',
]

var banned = [];
Expand Down
14 changes: 11 additions & 3 deletions src/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ span.small-title span.small {
}

.big-info.chart {
height: 120px;
-webkit-box-sizing: border-box
height: 130px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}

Expand Down Expand Up @@ -354,7 +354,15 @@ nodepropagchart {
}

.th-nodename {
width: 300px;
width: 200px;
}

.nodeInfo {
overflow: hidden;
white-space: nowrap;
}

.nodeInfo>span {
text-overflow: ellipsis;
}

Expand Down
12 changes: 8 additions & 4 deletions src/js/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,15 +182,19 @@ angular.module('netStatsApp.filters', [])
return hash.substr(0, 8) + '..' + hash.substr(56, 8);
}
})
.filter('nameFilter', function() {
return function(name) {
if(typeof name === 'undefined')
return "?";
return name.substr(0, 30) + '..';
}
})
.filter('addressFilter', function() {
return function(address) {
if(typeof address === 'undefined')
return "?";

if(address.substr(0,2) === '0x')
address = address.substr(2,40);

return address.substr(0, 4) + '..' + address.substr(36, 4);
return address.substr(0, 10) + '..';
}
})
.filter('timeClass', function() {
Expand Down
23 changes: 11 additions & 12 deletions src/views/index.jade
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ block content
div.col-xs-2.stat-holder.xpull-right
div.big-info.chart.xdouble-chart.text-success
i.icon-check
span.small-title recent validators
span.small-title recent block proposers
div.blocks-holder(ng-repeat='miner in miners track by miner.miner', data-toggle="tooltip", data-placement="right", data-original-title="{{miner.blocks}}")
div.block-count(class="{{miner.blocks | minerBlocksClass : 'text-'}}") {{miner.blocks}}
div.small-title-miner {{miner.miner | minerNameFilter : miner.name}}
Expand All @@ -120,12 +120,14 @@ block content
i.icon-check-o(data-toggle="tooltip", data-placement="top", title="Pin nodes to display first", ng-click="orderTable(['-stats.block.number', 'stats.block.propagation'], false)")
th.th-nodename
i.icon-node(data-toggle="tooltip", data-placement="top", title="Node name", ng-click="orderTable(['info.name'], false)")
th.th-nodetype
i.icon-laptop(data-toggle="tooltip", data-placement="top", title="Node type", ng-click="orderTable(['info.node'], false)")
th.th-latency
i.icon-clock(data-toggle="tooltip", data-placement="top", title="Node latency", ng-click="orderTable(['stats.latency'], false)")
th.th-nodeaddress
i.icon-node(data-toggle="tooltip", data-placement="top", title="Node address", ng-click="orderTable(['address'], false)")
th.th-nodetype
i.icon-group(data-toggle="tooltip", data-placement="top", title="Validator Group", ng-click="orderTable(['validatorData.affiliation'], false)")
th
i.icon-check(data-toggle="tooltip", data-placement="top", title="Validating", ng-click="orderTable(['-stats.hashrate'], false)")
i.icon-link(data-toggle="tooltip", data-placement="top", title="Validating", ng-click="orderTable(['-stats.hashrate'], false)")
th
i.icon-check(data-toggle="tooltip", data-placement="top", title="Elected", ng-click="orderTable(['-stats.hashrate'], false)")
th
Expand All @@ -151,22 +153,19 @@ block content
td.td-nodecheck
i(ng-click="pinNode(node.id)", class="{{ node.pinned | nodePinClass }}", data-toggle="tooltip", data-placement="right", data-original-title="Click to {{ node.pinned ? 'un' : '' }}pin")
td.nodeInfo(rel="{{node.id}}")
span.small(data-toggle="tooltip", data-placement="top", data-html="true", data-original-title="{{node | geoTooltip}}") {{node.id}}
span.small  ({{node.info.ip}})  ({{node.address | addressFilter}})
a.small(href="https://github.com/ethereum/wiki/wiki/Network-Status#updating", target="_blank", data-toggle="tooltip", data-placement="top", data-html="true", data-original-title="Netstats client needs update.<br>Click this icon for instructions.", class="{{ node.info | nodeClientClass : currentApiVersion }}")
i.icon-warning-o
td
div.small(ng-bind-html="node.info.node | nodeVersion")
span.small(data-toggle="tooltip", data-placement="top", data-html="true", data-original-title="{{node | geoTooltip}}") {{node.info.name | nameFilter}}
td(class="{{ node.readable.latencyClass }}")
span.small {{ node.readable.latency }}
td.nodeInfo(rel="{{node.address}}")
span.small {{node.address | addressFilter }}
td.nodeInfo(rel="{{node.validatorData.affiliation}}")
span.small {{ node.validatorData.affiliation || "no affiliation" | nameFilter}}
td(class="{{ node.stats.mining | hashrateClass : node.stats.active }}", ng-bind-html="node.stats.hashrate | stakingFilter : node.stats.mining")
td(class="{{ node.stats.elected | hashrateClass : node.stats.elected }}", ng-bind-html="node.stats.elected | stakingFilter : node.stats.elected")
td(class="{{ node.stats.peers | peerClass : node.stats.active }}", style="padding-left: 11px;") {{node.stats.peers}}
td(style="padding-left: 15px;") {{node.stats.pending}}
td(class="{{ node.stats | blockClass : bestBlock }}")
span(class="{{ node.readable.forkMessage ? node.readable.forkClass : '' }}") {{'#'}}{{ node.stats.block.number | number }}
//- a.small(data-toggle="tooltip", data-placement="top", data-html="true", data-original-title="{{ node.readable.forkMessage }}", class="{{ node.readable.forkClass }}")
i.icon-warning-o
td(class="{{ node.stats | blockClass : bestBlock }}")
span.small {{node.stats.block.hash | hashFilter}}
td(style="padding-left: 14px;") {{node.stats.block.transactions.length || 0}}
Expand Down