diff --git a/packages/binary/drng/dispatcher.go b/packages/binary/drng/dispatcher.go index 8cc1beb9a753b04cd82cd075573e7e7da8abf57e..1d72badc31619bdf1b98c546db5f70d600d9e97f 100644 --- a/packages/binary/drng/dispatcher.go +++ b/packages/binary/drng/dispatcher.go @@ -1,6 +1,7 @@ package drng import ( + "errors" "time" "github.com/iotaledger/goshimmer/packages/binary/drng/payload" @@ -12,14 +13,14 @@ import ( "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) -func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, payload *payload.Payload) { +func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, payload *payload.Payload) error { switch payload.SubType() { case header.CollectiveBeaconType(): // parse as CollectiveBeaconType marshalUtil := marshalutil.New(payload.Bytes()) parsedPayload, err := cb.Parse(marshalUtil) if err != nil { - return + return err } // trigger CollectiveBeaconEvent cbEvent := &events.CollectiveBeaconEvent{ @@ -35,12 +36,16 @@ func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, pa // process collectiveBeacon if err := collectiveBeacon.ProcessBeacon(drng.State, cbEvent); err != nil { - return + return err } + // trigger RandomnessEvent drng.Events.Randomness.Trigger(drng.State.Randomness()) + return nil + default: //do other stuff + return errors.New("subtype not implemented") } } diff --git a/packages/binary/drng/dispatcher_test.go b/packages/binary/drng/dispatcher_test.go new file mode 100644 index 0000000000000000000000000000000000000000..a97ca57fcfedcfffe59659903d8da8a745e2d6df --- /dev/null +++ b/packages/binary/drng/dispatcher_test.go @@ -0,0 +1,72 @@ +package drng + +import ( + "encoding/hex" + "testing" + "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/state" + "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon" + "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/events" + cbPayload "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/stretchr/testify/require" +) + +var ( + eventTest *events.CollectiveBeaconEvent + prevSignatureTest []byte + signatureTest []byte + dpkTest []byte + issuerPK ed25119.PublicKey + committeeTest *state.Committee + timestampTest time.Time + randomnessTest *state.Randomness +) + +func init() { + prevSignatureTest, _ = hex.DecodeString("ae9ba6d1445bffea8e66cb7d28fe5924e0a8d31b11b62a8710204e56e1ba84bc3694a3033e5793fcee6e75e956e5da3016cd0e22aa46fa419cd06343a7ff9d1e9c5c08f660f0bdec099e97ef99f470bb8c607ce9667a165e9caa474710f62ffd") + signatureTest, _ = hex.DecodeString("8dee56fae60dcad960f7176d0813d5415b930cf6e20c299ec2c2dfc5f2ad4903916fd462ba1abf5c32a5bfd94dcc8eba062d011a548d99df7fa1e3bbbc9a0455663d60f6ccc736c1d5b6de727dbe4427e21fb660925518be386265913f447c94") + dpkTest, _ = hex.DecodeString("a02fcd15edd52c8e134027491a43b597505b466d1679e88f70f927e57c45a93ae0765ff02fc2d015e3a02fd8748e2103") + timestampTest = time.Now() + + rand, _ := collectiveBeacon.GetRandomness(signatureTest) + randomnessTest = &state.Randomness{ + Round: 1, + Randomness: rand, + Timestamp: timestampTest, + } + + kp := ed25119.GenerateKeyPair() + issuerPK = kp.PublicKey + + committeeTest = &state.Committee{ + InstanceID: 1, + Threshold: 3, + Identities: []ed25119.PublicKey{issuerPK}, + DistributedPK: dpkTest, + } +} + +func dummyPayload() *cbPayload.Payload { + header := header.New(header.CollectiveBeaconType(), 0) + return cbPayload.New(header.Instance(), + 1, + prevSignatureTest, + signatureTest, + dpkTest) +} + +func TestDispatcher(t *testing.T) { + marshalUtil := marshalutil.New(dummyPayload().Bytes()) + parsedPayload, err := payload.Parse(marshalUtil) + require.NoError(t, err) + + drng := New(state.SetCommittee(committeeTest)) + err = drng.Dispatch(issuerPK, timestampTest, parsedPayload) + require.NoError(t, err) + require.Equal(t, *randomnessTest, drng.State.Randomness()) +} diff --git a/packages/binary/drng/payload/payload.go b/packages/binary/drng/payload/payload.go index 26e36989419897b54e882d8f31a7b35a39b4e727..3422447aa2e3d8c6ab67618909462ee72e82abe3 100644 --- a/packages/binary/drng/payload/payload.go +++ b/packages/binary/drng/payload/payload.go @@ -81,6 +81,9 @@ func FromBytes(bytes []byte, optionalTargetObject ...*Payload) (result *Payload, return } + // return the number of bytes we processed + consumedBytes = marshalUtil.ReadOffset() + // store bytes, so we don't have to marshal manually result.bytes = bytes[:consumedBytes] diff --git a/packages/binary/drng/state/state.go b/packages/binary/drng/state/state.go index c474638475038ca4cf3079b72e086b80f3844ec8..b0a89b50702d0dbfd7959072482dc1fd05638a56 100644 --- a/packages/binary/drng/state/state.go +++ b/packages/binary/drng/state/state.go @@ -19,7 +19,6 @@ type Committee struct { Identities []ed25119.PublicKey DistributedPK []byte } - type State struct { randomness *Randomness committe *Committee @@ -48,6 +47,9 @@ func (s *State) SetRandomness(r *Randomness) { func (s *State) Randomness() Randomness { s.mutex.RLock() defer s.mutex.RUnlock() + if s.randomness == nil { + return Randomness{} + } return *s.randomness } @@ -60,5 +62,8 @@ func (s *State) SetCommittee(c *Committee) { func (s *State) Committee() Committee { s.mutex.RLock() defer s.mutex.RUnlock() + if s.committe == nil { + return Committee{} + } return *s.committe } diff --git a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go index 6346aa334e5479772ddad4df4c1fc579f7e7615a..971e5559632d789ebbd61eaa4f5f68a5df19bc96 100644 --- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go +++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go @@ -33,7 +33,9 @@ func ProcessBeacon(drng *state.State, cb *events.CollectiveBeaconEvent) error { Randomness: randomness, 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 a3413dfa051b6ba3e7e3b38822c04277002a39ee..749a161b89f30522aac309916c38729f9aca1393 100644 --- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go +++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go @@ -56,7 +56,7 @@ func TestGetRandomness(t *testing.T) { require.NoError(t, err) } -func TestProcessTransaction(t *testing.T) { +func TestProcessBeacon(t *testing.T) { err := ProcessBeacon(stateTest, eventTest) require.NoError(t, err) } diff --git a/plugins/drng/plugin.go b/plugins/drng/plugin.go index e33da3903ec71f99d32a72f9848743426a32b0ff..9ee151798e793cbcef804156ea6ad59826f558dc 100644 --- a/plugins/drng/plugin.go +++ b/plugins/drng/plugin.go @@ -32,9 +32,12 @@ func configureEvents() { marshalUtil := marshalutil.New(transaction.GetPayload().Bytes()) parsedPayload, err := payload.Parse(marshalUtil) if err != nil { + //TODO: handle error return } - Instance.Dispatch(transaction.IssuerPublicKey(), transaction.IssuingTime(), parsedPayload) + if err := Instance.Dispatch(transaction.IssuerPublicKey(), transaction.IssuingTime(), parsedPayload); err != nil { + //TODO: handle error + } }) }))