feat(pool): support descriptive password alias

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 17:11:25 +00:00
parent 1d6176153c
commit 3535e4b006
3 changed files with 69 additions and 7 deletions

View file

@ -41,6 +41,7 @@ type PoolConfig struct {
URL string `json:"url"`
User string `json:"user"`
Pass string `json:"pass"`
Password string `json:"password"`
RigID string `json:"rig-id"`
Algo string `json:"algo"`
TLS bool `json:"tls"`
@ -83,10 +84,11 @@ type RateLimit struct {
type WorkersMode string
const (
WorkersByRigID WorkersMode = "rig-id" // rigid field, fallback to user
WorkersByUser WorkersMode = "user"
WorkersByPass WorkersMode = "password"
WorkersByAgent WorkersMode = "agent"
WorkersByIP WorkersMode = "ip"
WorkersDisabled WorkersMode = "false"
WorkersByRigID WorkersMode = "rig-id" // rigid field, fallback to user
WorkersByUser WorkersMode = "user"
WorkersByPass WorkersMode = "password"
WorkersByPassword WorkersMode = "password"
WorkersByAgent WorkersMode = "agent"
WorkersByIP WorkersMode = "ip"
WorkersDisabled WorkersMode = "false"
)

View file

@ -139,9 +139,14 @@ func (c *StratumClient) Connect() error {
//
// client.Login()
func (c *StratumClient) Login() {
password := c.config.Password
if password == "" {
password = c.config.Pass
}
params := map[string]interface{}{
"login": c.config.User,
"pass": c.config.Pass,
"pass": password,
"rigid": c.config.RigID,
}
if c.config.Algo != "" {

View file

@ -1,6 +1,7 @@
package pool
import (
"encoding/json"
"net"
"sync"
"testing"
@ -171,3 +172,57 @@ func TestStratumClient_HandleMessage_Ugly(t *testing.T) {
t.Fatalf("expected login rejection to disconnect once, got %d", disconnects)
}
}
func TestStratumClient_Login_Good(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer clientConn.Close()
client := &StratumClient{
config: proxy.PoolConfig{
User: "WALLET",
Pass: "legacy",
Password: "preferred",
RigID: "rig-alpha",
Algo: "cn/r",
},
conn: serverConn,
}
writeDone := make(chan struct{})
go func() {
client.Login()
close(writeDone)
}()
buffer := make([]byte, 2048)
n, err := clientConn.Read(buffer)
if err != nil {
t.Fatal(err)
}
var request jsonRPCRequest
if err := json.Unmarshal(buffer[:n], &request); err != nil {
t.Fatal(err)
}
params, ok := request.Params.(map[string]interface{})
if !ok {
t.Fatalf("expected login params map, got %T", request.Params)
}
if got := params["pass"]; got != "preferred" {
t.Fatalf("expected preferred password, got %v", got)
}
if got := params["rigid"]; got != "rig-alpha" {
t.Fatalf("expected rigid field to be forwarded, got %v", got)
}
if got := params["algo"]; got == nil {
t.Fatal("expected algo extension to be forwarded")
}
client.Disconnect()
select {
case <-writeDone:
case <-time.After(time.Second):
t.Fatal("expected login write to complete")
}
}