diff --git a/packages/binary/drng/dispatcher.go b/packages/binary/drng/dispatcher.go index d1b1b66b3d03ca48e827bc000029c29971b8a127..8cc1beb9a753b04cd82cd075573e7e7da8abf57e 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 852cda3c1f75e01d73277e33834667f4a62e6739..6346aa334e5479772ddad4df4c1fc579f7e7615a 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 7dd2332d5408c211c2ad89c79a1f405a3afe1e6e..a3413dfa051b6ba3e7e3b38822c04277002a39ee 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