diff --git a/airgapped/bls.go b/airgapped/bls.go index c444c38..28ce81a 100644 --- a/airgapped/bls.go +++ b/airgapped/bls.go @@ -107,6 +107,7 @@ func (am *Machine) reconstructThresholdSignature(o *client.Operation) error { } response := client.ReconstructedSignature{ + SigningID: payload.SigningId, SrcPayload: payload.SrcPayload, Signature: reconstructedSignature, DKGRoundID: o.DKGIdentifier, diff --git a/client/client.go b/client/client.go index 1f0f8d4..5e88604 100644 --- a/client/client.go +++ b/client/client.go @@ -152,6 +152,7 @@ func (c *BaseClient) processSignature(message storage.Message) error { } func (c *BaseClient) ProcessMessage(message storage.Message) error { + // save broadcasted reconstructed signature if fsm.Event(message.Event) == types.SignatureReconstructed { if err := c.processSignature(message); err != nil { return fmt.Errorf("failed to process signature: %w", err) @@ -161,6 +162,9 @@ func (c *BaseClient) ProcessMessage(message storage.Message) error { } return nil } + + // save signing data to the same storage as we save signatures + // This allows easy to view signing data by CLI-command if fsm.Event(message.Event) == sipf.EventSigningStart { if err := c.processSignature(message); err != nil { return fmt.Errorf("failed to process signature: %w", err) diff --git a/client/flow_test.go b/client/flow_test.go index 0738c49..8e5044d 100644 --- a/client/flow_test.go +++ b/client/flow_test.go @@ -143,7 +143,7 @@ func RemoveContents(dir, mask string) error { func TestFullFlow(t *testing.T) { _ = RemoveContents("/tmp", "dc4bc_*") - //defer func() { _ = RemoveContents("/tmp", "dc4bc_*") }() + defer func() { _ = RemoveContents("/tmp", "dc4bc_*") }() var numNodes = 4 var threshold = 2 diff --git a/client/http_server.go b/client/http_server.go index 9884491..7404aed 100644 --- a/client/http_server.go +++ b/client/http_server.go @@ -363,6 +363,7 @@ func (c *BaseClient) proposeSignDataHandler(w http.ResponseWriter, r *http.Reque } messageDataSign := requests.SigningProposalStartRequest{ + SigningID: uuid.New().String(), ParticipantId: participantID, SrcPayload: req["data"], CreatedAt: time.Now(), diff --git a/client/state.go b/client/state.go index af5a4ea..aba9c0d 100644 --- a/client/state.go +++ b/client/state.go @@ -1,9 +1,7 @@ package client import ( - "crypto/md5" "encoding/binary" - "encoding/hex" "encoding/json" "errors" "fmt" @@ -340,11 +338,9 @@ func (s *LevelDBState) SaveSignature(signature types.ReconstructedSignature) err signatures = make(map[string][]types.ReconstructedSignature) } - dataHash := md5.Sum(signature.SrcPayload) - dataHashString := hex.EncodeToString(dataHash[:]) - sig := signatures[dataHashString] + sig := signatures[signature.SigningID] sig = append(sig, signature) - signatures[dataHashString] = sig + signatures[signature.SigningID] = sig signaturesJSON, err := json.Marshal(signatures) if err != nil { diff --git a/client/types/types.go b/client/types/types.go index 57b2772..027170e 100644 --- a/client/types/types.go +++ b/client/types/types.go @@ -23,6 +23,7 @@ const ( ) type ReconstructedSignature struct { + SigningID string SrcPayload []byte Signature []byte Username string diff --git a/cmd/dc4bc_cli/main.go b/cmd/dc4bc_cli/main.go index 4f323ed..d0ae381 100644 --- a/cmd/dc4bc_cli/main.go +++ b/cmd/dc4bc_cli/main.go @@ -121,7 +121,8 @@ func getOperationsCommand() *cobra.Command { return fmt.Errorf("failed to unmarshal operation payload") } msgHash := md5.Sum(payload.SrcPayload) - fmt.Printf("Hash of the message to sign - %s\n", hex.EncodeToString(msgHash[:])) + fmt.Printf("Hash of the data to sign - %s\n", hex.EncodeToString(msgHash[:])) + fmt.Printf("Signing ID: %s\n", payload.SigningId) } fmt.Println("-----------------------------------------------------") } @@ -165,8 +166,8 @@ func getSignaturesCommand() *cobra.Command { if signatures.ErrorMessage != "" { return fmt.Errorf("failed to get signatures: %s", signatures.ErrorMessage) } - for dataHash, signature := range signatures.Result { - fmt.Printf("Hash of the signing data: %s\n", dataHash) + for sigID, signature := range signatures.Result { + fmt.Printf("Signing ID: %s\n", sigID) for _, participantSig := range signature { fmt.Printf("\tDKG round ID: %s\n", participantSig.DKGRoundID) fmt.Printf("\tParticipant: %s\n", participantSig.Username) diff --git a/cmd/dc4bc_d/main.go b/cmd/dc4bc_d/main.go index b0e515e..1740358 100644 --- a/cmd/dc4bc_d/main.go +++ b/cmd/dc4bc_d/main.go @@ -182,8 +182,7 @@ func startClientCommand() *cobra.Command { log.Fatalf("Failed to init state client: %v", err) } - stg, err := storage.NewFileStorage("/tmp/dc4bc_storage") - //stg, err := storage.NewKafkaStorage(ctx, cfg.StorageDBDSN, cfg.StorageTopic) + stg, err := storage.NewKafkaStorage(ctx, cfg.StorageDBDSN, cfg.StorageTopic) if err != nil { log.Fatalf("Failed to init storage client: %v", err) } diff --git a/fsm/state_machines/provider_test.go b/fsm/state_machines/provider_test.go index b77be30..5c8aae5 100644 --- a/fsm/state_machines/provider_test.go +++ b/fsm/state_machines/provider_test.go @@ -897,6 +897,7 @@ func Test_SigningProposal_EventSigningStart(t *testing.T) { compareState(t, sif.StateSigningIdle, inState) fsmResponse, testFSMDump[sif.StateSigningAwaitConfirmations], err = testFSMInstance.Do(sif.EventSigningStart, requests.SigningProposalStartRequest{ + SigningID: "test-signing-id", ParticipantId: 1, SrcPayload: []byte("message to sign"), CreatedAt: time.Now(), diff --git a/fsm/state_machines/signing_proposal_fsm/actions.go b/fsm/state_machines/signing_proposal_fsm/actions.go index b5d01bc..ca62013 100644 --- a/fsm/state_machines/signing_proposal_fsm/actions.go +++ b/fsm/state_machines/signing_proposal_fsm/actions.go @@ -60,12 +60,7 @@ func (m *SigningProposalFSM) actionStartSigningProposal(inEvent fsm.Event, args return } - m.payload.SigningProposalPayload.SigningId, err = generateSigningId() - - if err != nil { - err = errors.New("cannot generate {SigningId}") - return - } + m.payload.SigningProposalPayload.SigningId = request.SigningID m.payload.SigningProposalPayload.InitiatorId = request.ParticipantId m.payload.SigningProposalPayload.SrcPayload = request.SrcPayload diff --git a/fsm/types/requests/signing_proposal.go b/fsm/types/requests/signing_proposal.go index c9e94b7..30f5da3 100644 --- a/fsm/types/requests/signing_proposal.go +++ b/fsm/types/requests/signing_proposal.go @@ -5,6 +5,7 @@ import "time" // States: "stage_signing_idle" // Events: "event_signing_start" type SigningProposalStartRequest struct { + SigningID string ParticipantId int SrcPayload []byte CreatedAt time.Time