Skip to content

Commit

Permalink
Storing actors
Browse files Browse the repository at this point in the history
  • Loading branch information
ineiti committed Feb 26, 2024
1 parent e4fe765 commit 0738d1d
Show file tree
Hide file tree
Showing 14 changed files with 160 additions and 118 deletions.
19 changes: 19 additions & 0 deletions Dockerfiles/Dockerfile.dela.local
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM golang:1.20.6-bookworm AS base
RUN apt-get update && apt-get install git
WORKDIR /go/d-voting
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
ENV GOCACHE=/root/.cache/go-build
WORKDIR /go/d-voting/cli/dvoting
RUN --mount=type=cache,target="/root/.cache/go-build" go install
# make sure we're using the same head as d-voting
RUN --mount=type=cache,target="/root/.cache/go-build" cd $( go list -f '{{.Dir}}' go.dedis.ch/dela )/cli/crypto && go install

FROM golang:1.20.6-bookworm
WORKDIR /usr/local/bin
COPY --from=base /go/bin/crypto .
COPY --from=base /go/bin/dvoting .
ENTRYPOINT ["/bin/bash", "-c", "dvoting --config /data/node start --postinstall --proxyaddr :$PROXYPORT --proxykey $PROXYKEY --listen tcp://0.0.0.0:2000 --public $PUBLIC_URL --routing tree --noTLS"]
CMD []
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@ build:
GOOS=windows GOARCH=amd64 go build -ldflags="-X $(versionFlag) -X $(timeFlag)" -o dvoting-windows-amd64-$(versionFile) ./cli/dvoting

deb: build
cd deb-package; ./build-deb.sh; cd ..
cd deb-package; ./build-deb.sh; cd ..

docker-dela:
docker buildx build --platform=linux/amd64 -f Dockerfiles/Dockerfile.dela.local \
-t ghcr.io/c4dt/d-voting-dela:separate_ballots --progress=plain .
docker push ghcr.io/c4dt/d-voting-dela:separate_ballots
2 changes: 1 addition & 1 deletion contracts/evoting/mod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ func TestCommand_CastVote(t *testing.T) {
form, ok := message.(types.Form)
require.True(t, ok)

require.Len(t, form.BallotCount, 1)
require.Equal(t, uint32(1), form.BallotCount)
suff, err := form.Suffragia(ctx, snap)
require.NoError(t, err)
require.True(t, castVote.Ballot.Equal(suff.Ciphervotes[0]))
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ require (
)

replace (
go.dedis.ch/dela => github.com/c4dt/dela v0.0.0-20240125143006-d9bfc5ad2f59
go.dedis.ch/dela => github.com/c4dt/dela v0.0.0-20240226124625-ad067e63453b
go.dedis.ch/dela-apps => github.com/c4dt/dela-apps v0.0.0-20231121155105-f3a8a6f4b3b8
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -399,8 +399,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/c4dt/dela v0.0.0-20240125143006-d9bfc5ad2f59 h1:mYFBc395DeUmimRIgB/Xk+AGXfuDcYWADM/qvocBkW4=
github.com/c4dt/dela v0.0.0-20240125143006-d9bfc5ad2f59/go.mod h1:Oh/WK8JMO0POQg7nR3u436u+HwsZwPqPzDWAasgmFAU=
github.com/c4dt/dela v0.0.0-20240226124625-ad067e63453b h1:T1Fh/c0FfXQzixPShyFWDDoe0et5jIiq6Wx57pb0CUM=
github.com/c4dt/dela v0.0.0-20240226124625-ad067e63453b/go.mod h1:Oh/WK8JMO0POQg7nR3u436u+HwsZwPqPzDWAasgmFAU=
github.com/c4dt/dela-apps v0.0.0-20231121155105-f3a8a6f4b3b8 h1:ELho4tnVG7lM3c2I42Q5IGNyuk/2FQCterA2zVQGvms=
github.com/c4dt/dela-apps v0.0.0-20231121155105-f3a8a6f4b3b8/go.mod h1:Rky9YH7R02zSOirr2BhhdJs/9VH4+rxqkQxHU3UTQRA=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down
2 changes: 1 addition & 1 deletion integration/dvotingdela.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ func newDVotingNode(t require.TestingT, path string, randSource rand.Source) dVo

formFac := etypes.NewFormFactory(etypes.CiphervoteFactory{}, rosterFac)

dkg := pedersen.NewPedersen(onet, srvc, pool, formFac, signer)
dkg := pedersen.NewPedersen(onet, srvc, db, pool, formFac, signer)

evoting.RegisterContract(exec, evoting.NewContract(accessService, dkg, rosterFac))

Expand Down
21 changes: 11 additions & 10 deletions proxy/election.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,12 @@ func (h *form) NewFormVote(w http.ResponseWriter, r *http.Request) {
return
}

// send the transaction's informations
h.mngr.SendTransactionInfo(w, txnID, lastBlock, txnmanager.UnknownTransactionStatus)

// send the transaction's information
err = h.mngr.SendTransactionInfo(w, txnID, lastBlock, txnmanager.UnknownTransactionStatus)
if err != nil {
http.Error(w, "couldn't send transaction info: "+err.Error(), http.StatusInternalServerError)
return
}
}

// EditForm implements proxy.Proxy
Expand Down Expand Up @@ -561,26 +564,24 @@ func (h *form) DeleteForm(w http.ResponseWriter, r *http.Request) {
return
}

// send the transaction's informations
// send the transaction's information
h.mngr.SendTransactionInfo(w, txnID, lastBlock, txnmanager.UnknownTransactionStatus)
}

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)
}
Expand Down
55 changes: 2 additions & 53 deletions services/dkg/pedersen/controller/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,30 +67,11 @@ func (a *initAction) Execute(ctx node.Context) error {
return xerrors.Errorf("failed to make client: %v", err)
}

