Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API for getting confirmed evil edges #509

Merged
merged 10 commits into from
Jan 4, 2024
1 change: 1 addition & 0 deletions api/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type EdgesProvider interface {
GetEdges(ctx context.Context) ([]protocol.SpecEdge, error)
GetEdge(ctx context.Context, hash common.Hash) (protocol.SpecEdge, error)
GetHonestConfirmableEdges(ctx context.Context) (map[string][]protocol.SpecEdge, error)
GetEvilConfirmedEdges(ctx context.Context) ([]protocol.SpecEdge, error)
ComputeHonestPathTimer(ctx context.Context, topLevelAssertionHash protocol.AssertionHash, edgeId protocol.EdgeId) (challengetree.PathTimer, challengetree.HonestAncestors, []challengetree.EdgeLocalTimer, error)
}

Expand Down
4 changes: 4 additions & 0 deletions api/data_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ func (f *FakeEdgesProvider) GetHonestConfirmableEdges(ctx context.Context) (map[
return honestConfirmableEdges, nil
}

func (f *FakeEdgesProvider) GetEvilConfirmedEdges(ctx context.Context) ([]protocol.SpecEdge, error) {
return f.Edges, nil
}

func (f *FakeEdgesProvider) ComputeHonestPathTimer(ctx context.Context, topLevelAssertionHash protocol.AssertionHash, edgeId protocol.EdgeId) (challengetree.PathTimer, challengetree.HonestAncestors, []challengetree.EdgeLocalTimer, error) {
return 0, nil, nil, nil
}
Expand Down
24 changes: 22 additions & 2 deletions api/method_edges.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ func (s *Server) listHonestEdgesHandler(w http.ResponseWriter, r *http.Request)
return
}

// TODO: Allow params to sort by other fields
sort.Slice(e, func(i, j int) bool {
return e[i].CreatedAtBlock < e[j].CreatedAtBlock
})
Expand All @@ -39,7 +38,6 @@ func (s *Server) listEdgesHandler(w http.ResponseWriter, r *http.Request) {
return
}

// TODO: Allow params to sort by other fields
sort.Slice(e, func(i, j int) bool {
return e[i].CreatedAtBlock < e[j].CreatedAtBlock
})
Expand Down Expand Up @@ -71,6 +69,28 @@ func (s *Server) listHonestConfirmableEdgesHandler(w http.ResponseWriter, r *htt
}
}

func (s *Server) listEvilConfirmedEdgesHandler(w http.ResponseWriter, r *http.Request) {
confirmedEvilEdges, err := s.edges.GetEvilConfirmedEdges(r.Context())
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
e, err := convertSpecEdgeEdgesToEdges(r.Context(), confirmedEvilEdges, s.edges)
if err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}

sort.Slice(e, func(i, j int) bool {
return e[i].CreatedAtBlock < e[j].CreatedAtBlock
})

if err := writeJSONResponse(w, 200, e); err != nil {
writeError(w, http.StatusInternalServerError, err)
return
}
}

func (s *Server) listMiniStakesHandler(w http.ResponseWriter, r *http.Request) {
specEdges, err := s.edges.GetEdges(r.Context())
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ func (s *Server) registerMethods() error {
s.router.HandleFunc("/edges", s.listEdgesHandler).Methods("GET")
s.router.HandleFunc("/edges/{id}", s.getEdgeHandler).Methods("GET")
s.router.HandleFunc("/honest-confirmable-edges", s.listHonestConfirmableEdgesHandler).Methods("GET")
s.router.HandleFunc("/evil-confirmed-edges", s.listEvilConfirmedEdgesHandler).Methods("GET")

// Stakes
s.router.HandleFunc("/mini-stakes", s.listMiniStakesHandler).Methods("GET")
Expand Down
29 changes: 29 additions & 0 deletions challenge-manager/chain-watcher/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,35 @@ func (w *Watcher) GetHonestConfirmableEdges(ctx context.Context) (map[string][]p
return confirmableEdges, nil
}

func (w *Watcher) GetEvilConfirmedEdges(ctx context.Context) ([]protocol.SpecEdge, error) {
edges, err := w.GetEdges(ctx)
if err != nil {
return nil, err
}
honestEdges := w.GetHonestEdges()
honestEdgesMap := make(map[common.Hash]protocol.SpecEdge)
for _, honestEdge := range honestEdges {
honestEdgesMap[honestEdge.Id().Hash] = honestEdge
}
evilEdges := make([]protocol.SpecEdge, 0)
for _, edge := range edges {
if _, ok := honestEdgesMap[edge.Id().Hash]; !ok {
evilEdges = append(evilEdges, edge)
}
}
evilConfirmedEdges := make([]protocol.SpecEdge, 0)
for _, evilEdge := range evilEdges {
status, err := evilEdge.Status(ctx)
if err != nil {
return nil, errors.Wrap(err, "could not get edge status")
}
if status == protocol.EdgeConfirmed {
evilConfirmedEdges = append(evilConfirmedEdges, evilEdge)
}
}
return evilConfirmedEdges, nil
}

// AddVerifiedHonestEdge adds an edge known to be honest to the chain watcher's internally
// tracked challenge trees and spawns an edge tracker for it. Should be called after the challenge
// manager creates a new edge, or bisects an edge and produces two children from that move.
Expand Down
Loading