From 2b7d56bf585f1a7e8fc2784b20d9f028fe0009fa Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Mon, 10 Jan 2022 22:41:24 -0800 Subject: [PATCH] [lbry] examples: update lbcdblocknotify to support Stratum --- rpcclient/examples/lbcdblocknotify/README.md | 31 +++++--- rpcclient/examples/lbcdblocknotify/main.go | 74 +++++++++++++++----- 2 files changed, 76 insertions(+), 29 deletions(-) diff --git a/rpcclient/examples/lbcdblocknotify/README.md b/rpcclient/examples/lbcdblocknotify/README.md index 12d8a80a..45ab3b29 100644 --- a/rpcclient/examples/lbcdblocknotify/README.md +++ b/rpcclient/examples/lbcdblocknotify/README.md @@ -12,22 +12,33 @@ The first step is to clone the lbcd package: $ git clone github.com/lbryio/lbcd ``` -Next, navigate to the example's directory and modify the `main.go` source to -specify the correct RPC username and password for the RPC server: +Display available options: ```bash -$ cd rpcclient/examples/lbcdblocknotify +$ go run . -h + + -coinid string + Coin ID (default "1425") + -rpcpass string + LBCD RPC password (default "rpcpass") + -rpcserver string + LBCD RPC server (default "localhost:9245") + -rpcuser string + LBCD RPC username (default "rpcuser") + -stratum string + Stratum server (default "lbrypool.net:3334") + -stratumpass string + Stratum server password (default "password") ``` -```Go - User: "yourrpcuser", - Pass: "yourrpcpass", -``` - -Finally, run it with: +Start the program: ```bash -$ go run . +$ go run . -stratumpass -rpcuser -rpcpass + +2022/01/10 23:16:21 NotifyBlocks: Registration Complete +2022/01/10 23:16:21 Block count: 1093112 +... ``` ## License diff --git a/rpcclient/examples/lbcdblocknotify/main.go b/rpcclient/examples/lbcdblocknotify/main.go index 0949d2be..591ab731 100644 --- a/rpcclient/examples/lbcdblocknotify/main.go +++ b/rpcclient/examples/lbcdblocknotify/main.go @@ -5,8 +5,11 @@ package main import ( + "flag" + "fmt" "io/ioutil" "log" + "net" "path/filepath" "github.com/lbryio/lbcd/rpcclient" @@ -14,19 +17,52 @@ import ( "github.com/lbryio/lbcutil" ) +func send(stratum, stratumPass, coinid, blockHash string) error { + addr, err := net.ResolveTCPAddr("tcp", stratum) + if err != nil { + return fmt.Errorf("can't resolve addr: %w", err) + } + + conn, err := net.DialTCP("tcp", nil, addr) + if err != nil { + return fmt.Errorf("can't dial tcp: %w", err) + } + defer conn.Close() + + msg := fmt.Sprintf(`{"id":1,"method":"mining.update_block","params":[%q,%q,%q]}`, + stratumPass, coinid, blockHash) + + _, err = conn.Write([]byte(msg)) + if err != nil { + return fmt.Errorf("can't write message: %w", err) + } + + return nil +} + func main() { - // Only override the handlers for notifications you care about. - // Also note most of these handlers will only be called if you register - // for notifications. See the documentation of the rpcclient - // NotificationHandlers type for more details about each handler. + + var ( + coinid = flag.String("coinid", "1425", "Coin ID") + stratum = flag.String("stratum", "lbrypool.net:3334", "Stratum server") + stratumPass = flag.String("stratumpass", "password", "Stratum server password") + rpcserver = flag.String("rpcserver", "localhost:9245", "LBCD RPC server") + rpcuser = flag.String("rpcuser", "rpcuser", "LBCD RPC username") + rpcpass = flag.String("rpcpass", "rpcpass", "LBCD RPC password") + ) + + flag.Parse() + ntfnHandlers := rpcclient.NotificationHandlers{ OnFilteredBlockConnected: func(height int32, header *wire.BlockHeader, txns []*lbcutil.Tx) { - log.Printf("Block connected: %v (%d) %v", - header.BlockHash(), height, header.Timestamp) - }, - OnFilteredBlockDisconnected: func(height int32, header *wire.BlockHeader) { - log.Printf("Block disconnected: %v (%d) %v", - header.BlockHash(), height, header.Timestamp) + + blockHash := header.BlockHash().String() + + log.Printf("Block connected: %v (%d) %v", blockHash, height, header.Timestamp) + + if err := send(*stratum, *stratumPass, *coinid, blockHash); err != nil { + log.Printf("ERROR: failed to notify stratum: %s", err) + } }, } @@ -34,30 +70,30 @@ func main() { lbcdHomeDir := lbcutil.AppDataDir("lbcd", false) certs, err := ioutil.ReadFile(filepath.Join(lbcdHomeDir, "rpc.cert")) if err != nil { - log.Fatal(err) + log.Fatalf("can't read lbcd certificate: %s", err) } connCfg := &rpcclient.ConnConfig{ - Host: "localhost:9245", + Host: *rpcserver, Endpoint: "ws", - User: "rpcuser", - Pass: "rpcpass", + User: *rpcuser, + Pass: *rpcpass, Certificates: certs, } client, err := rpcclient.New(connCfg, &ntfnHandlers) if err != nil { - log.Fatalln(err) + log.Fatalf("can't create rpc client: %s", err) } // Register for block connect and disconnect notifications. - if err := client.NotifyBlocks(); err != nil { - log.Fatalln(err) + if err = client.NotifyBlocks(); err != nil { + log.Fatalf("can't register block notification: %s", err) } - log.Println("NotifyBlocks: Registration Complete") + log.Printf("NotifyBlocks: Registration Complete") // Get the current block count. blockCount, err := client.GetBlockCount() if err != nil { - log.Fatal(err) + log.Fatalf("can't get block count: %s", err) } log.Printf("Block count: %d", blockCount) -- 2.45.3