actor, err := dkg.Listen(formIDBuf, signed.NewManager(signer, &client))
_, err = dkg.Listen(formIDBuf, signed.NewManager(signer, &client))
if err != nil {
return xerrors.Errorf("failed to start the RPC: %v", err)
}

dela.Logger.Info().Msg("DKG has been initialized successfully")

err = updateDKGStore(ctx.Injector, func(tx kv.WritableTx) error {
bucket, err := tx.GetBucketOrCreate([]byte(BucketName))
if err != nil {
return err
}

actorBuf, err := actor.MarshalJSON()
if err != nil {
return err
}

return bucket.Set(formIDBuf, actorBuf)
})
if err != nil {
return xerrors.Errorf("failed to update DKG store: %v", err)
}

dela.Logger.Info().Msgf("DKG was successfully linked to form %v", formIDBuf)

return nil
Expand Down Expand Up @@ -137,23 +118,6 @@ func (a *setupAction) Execute(ctx node.Context) error {
Hex("DKG public key", pubkeyBuf).
Msg("DKG public key")

err = updateDKGStore(ctx.Injector, func(tx kv.WritableTx) error {
bucket, err := tx.GetBucketOrCreate([]byte(BucketName))
if err != nil {
return err
}

actorBuf, err := actor.MarshalJSON()
if err != nil {
return err
}

return bucket.Set(formIDBuf, actorBuf)
})
if err != nil {
return xerrors.Errorf("failed to update DKG store: %v", err)
}

return nil
}

Expand Down Expand Up @@ -190,7 +154,7 @@ func (a *exportInfoAction) Execute(ctx node.Context) error {
}

