From c679ce1cebe96092e3df1f12ed24d046154ce708 Mon Sep 17 00:00:00 2001 From: ronykris Date: Sun, 4 Jan 2026 02:24:08 +0530 Subject: [PATCH] Fail fast when zcashd lacks required experimental feature --- cmd/root.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cmd/root.go b/cmd/root.go index 1d2bb269..4db2dc5f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,6 +1,7 @@ package cmd import ( + "encoding/json" "fmt" "net" "net/http" @@ -11,6 +12,8 @@ import ( "syscall" "time" + "golang.org/x/exp/slices" + "github.com/btcsuite/btcd/rpcclient" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" @@ -222,6 +225,38 @@ func startServer(opts *common.Options) error { // The default is zebrad common.NodeName = "zcashd" } + + // Detect backend from subversion and, for zcashd, ensure the + // required experimental features are enabled. + subver := getLightdInfo.ZcashdSubversion + + switch { + case strings.Contains(subver, "/Zebra:"): + common.Log.Info("Detected zebrad backend; skipping experimental feature check") + + case strings.Contains(subver, "/MagicBean:"): + result, rpcErr := common.RawRequest("getexperimentalfeatures", []json.RawMessage{}) + if rpcErr != nil { + common.Log.Fatalf("zcashd backend detected but getexperimentalfeatures RPC failed: %s", rpcErr.Error()) + } + + var feats []string + if err := json.Unmarshal(result, &feats); err != nil { + common.Log.Info("failed to decode getexperimentalfeatures reply: %w", err) + } + + switch { + case slices.Contains(feats, "lightwalletd"): + case slices.Contains(feats, "insightexplorer"): + default: + common.Log.Fatal( + "zcashd is running without the required experimental feature enabled; " + + "enable 'lightwalletd' or 'insightexplorer'") + } + + default: + common.Log.Fatalf("unsupported backend subversion %q (expected zcashd or zebrad)", subver) + } } dbPath := filepath.Join(opts.DataDir, "db")