From 65ff8bebdc65b7a3f729547490c444c48b9b2db7 Mon Sep 17 00:00:00 2001
From: capossele <angelocapossele@gmail.com>
Date: Fri, 20 Mar 2020 16:57:11 +0000
Subject: [PATCH] :recycle: refactors dispatcher

---
 packages/binary/drng/dispatcher.go            | 32 +++++++++++++--
 .../collectiveBeacon/collective_beacon.go     | 41 ++++---------------
 .../collective_beacon_test.go                 | 31 +++++++++++---
 3 files changed, 63 insertions(+), 41 deletions(-)

diff --git a/packages/binary/drng/dispatcher.go b/packages/binary/drng/dispatcher.go
index d1b1b66b..8cc1beb9 100644
--- a/packages/binary/drng/dispatcher.go
+++ b/packages/binary/drng/dispatcher.go
@@ -1,16 +1,40 @@
 package drng
 
 import (
+	"time"
+
+	"github.com/iotaledger/goshimmer/packages/binary/drng/payload"
 	"github.com/iotaledger/goshimmer/packages/binary/drng/payload/header"
 	"github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon"
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/events"
+	cb "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/marshalutil"
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 )
 
-func (drng *Instance) Dispatch(subtype header.Type, tx *transaction.Transaction) {
-	switch subtype {
+func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, payload *payload.Payload) {
+	switch payload.SubType() {
 	case header.CollectiveBeaconType():
+		// parse as CollectiveBeaconType
+		marshalUtil := marshalutil.New(payload.Bytes())
+		parsedPayload, err := cb.Parse(marshalUtil)
+		if err != nil {
+			return
+		}
+		// trigger CollectiveBeaconEvent
+		cbEvent := &events.CollectiveBeaconEvent{
+			IssuerPublicKey: issuer,
+			Timestamp:       timestamp,
+			InstanceID:      parsedPayload.Instance(),
+			Round:           parsedPayload.Round(),
+			PrevSignature:   parsedPayload.PrevSignature(),
+			Signature:       parsedPayload.Signature(),
+			Dpk:             parsedPayload.DistributedPK(),
+		}
+		drng.Events.CollectiveBeacon.Trigger(cbEvent)
+
 		// process collectiveBeacon
-		if err := collectiveBeacon.ProcessTransaction(drng.State, drng.Events.CollectiveBeacon, tx); err != nil {
+		if err := collectiveBeacon.ProcessBeacon(drng.State, cbEvent); err != nil {
 			return
 		}
 		// trigger RandomnessEvent
diff --git a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go
index 852cda3c..6346aa33 100644
--- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go
+++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go
@@ -8,53 +8,30 @@ import (
 	"github.com/drand/drand/key"
 	"github.com/iotaledger/goshimmer/packages/binary/drng/state"
 	"github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/events"
-	"github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/payload"
-	"github.com/iotaledger/goshimmer/packages/binary/marshalutil"
 	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 )
 
 // ProcessTransaction performs the following tasks:
-// 1 - parse as CollectiveBeaconType
-// 2 - trigger CollectiveBeaconEvent
-// 3 - verify that we have a valid random
-// 4 - update drng state
-func ProcessTransaction(drng *state.State, event events.CollectiveBeacon, tx *transaction.Transaction) error {
-	// 1 - parse as CollectiveBeaconType
-	marshalUtil := marshalutil.New(tx.GetPayload().Bytes())
-	parsedPayload, err := payload.Parse(marshalUtil)
-	if err != nil {
-		return err
-	}
-
-	// 2 - trigger CollectiveBeaconEvent
-	cbEvent := &events.CollectiveBeaconEvent{
-		IssuerPublicKey: tx.IssuerPublicKey(),
-		Timestamp:       tx.IssuingTime(),
-		InstanceID:      parsedPayload.Instance(),
-		Round:           parsedPayload.Round(),
-		PrevSignature:   parsedPayload.PrevSignature(),
-		Signature:       parsedPayload.Signature(),
-		Dpk:             parsedPayload.DistributedPK(),
-	}
-	event.Trigger(cbEvent)
+// - verify that we have a valid random
+// - update drng state
+func ProcessBeacon(drng *state.State, cb *events.CollectiveBeaconEvent) error {
 
-	// 3 - verify that we have a valid random
-	if err := VerifyCollectiveBeacon(drng, cbEvent); err != nil {
+	// verify that we have a valid random
+	if err := VerifyCollectiveBeacon(drng, cb); err != nil {
 		//TODO: handle error
 		return err
 	}
 
-	// 4 - update drng state
-	randomness, err := GetRandomness(cbEvent.Signature)
+	// update drng state
+	randomness, err := GetRandomness(cb.Signature)
 	if err != nil {
 		//TODO: handle error
 		return err
 	}
 	newRandomness := &state.Randomness{
-		Round:      cbEvent.Round,
+		Round:      cb.Round,
 		Randomness: randomness,
-		Timestamp:  cbEvent.Timestamp,
+		Timestamp:  cb.Timestamp,
 	}
 	drng.SetRandomness(newRandomness)
 	return nil
diff --git a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go
index 7dd2332d..a3413dfa 100644
--- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go
+++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go
@@ -4,7 +4,9 @@ import (
 	"encoding/hex"
 	"testing"
 
+	"github.com/iotaledger/goshimmer/packages/binary/drng/state"
 	"github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/events"
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 	"github.com/stretchr/testify/require"
 )
 
@@ -13,19 +15,33 @@ var (
 	prevSignatureTest []byte
 	signatureTest     []byte
 	dpkTest           []byte
+	issuerPK          ed25119.PublicKey
+	stateTest         *state.State
 )
 
 func init() {
 	prevSignatureTest, _ = hex.DecodeString("ae9ba6d1445bffea8e66cb7d28fe5924e0a8d31b11b62a8710204e56e1ba84bc3694a3033e5793fcee6e75e956e5da3016cd0e22aa46fa419cd06343a7ff9d1e9c5c08f660f0bdec099e97ef99f470bb8c607ce9667a165e9caa474710f62ffd")
 	signatureTest, _ = hex.DecodeString("8dee56fae60dcad960f7176d0813d5415b930cf6e20c299ec2c2dfc5f2ad4903916fd462ba1abf5c32a5bfd94dcc8eba062d011a548d99df7fa1e3bbbc9a0455663d60f6ccc736c1d5b6de727dbe4427e21fb660925518be386265913f447c94")
 	dpkTest, _ = hex.DecodeString("a02fcd15edd52c8e134027491a43b597505b466d1679e88f70f927e57c45a93ae0765ff02fc2d015e3a02fd8748e2103")
+	kp := ed25119.GenerateKeyPair()
+	issuerPK = kp.PublicKey
+
 	eventTest = &events.CollectiveBeaconEvent{
-		InstanceID:    1,
-		Round:         1,
-		PrevSignature: prevSignatureTest,
-		Signature:     signatureTest,
-		Dpk:           dpkTest,
+		IssuerPublicKey: issuerPK,
+		InstanceID:      1,
+		Round:           1,
+		PrevSignature:   prevSignatureTest,
+		Signature:       signatureTest,
+		Dpk:             dpkTest,
 	}
+
+	stateTest = state.New(state.SetCommittee(
+		&state.Committee{
+			InstanceID:    1,
+			Threshold:     3,
+			Identities:    []ed25119.PublicKey{issuerPK},
+			DistributedPK: dpkTest,
+		}))
 }
 
 func TestVerifySignature(t *testing.T) {
@@ -40,6 +56,11 @@ func TestGetRandomness(t *testing.T) {
 	require.NoError(t, err)
 }
 
+func TestProcessTransaction(t *testing.T) {
+	err := ProcessBeacon(stateTest, eventTest)
+	require.NoError(t, err)
+}
+
 // func dkgShares(t *testing.T, n, threshold int) *collectiveBeacon.Payload {
 // 	var priPoly *share.PriPoly
 // 	var pubPoly *share.PubPoly
-- 
GitLab