From 79cdeaaf8ba788e4ab6fd5a56ef84e614675e099 Mon Sep 17 00:00:00 2001 From: Jamie Holdstock Date: Sun, 25 Apr 2021 14:22:13 +0100 Subject: [PATCH] Add parser for blockconnected notification (#238) --- background/background.go | 3 +-- go.sum | 1 - rpc/dcrd.go | 25 +++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/background/background.go b/background/background.go index e6161bf..1b4bc69 100644 --- a/background/background.go +++ b/background/background.go @@ -12,7 +12,6 @@ import ( "sync" "time" - "decred.org/dcrwallet/rpc/client/dcrd" "github.com/decred/dcrd/chaincfg/v3" "github.com/decred/vspd/database" "github.com/decred/vspd/rpc" @@ -46,7 +45,7 @@ func (n *NotificationHandler) Notify(method string, params json.RawMessage) erro return nil } - header, _, err := dcrd.BlockConnected(params) + header, err := rpc.ParseBlockConnectedNotification(params) if err != nil { log.Errorf("Failed to parse dcrd block notification: %v", err) return nil diff --git a/go.sum b/go.sum index fc840c9..295f43c 100644 --- a/go.sum +++ b/go.sum @@ -171,7 +171,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/rpc/dcrd.go b/rpc/dcrd.go index 71b0cff..e95a046 100644 --- a/rpc/dcrd.go +++ b/rpc/dcrd.go @@ -5,8 +5,10 @@ package rpc import ( + "bytes" "context" "encoding/hex" + "encoding/json" "errors" "fmt" "strings" @@ -221,3 +223,26 @@ func (c *DcrdRPC) CanTicketVote(rawTx *dcrdtypes.TxRawResult, ticketHash string, return live, nil } + +// ParseBlockConnectedNotification extracts the block header from a +// blockconnected JSON-RPC notification. +func ParseBlockConnectedNotification(params json.RawMessage) (*wire.BlockHeader, error) { + var notif []string + err := json.Unmarshal(params, ¬if) + if err != nil { + return nil, fmt.Errorf("json unmarshal error: %w", err) + } + + if len(notif) == 0 { + return nil, errors.New("notification is empty") + } + + rawHeader := notif[0] + var header wire.BlockHeader + err = header.Deserialize(hex.NewDecoder(bytes.NewReader([]byte(rawHeader)))) + if err != nil { + return nil, fmt.Errorf("error creating block header from bytes: %w", err) + } + + return &header, nil +}