err = db.View(func(tx kv.ReadableTx) error {
bucket := tx.GetBucket([]byte(BucketName))
bucket := tx.GetBucket([]byte(pedersen.BucketName))
if bucket == nil {
return nil
}
Expand Down Expand Up @@ -333,21 +297,6 @@ func (a *RegisterHandlersAction) Execute(ctx node.Context) error {
return nil
}

func updateDKGStore(inj node.Injector, fn func(kv.WritableTx) error) error {
var db kv.DB
err := inj.Resolve(&db)
if err != nil {
return xerrors.Errorf("failed to resolve db: %v", err)
}

err = db.Update(fn)
if err != nil {
return xerrors.Errorf("failed to update: %v", err)
}

return nil
}

func makeClient(inj node.Injector) (client, error) {
var service ordering.Service
err := inj.Resolve(&service)
Expand Down
3 changes: 2 additions & 1 deletion services/dkg/pedersen/controller/action_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"io"
"testing"

"github.com/c4dt/d-voting/services/dkg/pedersen"
"golang.org/x/xerrors"

"github.com/c4dt/d-voting/internal/testing/fake"
Expand Down Expand Up @@ -130,7 +131,7 @@ func TestSetupAction_Execute(t *testing.T) {

// Check that the map contains the actor
err = db.View(func(tx kv.ReadableTx) error {
bucket := tx.GetBucket([]byte(BucketName))
bucket := tx.GetBucket([]byte(pedersen.BucketName))
require.NotNil(t, bucket)

pubKeyBuf := bucket.Get(formIDBuf)
Expand Down
30 changes: 3 additions & 27 deletions services/dkg/pedersen/controller/mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@ package controller

import (
"encoding"
"encoding/json"
"path/filepath"

"github.com/c4dt/d-voting/contracts/evoting"
"go.dedis.ch/dela/core/txn/pool"
"go.dedis.ch/dela/core/txn/signed"
"go.dedis.ch/dela/crypto"
"go.dedis.ch/dela/crypto/bls"
"go.dedis.ch/dela/crypto/loader"

"github.com/c4dt/d-voting/contracts/evoting"
"github.com/c4dt/d-voting/services/dkg/pedersen"
"go.dedis.ch/dela/cli"
"go.dedis.ch/dela/cli/node"
Expand All @@ -27,8 +26,6 @@ import (
etypes "github.com/c4dt/d-voting/contracts/evoting/types"
)

// BucketName is the name of the bucket in the database.
const BucketName = "dkgmap"
const privateKeyFile = "private.key"

// NewController returns a new controller initializer
Expand Down Expand Up @@ -150,31 +147,10 @@ func (m controller) OnStart(ctx cli.Flags, inj node.Injector) error {

formFac := etypes.NewFormFactory(etypes.CiphervoteFactory{}, rosterFac)

dkg := pedersen.NewPedersen(no, srvc, p, formFac, signer)
dkg := pedersen.NewPedersen(no, srvc, db, p, formFac, signer)

// Use dkgMap to fill the actors map
err = db.View(func(tx kv.ReadableTx) error {
bucket := tx.GetBucket([]byte(BucketName))
if bucket == nil {
return nil
}

return bucket.ForEach(func(formIDBuf, handlerDataBuf []byte) error {

handlerData := pedersen.HandlerData{}
err = json.Unmarshal(handlerDataBuf, &handlerData)
if err != nil {
return err
}

_, err = dkg.NewActor(formIDBuf, p, signed.NewManager(signer, &client), handlerData)
if err != nil {
return err
}

return nil
})
})
err = dkg.ReadActors(signed.NewManager(signer, &client))
if err != nil {
return xerrors.Errorf("database read failed: %v", err)
}
Expand Down
30 changes: 25 additions & 5 deletions services/dkg/pedersen/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io"
"math/rand"
"sync"
Expand Down Expand Up @@ -293,6 +294,8 @@ func (h *Handler) doDKG(deals, resps *list.List, out mino.Sender, from mino.Addr
h.privShare = distKey.PriShare()
h.Unlock()

fmt.Println("*** PRIV SHARE STORED ***")

done := types.NewStartDone(distKey.Public())
err = <-out.Send(done, from)
if err != nil {
Expand Down Expand Up @@ -612,7 +615,7 @@ func (hd *HandlerData) MarshalJSON() ([]byte, error) {
return nil, err
}

return json.Marshal(&struct {
ret, err := json.Marshal(&struct {
StartRes []byte `json:",omitempty"`
PrivShare []byte `json:",omitempty"`
PubKey []byte
Expand All @@ -623,6 +626,9 @@ func (hd *HandlerData) MarshalJSON() ([]byte, error) {
PubKey: pubKeyBuf,
PrivKey: privKeyBuf,
})
fmt.Printf("Marshalled actor: (err=%v) %s\n", err, string(ret))

return ret, err
}

// UnmarshalJSON fills a HandlerData with previously marshalled data.
Expand All @@ -640,7 +646,10 @@ func (hd *HandlerData) UnmarshalJSON(data []byte) error {

// Unmarshal StartRes
hd.StartRes = &state{}
hd.StartRes.UnmarshalJSON(aux.StartRes)
err = hd.StartRes.UnmarshalJSON(aux.StartRes)
if err != nil {
return err
}

// Unmarshal PrivShare
if aux.PrivShare == nil {
Expand All @@ -655,7 +664,10 @@ func (hd *HandlerData) UnmarshalJSON(data []byte) error {
return err
}
privShareV := suite.Scalar()
privShareV.UnmarshalBinary(privShareBuf.V)
err = privShareV.UnmarshalBinary(privShareBuf.V)
if err != nil {
return err
}
privShare := &share.PriShare{
I: privShareBuf.I,
V: privShareV,
Expand All @@ -665,14 +677,22 @@ func (hd *HandlerData) UnmarshalJSON(data []byte) error {

// Unmarshal PubKey
pubKey := suite.Point()
pubKey.UnmarshalBinary(aux.PubKey)
err = pubKey.UnmarshalBinary(aux.PubKey)
if err != nil {
return err
}
hd.PubKey = pubKey

// Unmarshal PrivKey
privKey := suite.Scalar()
privKey.UnmarshalBinary(aux.PrivKey)
err = privKey.UnmarshalBinary(aux.PrivKey)
if err != nil {
return err
}
hd.PrivKey = privKey

fmt.Printf("Unmarshalled actor: %s -> %+v", string(data), hd)

return nil
}

Expand Down
Loading

0 comments on commit 0738d1d

Please sign in to comment.