diff --git a/fsm/fsm/fsm.go b/fsm/fsm/fsm.go index cdd5d8c..c4e8fe2 100644 --- a/fsm/fsm/fsm.go +++ b/fsm/fsm/fsm.go @@ -276,14 +276,24 @@ func MustNewFSM(machineName string, initialState State, events []EventDesc, call } // WithState returns FSM copy with custom setup state -func (f FSM) CopyWithState(state State) *FSM { +func (f *FSM) MustCopyWithState(state State) *FSM { + var exists bool + f.stateMu.RLock() defer f.stateMu.RUnlock() if state != "" { + for _, s := range f.StatesList() { + if s == state { + exists = true + } + } + if !exists { + panic(fmt.Sprintf("cannot set state, not exists \"%s\" for \"%s\"", state, f.name)) + } f.currentState = state } - return &f + return f } func (f *FSM) DoInternal(event Event, args ...interface{}) (resp *Response, err error) { @@ -468,7 +478,7 @@ func (f *FSM) EventsList() (events []Event) { return } -func (f *FSM) StatesSourcesList() (states []State) { +func (f *FSM) StatesList() (states []State) { var allStates = map[State]bool{} if len(f.transitions) > 0 { for trKey, _ := range f.transitions { diff --git a/fsm/fsm/fsm_machines_test.go b/fsm/fsm/fsm_test.go similarity index 93% rename from fsm/fsm/fsm_machines_test.go rename to fsm/fsm/fsm_test.go index 55ebc48..090881c 100644 --- a/fsm/fsm/fsm_machines_test.go +++ b/fsm/fsm/fsm_test.go @@ -297,7 +297,26 @@ func TestFSM_StatesList(t *testing.T) { stateStage2, } - if !compareStatesArr(testingFSM.StatesSourcesList(), statesList) { + if !compareStatesArr(testingFSM.StatesList(), statesList) { t.Error("expected states", statesList) } } + +func TestFSM_CopyWithState(t *testing.T) { + testingFSM1 := MustNewFSM( + testName, + stateInit, + testingEvents, + testingCallbacks, + ) + testingFSM2 := testingFSM.MustCopyWithState(stateStage2) + + if testingFSM1.State() != stateInit { + t.Fatal("expect unchanged source state") + } + + if testingFSM2.State() != stateStage2 { + t.Fatal("expect changed source state") + } + +} diff --git a/fsm/fsm_pool/fsm_pool.go b/fsm/fsm_pool/fsm_pool.go index e173a64..af30910 100644 --- a/fsm/fsm_pool/fsm_pool.go +++ b/fsm/fsm_pool/fsm_pool.go @@ -26,7 +26,7 @@ type MachineProvider interface { EventsList() []fsm.Event - StatesSourcesList() []fsm.State + StatesList() []fsm.State IsFinState(state fsm.State) bool } @@ -106,7 +106,7 @@ func Init(machines ...MachineProvider) *FSMPool { // Fill up states with initial and exit states checking for _, machine := range machines { machineName := machine.Name() - machineStates := machine.StatesSourcesList() + machineStates := machine.StatesList() for _, state := range machineStates { if machine.IsFinState(state) { // If state is initial for another machine, diff --git a/fsm/state_machines/dkg_proposal_fsm/actions.go b/fsm/state_machines/dkg_proposal_fsm/actions.go index 4373ae1..1c48ea7 100644 --- a/fsm/state_machines/dkg_proposal_fsm/actions.go +++ b/fsm/state_machines/dkg_proposal_fsm/actions.go @@ -7,6 +7,7 @@ import ( "github.com/depools/dc4bc/fsm/fsm" "github.com/depools/dc4bc/fsm/state_machines/internal" "github.com/depools/dc4bc/fsm/types/requests" + "github.com/depools/dc4bc/fsm/types/responses" "reflect" ) @@ -49,7 +50,20 @@ func (m *DKGProposalFSM) actionInitDKGProposal(inEvent fsm.Event, args ...interf // Remove m.payload.SignatureProposalPayload? - return + // Make response + + responseData := make(responses.DKGProposalPubKeysParticipantResponse, 0) + + for participantId, participant := range m.payload.DKGProposalPayload.Quorum { + responseEntry := &responses.DKGProposalPubKeysParticipantEntry{ + ParticipantId: participantId, + Addr: participant.Addr, + DkgPubKey: participant.DkgPubKey, + } + responseData = append(responseData, responseEntry) + } + + return inEvent, responseData, nil } // Commits @@ -86,7 +100,7 @@ func (m *DKGProposalFSM) actionCommitConfirmationReceived(inEvent fsm.Event, arg return } - copy(dkgProposalParticipant.Commit, request.Commit) + copy(dkgProposalParticipant.DkgCommit, request.Commit) dkgProposalParticipant.Status = internal.CommitConfirmed dkgProposalParticipant.UpdatedAt = request.CreatedAt @@ -135,6 +149,21 @@ func (m *DKGProposalFSM) actionValidateDkgProposalAwaitCommits(inEvent fsm.Event participant.Status = internal.DealAwaitConfirmation } + // Make response + + responseData := make(responses.DKGProposalCommitParticipantResponse, 0) + + for participantId, participant := range m.payload.DKGProposalPayload.Quorum { + responseEntry := &responses.DKGProposalCommitParticipantEntry{ + ParticipantId: participantId, + Addr: participant.Addr, + DkgCommit: participant.DkgCommit, + } + responseData = append(responseData, responseEntry) + } + + response = responseData + return } @@ -172,7 +201,7 @@ func (m *DKGProposalFSM) actionDealConfirmationReceived(inEvent fsm.Event, args return } - copy(dkgProposalParticipant.Deal, request.Deal) + copy(dkgProposalParticipant.DkgDeal, request.Deal) dkgProposalParticipant.Status = internal.DealConfirmed dkgProposalParticipant.UpdatedAt = request.CreatedAt @@ -221,6 +250,21 @@ func (m *DKGProposalFSM) actionValidateDkgProposalAwaitDeals(inEvent fsm.Event, participant.Status = internal.ResponseAwaitConfirmation } + // Make response + + responseData := make(responses.DKGProposalDealParticipantResponse, 0) + + for participantId, participant := range m.payload.DKGProposalPayload.Quorum { + responseEntry := &responses.DKGProposalDealParticipantEntry{ + ParticipantId: participantId, + Addr: participant.Addr, + DkgDeal: participant.DkgDeal, + } + responseData = append(responseData, responseEntry) + } + + response = responseData + return } @@ -258,7 +302,7 @@ func (m *DKGProposalFSM) actionResponseConfirmationReceived(inEvent fsm.Event, a return } - copy(dkgProposalParticipant.Response, request.Response) + copy(dkgProposalParticipant.DkgResponse, request.Response) dkgProposalParticipant.Status = internal.ResponseConfirmed dkgProposalParticipant.UpdatedAt = request.CreatedAt @@ -307,6 +351,21 @@ func (m *DKGProposalFSM) actionValidateDkgProposalAwaitResponses(inEvent fsm.Eve participant.Status = internal.MasterKeyAwaitConfirmation } + // Make response + + responseData := make(responses.DKGProposalResponseParticipantResponse, 0) + + for participantId, participant := range m.payload.DKGProposalPayload.Quorum { + responseEntry := &responses.DKGProposalResponseParticipantEntry{ + ParticipantId: participantId, + Addr: participant.Addr, + DkgResponse: participant.DkgResponse, + } + responseData = append(responseData, responseEntry) + } + + response = responseData + return } @@ -344,7 +403,7 @@ func (m *DKGProposalFSM) actionMasterKeyConfirmationReceived(inEvent fsm.Event, return } - copy(dkgProposalParticipant.MasterKey, request.MasterKey) + copy(dkgProposalParticipant.DkgMasterKey, request.MasterKey) dkgProposalParticipant.Status = internal.MasterKeyConfirmed dkgProposalParticipant.UpdatedAt = request.CreatedAt @@ -375,7 +434,7 @@ func (m *DKGProposalFSM) actionValidateDkgProposalAwaitMasterKey(inEvent fsm.Eve if participant.Status == internal.MasterKeyConfirmationError { isContainsError = true } else if participant.Status == internal.MasterKeyConfirmed { - masterKeys = append(masterKeys, participant.MasterKey) + masterKeys = append(masterKeys, participant.DkgMasterKey) unconfirmedParticipants-- } } diff --git a/fsm/state_machines/dkg_proposal_fsm/init.go b/fsm/state_machines/dkg_proposal_fsm/init.go index df0fe94..6e268ce 100644 --- a/fsm/state_machines/dkg_proposal_fsm/init.go +++ b/fsm/state_machines/dkg_proposal_fsm/init.go @@ -170,6 +170,6 @@ func (m *DKGProposalFSM) WithSetup(state fsm.State, payload *internal.DumpedMach defer m.payloadMu.Unlock() m.payload = payload - m.FSM = m.FSM.CopyWithState(state) + m.FSM = m.FSM.MustCopyWithState(state) return m } diff --git a/fsm/state_machines/internal/provider.go b/fsm/state_machines/internal/provider.go index a2d569a..052eb41 100644 --- a/fsm/state_machines/internal/provider.go +++ b/fsm/state_machines/internal/provider.go @@ -2,7 +2,6 @@ package internal import ( "crypto/ed25519" - "encoding/hex" "errors" "github.com/depools/dc4bc/fsm/fsm" "github.com/depools/dc4bc/fsm/fsm_pool" @@ -119,12 +118,11 @@ func (p *DumpedMachineStatePayload) SigningQuorumUpdate(id int, participant *Sig return } -func (p *DumpedMachineStatePayload) SetAddrHexPubKey(addr string, pubKey ed25519.PublicKey) { +func (p *DumpedMachineStatePayload) SetPubKeyAddr(addr string, pubKey ed25519.PublicKey) { if p.PubKeys == nil { p.PubKeys = make(map[string]ed25519.PublicKey) } - hexAddr := hex.EncodeToString([]byte(addr)) - p.PubKeys[hexAddr] = pubKey + p.PubKeys[addr] = pubKey return } diff --git a/fsm/state_machines/internal/types.go b/fsm/state_machines/internal/types.go index 59dde60..08f5b49 100644 --- a/fsm/state_machines/internal/types.go +++ b/fsm/state_machines/internal/types.go @@ -74,15 +74,15 @@ const ( ) type DKGProposalParticipant struct { - Addr string - DkgPubKey []byte - Commit []byte - Deal []byte - Response []byte - MasterKey []byte - Status DKGParticipantStatus - Error error - UpdatedAt time.Time + Addr string + DkgPubKey []byte + DkgCommit []byte + DkgDeal []byte + DkgResponse []byte + DkgMasterKey []byte + Status DKGParticipantStatus + Error error + UpdatedAt time.Time } type DKGProposalQuorum map[int]*DKGProposalParticipant diff --git a/fsm/state_machines/signature_proposal_fsm/actions.go b/fsm/state_machines/signature_proposal_fsm/actions.go index 0941e76..a7c7893 100644 --- a/fsm/state_machines/signature_proposal_fsm/actions.go +++ b/fsm/state_machines/signature_proposal_fsm/actions.go @@ -48,7 +48,7 @@ func (m *SignatureProposalFSM) actionInitSignatureProposal(inEvent fsm.Event, ar UpdatedAt: request.CreatedAt, } - m.payload.SetAddrHexPubKey(participant.Addr, participant.PubKey) + m.payload.SetPubKeyAddr(participant.Addr, participant.PubKey) } // Checking fo quorum length @@ -61,15 +61,14 @@ func (m *SignatureProposalFSM) actionInitSignatureProposal(inEvent fsm.Event, ar responseData := make(responses.SignatureProposalParticipantInvitationsResponse, 0) - for participantId, proposal := range m.payload.SignatureProposalPayload.Quorum { + for participantId, participant := range m.payload.SignatureProposalPayload.Quorum { responseEntry := &responses.SignatureProposalParticipantInvitationEntry{ ParticipantId: participantId, - Addr: proposal.Addr, + Addr: participant.Addr, } responseData = append(responseData, responseEntry) } - // Change state return inEvent, responseData, nil } @@ -167,7 +166,6 @@ func (m *SignatureProposalFSM) actionValidateSignatureProposal(inEvent fsm.Event responseEntry := &responses.SignatureProposalParticipantStatusEntry{ ParticipantId: participantId, Addr: participant.Addr, - DkgPubKey: participant.DkgPubKey, Status: uint8(participant.Status), } responseData = append(responseData, responseEntry) @@ -186,7 +184,6 @@ func (m *SignatureProposalFSM) actionSignatureProposalCanceledByTimeout(inEvent responseEntry := &responses.SignatureProposalParticipantStatusEntry{ ParticipantId: participantId, Addr: participant.Addr, - DkgPubKey: participant.DkgPubKey, Status: uint8(participant.Status), } responseData = append(responseData, responseEntry) diff --git a/fsm/state_machines/signature_proposal_fsm/init.go b/fsm/state_machines/signature_proposal_fsm/init.go index 11a2509..cbce81e 100644 --- a/fsm/state_machines/signature_proposal_fsm/init.go +++ b/fsm/state_machines/signature_proposal_fsm/init.go @@ -87,6 +87,6 @@ func (m *SignatureProposalFSM) WithSetup(state fsm.State, payload *internal.Dump defer m.payloadMu.Unlock() m.payload = payload - m.FSM = m.FSM.CopyWithState(state) + m.FSM = m.FSM.MustCopyWithState(state) return m } diff --git a/fsm/state_machines/signing_proposal_fsm/actions.go b/fsm/state_machines/signing_proposal_fsm/actions.go index 05acc55..b7a8c9c 100644 --- a/fsm/state_machines/signing_proposal_fsm/actions.go +++ b/fsm/state_machines/signing_proposal_fsm/actions.go @@ -134,7 +134,7 @@ func (m *SigningProposalFSM) actionProposalResponseByParticipant(inEvent fsm.Eve return } - // copy(signingProposalParticipant.Commit, request.Commit) + // copy(signingProposalParticipant.DkgCommit, request.DkgCommit) switch inEvent { case EventConfirmSigningConfirmation: signingProposalParticipant.Status = internal.SigningConfirmed diff --git a/fsm/state_machines/signing_proposal_fsm/init.go b/fsm/state_machines/signing_proposal_fsm/init.go index 9f1b8d7..b2566ff 100644 --- a/fsm/state_machines/signing_proposal_fsm/init.go +++ b/fsm/state_machines/signing_proposal_fsm/init.go @@ -110,6 +110,6 @@ func (m *SigningProposalFSM) WithSetup(state fsm.State, payload *internal.Dumped defer m.payloadMu.Unlock() m.payload = payload - m.FSM = m.FSM.CopyWithState(state) + m.FSM = m.FSM.MustCopyWithState(state) return m } diff --git a/fsm/types/requests/signature_proposal.go b/fsm/types/requests/signature_proposal.go index 902f12f..3d72f12 100644 --- a/fsm/types/requests/signature_proposal.go +++ b/fsm/types/requests/signature_proposal.go @@ -13,7 +13,6 @@ type SignatureProposalParticipantsListRequest struct { } type SignatureProposalParticipantsEntry struct { - // Public title for address, such as name, nickname, organization Addr string PubKey []byte DkgPubKey []byte diff --git a/fsm/types/responses/dkg_proposal.go b/fsm/types/responses/dkg_proposal.go index 4271bff..ec3b232 100644 --- a/fsm/types/responses/dkg_proposal.go +++ b/fsm/types/responses/dkg_proposal.go @@ -1,19 +1,35 @@ package responses +type DKGProposalPubKeysParticipantResponse []*DKGProposalPubKeysParticipantEntry + +type DKGProposalPubKeysParticipantEntry struct { + ParticipantId int + Addr string + DkgPubKey []byte +} + type DKGProposalCommitParticipantResponse []*DKGProposalCommitParticipantEntry type DKGProposalCommitParticipantEntry struct { ParticipantId int - Title string - Commit []byte + Addr string + DkgCommit []byte } type DKGProposalDealParticipantResponse []*DKGProposalDealParticipantEntry type DKGProposalDealParticipantEntry struct { ParticipantId int - Title string - Deal []byte + Addr string + DkgDeal []byte +} + +type DKGProposalResponseParticipantResponse []*DKGProposalResponseParticipantEntry + +type DKGProposalResponseParticipantEntry struct { + ParticipantId int + Addr string + DkgResponse []byte } type DKGProposalResponsesParticipantResponse []*DKGProposalResponsesParticipantEntry