First pass on pow faucet for testnet (#1624)

* first pass on pow faucet for testnet

* delete unused thing

* remove unneeded thing

*  remove other thing

* https & remove a log

* don't force redirect on https, its not working?

* some renaming of stuff

* lint

* lint

* some stablity config

* move protos to proto directory, add generated pb file for go users

* add health probe

* add hpa and request cpu

* handle err

* some more config
This commit is contained in:
Preston Van Loon
2019-02-19 12:32:14 -05:00
committed by GitHub
parent 0e1f5ef55c
commit 81c2e4e94b
16 changed files with 1176 additions and 156 deletions

56
tools/faucet/BUILD.bazel Normal file
View File

@@ -0,0 +1,56 @@
# gazelle:ignore
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
load("@io_bazel_rules_docker//go:image.bzl", "go_image")
load("@io_bazel_rules_docker//container:container.bzl", "container_push")
IMPORT_PATH = "github.com/prysmaticlabs/prysm/tools/faucet"
SRCS = [
"main.go",
"server.go",
]
DEPS = [
"//proto/faucet:faucet_go_proto",
"@org_golang_google_grpc//:go_default_library",
"@org_golang_google_grpc//peer:go_default_library",
"@org_golang_google_grpc//reflection:go_default_library",
"@com_github_prestonvanloon_go_recaptcha//:go_default_library",
]
go_library(
name = "go_default_library",
srcs = SRCS,
importpath = IMPORT_PATH,
visibility = ["//visibility:private"],
deps = DEPS,
)
go_binary(
name = "faucet",
embed = [":go_default_library"],
visibility = ["//visibility:public"],
)
go_image(
name = "image",
srcs = SRCS,
importpath = IMPORT_PATH,
deps = DEPS,
pure = "off", # depends on cgo for go-ethereum crypto
static = "on",
tags = ["manual"],
goarch = "amd64",
goos = "linux",
race = "off",
)
container_push(
name = "push_image",
format = "Docker",
image = ":image",
registry = "gcr.io",
repository = "prysmaticlabs/prysm/faucet",
tag = "latest",
tags = ["manual"],
visibility = ["//visibility:private"],
)

38
tools/faucet/main.go Normal file
View File

@@ -0,0 +1,38 @@
package main
import (
"flag"
"fmt"
"net"
recaptcha "github.com/prestonvanloon/go-recaptcha"
faucetpb "github.com/prysmaticlabs/prysm/proto/faucet"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
var (
port = flag.Int("port", 8000, "Port to server gRPC service")
recaptchaSecret = flag.String("recaptcha_secret", "", "Secret to verify recaptcha")
)
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
panic(err)
}
s := grpc.NewServer()
fmt.Println("recaptcha = " + *recaptchaSecret)
faucetpb.RegisterFaucetServiceServer(s, &faucetServer{
r: recaptcha.Recaptcha{RecaptchaPrivateKey: *recaptchaSecret},
})
reflection.Register(s)
fmt.Printf("Serving gRPC requests on port %d\n", *port)
if err := s.Serve(lis); err != nil {
fmt.Printf("Error: %v", err)
}
}

44
tools/faucet/server.go Normal file
View File

@@ -0,0 +1,44 @@
package main
import (
"context"
"errors"
"fmt"
recaptcha "github.com/prestonvanloon/go-recaptcha"
faucetpb "github.com/prysmaticlabs/prysm/proto/faucet"
"google.golang.org/grpc/peer"
)
var minScore = 0.5
type faucetServer struct {
r recaptcha.Recaptcha
}
// RequestFunds from the ethereum 1.x faucet. Requires a valid captcha
// response.
func (s *faucetServer) RequestFunds(ctx context.Context, req *faucetpb.FundingRequest) (*faucetpb.FundingResponse, error) {
p, ok := peer.FromContext(ctx)
if !ok {
return nil, errors.New("peer from ctx not ok")
}
fmt.Printf("Sending captcha request for peer %s\n", p.Addr.String())
rr, err := s.r.Check(p.Addr.String(), req.RecaptchaResponse)
if err != nil {
return nil, err
}
if !rr.Success {
fmt.Printf("Unsuccessful recaptcha request. Error codes: %+v\n", rr.ErrorCodes)
return &faucetpb.FundingResponse{Error: "Recaptcha failed"}, nil
}
if rr.Score < minScore {
return &faucetpb.FundingResponse{Error: "Recaptcha score too low"}, nil
}
return &faucetpb.FundingResponse{
Amount: "500000000000000000",
TransactionHash: "0xfake",
}, nil
}