Skip to content

Commit

Permalink
Putting FormFromStore into a single place
Browse files Browse the repository at this point in the history
  • Loading branch information
ineiti committed Feb 28, 2024
1 parent ce0652f commit 1e82c70
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 249 deletions.
51 changes: 8 additions & 43 deletions contracts/evoting/controller/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {

fmt.Fprintln(ctx.Out, "Get form")

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand Down Expand Up @@ -420,7 +420,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {

dela.Logger.Info().Msg(responseBody + respBody)

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand All @@ -444,7 +444,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {
return xerrors.Errorf("failed to close form: %v", err)
}

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand Down Expand Up @@ -482,7 +482,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {

// time.Sleep(20 * time.Second)

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand All @@ -506,7 +506,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {

time.Sleep(10 * time.Second)

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand All @@ -525,7 +525,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {
return xerrors.Errorf("failed to combine shares: %v", err)
}

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand All @@ -540,7 +540,7 @@ func (a *scenarioTestAction) Execute(ctx node.Context) error {

fmt.Fprintln(ctx.Out, "Get form result")

form, err = getForm(serdecontext, formFac, formID, service)
form, err = types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return xerrors.Errorf(getFormErr, err)
}
Expand Down Expand Up @@ -639,7 +639,7 @@ func setupSimpleForm(ctx node.Context, secret kyber.Scalar, proxyAddr1 string,
return "", types.Form{}, nil, xerrors.Errorf("failed to decode formID '%s': %v", formID, err)
}

form, err := getForm(serdecontext, formFac, formID, service)
form, err := types.FormFromStore(serdecontext, formFac, formID, service.GetStore())
if err != nil {
return "", types.Form{}, nil, xerrors.Errorf(getFormErr, err)
}
Expand Down Expand Up @@ -811,41 +811,6 @@ func updateDKG(secret kyber.Scalar, proxyAddr, formIDHex, action string) (int, e
return 0, nil
}

// getForm gets the form from the snap. Returns the form ID NOT hex
// encoded.
func getForm(ctx serde.Context, formFac serde.Factory, formIDHex string,
srv ordering.Service) (types.Form, error) {

var form types.Form

formID, err := hex.DecodeString(formIDHex)
if err != nil {
return form, xerrors.Errorf("failed to decode formIDHex: %v", err)
}

proof, err := srv.GetProof(formID)
if err != nil {
return form, xerrors.Errorf("failed to get proof: %v", err)
}

formBuff := proof.GetValue()
if len(formBuff) == 0 {
return form, xerrors.Errorf("form does not exist")
}

message, err := formFac.Deserialize(ctx, formBuff)
if err != nil {
return form, xerrors.Errorf("failed to deserialize Form: %v", err)
}

form, ok := message.(types.Form)
if !ok {
return form, xerrors.Errorf("wrong message type: %T", message)
}

return form, nil
}

func createSignedErr(err error) error {
return xerrors.Errorf("failed to create signed request: %v", err)
}
Expand Down
17 changes: 1 addition & 16 deletions contracts/evoting/evoting.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions contracts/evoting/types/election.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,39 @@ func (e FormFactory) Deserialize(ctx serde.Context, data []byte) (serde.Message,
return message, nil
}

// FormFromStore returns a form from the store given the formIDHex.
// An error indicates a wrong storage of the form.
func FormFromStore(ctx serde.Context, formFac serde.Factory, formIDHex string,
store store.Readable) (Form, error) {

form := Form{}

formIDBuf, err := hex.DecodeString(formIDHex)
if err != nil {
return form, xerrors.Errorf("failed to decode formIDHex: %v", err)
}

formBuff, err := store.Get(formIDBuf)
if err != nil {
return form, xerrors.Errorf("while getting data for form: %v", err)
}
if len(formBuff) == 0 {
return form, xerrors.Errorf("no form found")
}

message, err := formFac.Deserialize(ctx, formBuff)
if err != nil {
return form, xerrors.Errorf("failed to deserialize Form: %v", err)
}

form, ok := message.(Form)
if !ok {
return form, xerrors.Errorf("wrong message type: %T", message)
}

return form, nil
}

// ChunksPerBallot returns the number of chunks of El Gamal pairs needed to
// represent an encrypted ballot, knowing that one chunk is 29 bytes at most.
func (e *Form) ChunksPerBallot() int {
Expand Down
23 changes: 1 addition & 22 deletions integration/form.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,28 +137,7 @@ func openForm(m txManager, formID []byte) error {
func getForm(formFac serde.Factory, formID []byte,
service ordering.Service) (types.Form, error) {

form := types.Form{}

proof, err := service.GetProof(formID)
if err != nil {
return form, xerrors.Errorf("failed to GetProof: %v", err)
}

if proof == nil {
return form, xerrors.Errorf("form does not exist: %v", err)
}

message, err := formFac.Deserialize(serdecontext, proof.GetValue())
if err != nil {
return form, xerrors.Errorf("failed to deserialize Form: %v", err)
}

form, ok := message.(types.Form)
if !ok {
return form, xerrors.Errorf("wrong message type: %T", message)
}

return form, nil
return types.FormFromStore(serdecontext, formFac, hex.EncodeToString(formID), service.GetStore())
}

// for integration tests
Expand Down
51 changes: 7 additions & 44 deletions proxy/election.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ func (h *form) closeForm(formIDHex string, w http.ResponseWriter, r *http.Reques
// combineShares decrypts the shuffled ballots in a form.
func (h *form) combineShares(formIDHex string, w http.ResponseWriter, r *http.Request) {

form, err := getForm(h.context, h.formFac, formIDHex, h.orderingSvc)
form, err := types.FormFromStore(h.context, h.formFac, formIDHex, h.orderingSvc.GetStore())
if err != nil {
http.Error(w, "failed to get form: "+err.Error(),
http.StatusInternalServerError)
Expand Down Expand Up @@ -410,7 +410,7 @@ func (h *form) Form(w http.ResponseWriter, r *http.Request) {
formID := vars["formID"]

// get the form
form, err := getForm(h.context, h.formFac, formID, h.orderingSvc)
form, err := types.FormFromStore(h.context, h.formFac, formID, h.orderingSvc.GetStore())
if err != nil {
http.Error(w, xerrors.Errorf("failed to get form: %v", err).Error(), http.StatusInternalServerError)
return
Expand Down Expand Up @@ -474,7 +474,7 @@ func (h *form) Forms(w http.ResponseWriter, r *http.Request) {

// get the forms
for i, id := range elecMD.FormsIDs {
form, err := getForm(h.context, h.formFac, id, h.orderingSvc)
form, err := types.FormFromStore(h.context, h.formFac, id, h.orderingSvc.GetStore())
if err != nil {
InternalError(w, r, xerrors.Errorf("failed to get form: %v", err), nil)
return
Expand Down Expand Up @@ -571,57 +571,20 @@ func (h *form) DeleteForm(w http.ResponseWriter, r *http.Request) {
func (h *form) getFormsMetadata() (types.FormsMetadata, error) {
var md types.FormsMetadata

proof, err := h.orderingSvc.GetProof([]byte(evoting.FormsMetadataKey))
store, err := h.orderingSvc.GetStore().Get([]byte(evoting.FormsMetadataKey))
if err != nil {
// if the proof doesn't exist we assume there is no metadata, thus no
// forms has been created so far.
return md, nil
}

// if there is not form created yet the metadata will be empty
if len(proof.GetValue()) == 0 {
// if there is no form created yet the metadata will be empty
if len(store) == 0 {
return types.FormsMetadata{}, nil
}

err = json.Unmarshal(proof.GetValue(), &md)
err = json.Unmarshal(store, &md)
if err != nil {
return md, xerrors.Errorf("failed to unmarshal FormMetadata: %v", err)
}

return md, nil
}

// getForm gets the form from the snap. Returns the form ID NOT hex
// encoded.
func getForm(ctx serde.Context, formFac serde.Factory, formIDHex string,
srv ordering.Service) (types.Form, error) {

var form types.Form

formIDBuf, err := hex.DecodeString(formIDHex)
if err != nil {
return form, xerrors.Errorf("failed to decode formIDHex: %v", err)
}

proof, err := srv.GetProof(formIDBuf)
if err != nil {
return form, xerrors.Errorf("failed to get proof: %v", err)
}

formBuff := proof.GetValue()
if len(formBuff) == 0 {
return form, xerrors.Errorf("form does not exist")
}

message, err := formFac.Deserialize(ctx, formBuff)
if err != nil {
return form, xerrors.Errorf("failed to deserialize Form: %v", err)
}

form, ok := message.(types.Form)
if !ok {
return form, xerrors.Errorf("wrong message type: %T", message)
}

return form, nil
}
36 changes: 2 additions & 34 deletions services/dkg/pedersen/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ func (h *Handler) handleDecryptRequest(formID string) error {
// loop until our transaction has been accepted, or enough nodes submitted
// their pubShares
for {
form, err := h.getForm(formID)
form, err := etypes.FormFromStore(h.context, h.formFac, formID, h.service.GetStore())
if err != nil {
return xerrors.Errorf("could not get the form: %v", err)
}
Expand Down Expand Up @@ -521,7 +521,7 @@ func (h *Handler) handleDecryptRequest(formID string) error {
// getShuffleIfValid allows checking if enough shuffles have been made on the
// ballots.
func (h *Handler) getShuffleIfValid(formID string) ([]etypes.ShuffleInstance, error) {
form, err := h.getForm(formID)
form, err := etypes.FormFromStore(h.context, h.formFac, formID, h.service.GetStore())
if err != nil {
return nil, xerrors.Errorf("could not get the form: %v", err)
}
Expand Down Expand Up @@ -874,35 +874,3 @@ func makeTx(ctx serde.Context, form *etypes.Form, pubShares etypes.PubsharesUnit

return tx, nil
}

// getForm gets the form from the service
func (h *Handler) getForm(formIDHex string) (etypes.Form, error) {
var form etypes.Form

formID, err := hex.DecodeString(formIDHex)
if err != nil {
return form, xerrors.Errorf("failed to decode formIDHex: %v", err)
}

proof, exists := formExists(h.service, formID)
if !exists {
return form, xerrors.Errorf("form does not exist: %v", err)
}

message, err := h.formFac.Deserialize(h.context, proof.GetValue())
if err != nil {
return form, xerrors.Errorf("failed to deserialize Form: %v", err)
}

form, ok := message.(etypes.Form)
if !ok {
return form, xerrors.Errorf("wrong message type: %T", message)
}

if formIDHex != form.FormID {
return form, xerrors.Errorf("formID do not match: %q != %q",
formIDHex, form.FormID)
}

return form, nil
}
Loading

0 comments on commit 1e82c70

Please sign in to comment.