54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package http
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/mediocregopher/blog.mediocregopher.com/srv/http/apiutil"
|
|
)
|
|
|
|
func (a *api) newPowChallengeHandler() http.Handler {
|
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
challenge := a.params.PowManager.NewChallenge()
|
|
|
|
apiutil.JSONResult(rw, r, struct {
|
|
Seed string `json:"seed"`
|
|
Target uint32 `json:"target"`
|
|
}{
|
|
Seed: hex.EncodeToString(challenge.Seed),
|
|
Target: challenge.Target,
|
|
})
|
|
})
|
|
}
|
|
|
|
func (a *api) requirePowMiddleware(h http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
seedHex := r.FormValue("powSeed")
|
|
seed, err := hex.DecodeString(seedHex)
|
|
if err != nil || len(seed) == 0 {
|
|
apiutil.BadRequest(rw, r, errors.New("invalid powSeed"))
|
|
return
|
|
}
|
|
|
|
solutionHex := r.FormValue("powSolution")
|
|
solution, err := hex.DecodeString(solutionHex)
|
|
if err != nil || len(seed) == 0 {
|
|
apiutil.BadRequest(rw, r, errors.New("invalid powSolution"))
|
|
return
|
|
}
|
|
|
|
err = a.params.PowManager.CheckSolution(seed, solution)
|
|
|
|
if err != nil {
|
|
apiutil.BadRequest(rw, r, fmt.Errorf("checking proof-of-work solution: %w", err))
|
|
return
|
|
}
|
|
|
|
h.ServeHTTP(rw, r)
|
|
})
|
|
}
|