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