Skip to content

Commit

Permalink
Merge pull request #18 from Leon1777/main
Browse files Browse the repository at this point in the history
add testnet mining support
  • Loading branch information
lemois-1337 authored Sep 5, 2024
2 parents ee434c0 + a94bd48 commit 778dc66
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 30 deletions.
4 changes: 4 additions & 0 deletions cmd/karlsenbridge/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ stratum_port: :5555
karlsend_address: localhost:42110
#karlsend_address: localhost:42210

# enabling this setting by changing it to true ensures that the correct
# prefix handling for testnet addresses is applied
testnet_mining: false

# min_share_diff: only accept shares of the specified difficulty (or higher)
# from the miner(s). Higher values will reduce the number of shares submitted,
# thereby reducing network traffic and server load, while lower values will
Expand Down
2 changes: 2 additions & 0 deletions cmd/karlsenbridge/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func main() {
flag.StringVar(&cfg.PromPort, "prom", cfg.PromPort, "address to serve prom stats, default `:2112`")
flag.BoolVar(&cfg.UseLogFile, "log", cfg.UseLogFile, "if true will output errors to log file, default `true`")
flag.StringVar(&cfg.HealthCheckPort, "hcp", cfg.HealthCheckPort, `(rarely used) if defined will expose a health check on /readyz, default ""`)
flag.BoolVar(&cfg.TestnetMining, "testnetmining", cfg.TestnetMining, "enable testnet mining mode, default `false`")
flag.Parse()

log.Println("----------------------------------")
Expand All @@ -54,6 +55,7 @@ func main() {
log.Printf("\tblock wait: %s", cfg.BlockWaitTime)
log.Printf("\textranonce size: %d", cfg.ExtranonceSize)
log.Printf("\thealth check: %s", cfg.HealthCheckPort)
log.Printf("\ttestnet mining: %t", cfg.TestnetMining)
log.Println("----------------------------------")

if err := karlsenstratum.ListenAndServe(cfg); err != nil {
Expand Down
Empty file modified docker/prometheus.yml
100755 → 100644
Empty file.
69 changes: 40 additions & 29 deletions src/gostratum/default_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,24 +30,26 @@ func DefaultLogger() *zap.Logger {
))
}

func DefaultConfig(logger *zap.Logger) StratumListenerConfig {
func DefaultConfig(logger *zap.Logger, testnetMining bool) StratumListenerConfig {
return StratumListenerConfig{
StateGenerator: func() any { return nil },
HandlerMap: DefaultHandlers(),
HandlerMap: DefaultHandlers(testnetMining),
Port: ":5555",
Logger: logger,
}
}

func DefaultHandlers() StratumHandlerMap {
func DefaultHandlers(testnetMining bool) StratumHandlerMap {
return StratumHandlerMap{
string(StratumMethodSubscribe): HandleSubscribe,
string(StratumMethodAuthorize): HandleAuthorize,
string(StratumMethodSubmit): HandleSubmit,
string(StratumMethodAuthorize): func(ctx *StratumContext, event JsonRpcEvent) error {
return HandleAuthorize(ctx, event, testnetMining)
},
string(StratumMethodSubmit): HandleSubmit,
}
}

func HandleAuthorize(ctx *StratumContext, event JsonRpcEvent) error {
func HandleAuthorize(ctx *StratumContext, event JsonRpcEvent, testnetMining bool) error {
if len(event.Params) < 1 {
return fmt.Errorf("malformed event from miner, expected param[1] to be address")
}
Expand All @@ -61,8 +63,8 @@ func HandleAuthorize(ctx *StratumContext, event JsonRpcEvent) error {
address = parts[0]
workerName = parts[1]
}
var err error
address, err = CleanWallet(address)

address, err := CleanWallet(address, testnetMining)
if err != nil {
return fmt.Errorf("invalid wallet format %s: %w", address, err)
}
Expand Down Expand Up @@ -106,31 +108,40 @@ func HandleSubmit(ctx *StratumContext, event JsonRpcEvent) error {

func SendExtranonce(ctx *StratumContext) {
if err := ctx.Send(NewEvent("", "set_extranonce", []any{ctx.Extranonce})); err != nil {
// should we doing anything further on failure
ctx.Logger.Error(errors.Wrap(err, "failed to set extranonce").Error(), zap.Any("context", ctx))
}
}

var walletRegex = regexp.MustCompile("karlsen:[a-z0-9]+")

//var walletRegex = regexp.MustCompile("karlsentest:[a-z0-9]+")

func CleanWallet(in string) (string, error) {
_, err := util.DecodeAddress(in, util.Bech32PrefixKarlsen)
if err == nil {
return in, nil // good to go
}
if !strings.HasPrefix(in, "karlsen:") {
return CleanWallet("karlsen:" + in)
}
//if !strings.HasPrefix(in, "karlsentest:") {
// return CleanWallet("karlsentest:" + in)
//}

// has karlsen: prefix but other weirdness somewhere
if walletRegex.MatchString(in) {
return in[0:69], nil
//return in[0:73], nil
// CleanWallet function handles both testnet and mainnet wallet addresses
func CleanWallet(in string, testnetMining bool) (string, error) {
if testnetMining {
// handle testnet wallet prefix and regex
fmt.Printf("Switching to testnet address handling: %s\n", in)
_, err := util.DecodeAddress(in, util.Bech32PrefixKarlsenTest)
if err == nil {
return in, nil // valid testnet address
}
if !strings.HasPrefix(in, "karlsentest:") {
in = "karlsentest:" + in
}
// validate the address format using regex
if regexp.MustCompile("^karlsentest:[a-z0-9]+$").MatchString(in) {
return in[:73], nil
}
} else {
// handle mainnet wallet prefix and regex
fmt.Printf("Handling mainnet address: %s\n", in)
_, err := util.DecodeAddress(in, util.Bech32PrefixKarlsen)
if err == nil {
return in, nil // valid mainnet address
}
if !strings.HasPrefix(in, "karlsen:") {
in = "karlsen:" + in
}
// validate the address format using regex
if regexp.MustCompile("^karlsen:[a-z0-9]+$").MatchString(in) {
return in[:69], nil
}
}
return "", errors.New("unable to coerce wallet to valid karlsen address")
}
3 changes: 2 additions & 1 deletion src/karlsenstratum/stratum_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type BridgeConfig struct {
SharesPerMin uint `yaml:"shares_per_min"`
VarDiffStats bool `yaml:"var_diff_stats"`
ExtranonceSize uint `yaml:"extranonce_size"`
TestnetMining bool `yaml:"testnet_mining"`
}

func configureZap(cfg BridgeConfig) (*zap.SugaredLogger, func()) {
Expand Down Expand Up @@ -89,7 +90,7 @@ func ListenAndServe(cfg BridgeConfig) error {
extranonceSize = 3
}
clientHandler := newClientListener(logger, shareHandler, float64(minDiff), int8(extranonceSize))
handlers := gostratum.DefaultHandlers()
handlers := gostratum.DefaultHandlers(cfg.TestnetMining)
// override the submit handler with an actual useful handler
handlers[string(gostratum.StratumMethodSubmit)] =
func(ctx *gostratum.StratumContext, event gostratum.JsonRpcEvent) error {
Expand Down

0 comments on commit 778dc66

Please sign in to comment.