Skip to content
Snippets Groups Projects
Commit dfd0ec66 authored by capossele's avatar capossele
Browse files

:sparkles: adds dRNG section in dashboard

parent 1ed1bbac
No related branches found
No related tags found
No related merge requests found
......@@ -19,5 +19,5 @@ func NewEvent() *Event {
}
func randomnessReceived(handler interface{}, params ...interface{}) {
handler.(func(*state.Randomness))(params[0].(*state.Randomness))
handler.(func(state.Randomness))(params[0].(state.Randomness))
}
package spa
import (
"encoding/hex"
"time"
"github.com/iotaledger/hive.go/daemon"
"github.com/iotaledger/hive.go/events"
"github.com/iotaledger/hive.go/workerpool"
"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tangle"
"github.com/iotaledger/goshimmer/packages/binary/drng/state"
"github.com/iotaledger/goshimmer/packages/shutdown"
"github.com/iotaledger/goshimmer/plugins/messagelayer"
"github.com/iotaledger/goshimmer/plugins/drng"
)
var drngLiveFeedWorkerCount = 1
......@@ -18,10 +18,16 @@ var drngLiveFeedWorkerQueueSize = 50
var drngLiveFeedWorkerPool *workerpool.WorkerPool
func configureDrngLiveFeed() {
liveFeedWorkerPool = workerpool.New(func(task workerpool.Task) {
task.Param(0).(*message.CachedMessage).Consume(func(message *message.Message) {
sendToAllWSClient(&msg{MsgTypeTx, &tx{message.Id().String(), 0}})
})
drngLiveFeedWorkerPool = workerpool.New(func(task workerpool.Task) {
newRandomness := task.Param(0).(state.Randomness)
log.Info(newRandomness)
sendToAllWSClient(&msg{MsgTypeDrng, &drngMsg{
Instance: drng.Instance.State.Committee().InstanceID,
DistributedPK: hex.EncodeToString(drng.Instance.State.Committee().DistributedPK),
Round: newRandomness.Round,
Randomness: hex.EncodeToString(newRandomness.Randomness[:32]),
Timestamp: newRandomness.Timestamp.Format("2 Jan 2006 15:04:05")}})
task.Return(nil)
}, workerpool.WorkerCount(drngLiveFeedWorkerCount), workerpool.QueueSize(drngLiveFeedWorkerQueueSize))
......@@ -29,23 +35,21 @@ func configureDrngLiveFeed() {
func runDrngLiveFeed() {
newMsgRateLimiter := time.NewTicker(time.Second / 10)
notifyNewMsg := events.NewClosure(func(message *message.CachedMessage, metadata *tangle.CachedMessageMetadata) {
metadata.Release()
notifyNewRandomness := events.NewClosure(func(message state.Randomness) {
select {
case <-newMsgRateLimiter.C:
drngLiveFeedWorkerPool.TrySubmit(message)
default:
message.Release()
}
})
daemon.BackgroundWorker("SPA[DrngUpdater]", func(shutdownSignal <-chan struct{}) {
messagelayer.Tangle.Events.TransactionAttached.Attach(notifyNewMsg)
drng.Instance.Events.Randomness.Attach(notifyNewRandomness)
drngLiveFeedWorkerPool.Start()
<-shutdownSignal
log.Info("Stopping SPA[DrngUpdater] ...")
messagelayer.Tangle.Events.TransactionAttached.Detach(notifyNewMsg)
drng.Instance.Events.Randomness.Detach(notifyNewRandomness)
newMsgRateLimiter.Stop()
drngLiveFeedWorkerPool.Stop()
log.Info("Stopping SPA[DrngUpdater] ... done")
......
This diff is collapsed.
......@@ -14,7 +14,7 @@ export class Drng extends React.Component<Props, any> {
render() {
return (
<Container>
<h3>dRNG Explorer</h3>
<h3>dRNG Beacons</h3>
<DrngLiveFeed/>
</Container>
);
......
......@@ -26,12 +26,14 @@ export class DrngLiveFeed extends React.Component<Props, any> {
<Card.Title>Live Feed</Card.Title>
<Row className={"mb-3"}>
<Col xs={12}>
<h6>Messages</h6>
<h6>Collective Beacons</h6>
<Table>
<thead>
<tr>
<td>ID</td>
<td>Random value</td>
<td>InstanceID</td>
<td>Round</td>
<td>Randomness</td>
<td>Timestamp</td>
</tr>
</thead>
<tbody>
......
......@@ -56,7 +56,7 @@ export class Root extends React.Component<Props, any> {
</LinkContainer>
<LinkContainer to="/drng">
<Nav.Link>
dRNG Explorer
dRNG
</Nav.Link>
</LinkContainer>
</Nav>
......
import {action, computed, observable} from 'mobx';
import {registerHandler, WSMsgType} from "app/misc/WS";
import * as React from "react";
import {Link} from 'react-router-dom';
import {RouterStore} from "mobx-react-router";
export class DrngMessage {
instanceId: number;
instance: number;
dpk: string;
round: number;
value: number;
timestamp: number;
}
class Msg {
hash: string;
randomValue: number;
randomness: string;
timestamp: string;
}
const liveFeedSize = 10;
export class DrngStore {
// live feed
@observable latest_msgs: Array<Msg> = [];
@observable latest_msgs: Array<DrngMessage> = [];
// queries
@observable msg: DrngMessage = null;
......@@ -37,9 +32,9 @@ export class DrngStore {
}
@action
addLiveFeed = (msg: Msg) => {
addLiveFeed = (msg: DrngMessage) => {
// prevent duplicates (should be fast with only size 10)
if (this.latest_msgs.findIndex((t) => t.hash == msg.hash) === -1) {
if (this.latest_msgs.findIndex((t) => t.round == msg.round) === -1) {
if (this.latest_msgs.length >= liveFeedSize) {
this.latest_msgs.shift();
}
......@@ -53,14 +48,18 @@ export class DrngStore {
for (let i = this.latest_msgs.length - 1; i >= 0; i--) {
let msg = this.latest_msgs[i];
feed.push(
<tr key={msg.hash}>
<tr key={msg.round}>
<td>
{msg.instance}
</td>
<td>
{msg.round}
</td>
<td>
<Link to={`/drng/msg/${msg.hash}`}>
{msg.hash.substr(0, 35)}
</Link>
{msg.randomness}
</td>
<td>
{msg.randomValue}
{msg.timestamp}
</td>
</tr>
);
......
This diff is collapsed.
......@@ -54,6 +54,7 @@ func configure(plugin *node.Plugin) {
}, workerpool.WorkerCount(wsSendWorkerCount), workerpool.QueueSize(wsSendWorkerQueueSize))
configureLiveFeed()
configureDrngLiveFeed()
}
func run(plugin *node.Plugin) {
......@@ -72,6 +73,7 @@ func run(plugin *node.Plugin) {
}, shutdown.ShutdownPrioritySPA)
runLiveFeed()
runDrngLiveFeed()
// allow any origin for websocket connections
upgrader.CheckOrigin = func(r *http.Request) bool {
......@@ -139,6 +141,14 @@ type tx struct {
Value int64 `json:"value"`
}
type drngMsg struct {
Instance uint32 `json:"instance"`
DistributedPK string `json:"dpk"`
Round uint64 `json:"round"`
Randomness string `json:"randomness"`
Timestamp string `json:"timestamp"`
}
type nodestatus struct {
ID string `json:"id"`
Version string `json:"version"`
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment