From a1a17b43312e418deff33bcdd773daac4e1e04e6 Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Tue, 22 Aug 2023 09:06:57 +0200 Subject: [PATCH] Add getBlockFiltersBatch websocket method --- api/worker.go | 42 ++++++++++++++++++++++ blockbook-api.ts | 7 ++++ build/tools/typescriptify/typescriptify.go | 2 ++ server/websocket.go | 12 +++++++ server/ws_types.go | 5 +++ static/test-websocket.html | 31 ++++++++++++++-- 6 files changed, 97 insertions(+), 2 deletions(-) diff --git a/api/worker.go b/api/worker.go index 230d7176..e29c90e0 100644 --- a/api/worker.go +++ b/api/worker.go @@ -2200,6 +2200,48 @@ func (w *Worker) GetBlockRaw(bid string) (*BlockRaw, error) { return &BlockRaw{Hex: hex}, err } +// GetBlockFiltersBatch returns array of block filter data in the format ["height:hash:filter",...] if blocks greater than bestKnownBlockHash +func (w *Worker) GetBlockFiltersBatch(bestKnownBlockHash string, pageSize int) ([]string, error) { + if w.is.BlockGolombFilterP == 0 { + return nil, NewAPIError("Not supported", true) + } + if pageSize > 10000 { + return nil, NewAPIError("pageSize max 10000", true) + } + if pageSize <= 0 { + pageSize = 1000 + } + bi, err := w.chain.GetBlockInfo(bestKnownBlockHash) + if err != nil { + return nil, err + } + bestHeight, _, err := w.db.GetBestBlock() + if err != nil { + return nil, err + } + from := bi.Height + 1 + to := bestHeight + 1 + if from >= to { + return []string{}, nil + } + if to-from > uint32(pageSize) { + to = from + uint32(pageSize) + } + r := make([]string, 0, to-from) + for i := from; i < to; i++ { + blockHash, err := w.db.GetBlockHash(uint32(i)) + if err != nil { + return nil, err + } + blockFilter, err := w.db.GetBlockFilter(blockHash) + if err != nil { + return nil, err + } + r = append(r, fmt.Sprintf("%d:%s:%s", i, blockHash, blockFilter)) + } + return r, err +} + // ComputeFeeStats computes fee distribution in defined blocks and logs them to log func (w *Worker) ComputeFeeStats(blockFrom, blockTo int, stopCompute chan os.Signal) error { bestheight, _, err := w.db.GetBestBlock() diff --git a/blockbook-api.ts b/blockbook-api.ts index 8857d23b..53e3238f 100644 --- a/blockbook-api.ts +++ b/blockbook-api.ts @@ -357,6 +357,13 @@ export interface WsBlockReq { pageSize?: number; page?: number; } +export interface WsBlockFilterReq { + blockHash: string; +} +export interface WsBlockFiltersBatchReq { + bestKnownBlockHash: string; + pageSize?: number; +} export interface WsAccountUtxoReq { descriptor: string; } diff --git a/build/tools/typescriptify/typescriptify.go b/build/tools/typescriptify/typescriptify.go index cf74d603..4b19d4a2 100644 --- a/build/tools/typescriptify/typescriptify.go +++ b/build/tools/typescriptify/typescriptify.go @@ -45,6 +45,8 @@ func main() { t.Add(server.WsBlockHashReq{}) t.Add(server.WsBlockHashRes{}) t.Add(server.WsBlockReq{}) + t.Add(server.WsBlockFilterReq{}) + t.Add(server.WsBlockFiltersBatchReq{}) t.Add(server.WsAccountUtxoReq{}) t.Add(server.WsBalanceHistoryReq{}) t.Add(server.WsTransactionReq{}) diff --git a/server/websocket.go b/server/websocket.go index 8002e599..447010f4 100644 --- a/server/websocket.go +++ b/server/websocket.go @@ -359,6 +359,14 @@ var requestHandlers = map[string]func(*WebsocketServer, *websocketChannel, *WsRe } return }, + "getBlockFiltersBatch": func(s *WebsocketServer, c *websocketChannel, req *WsReq) (rv interface{}, err error) { + r := WsBlockFiltersBatchReq{} + err = json.Unmarshal(req.Params, &r) + if err == nil { + rv, err = s.getBlockFiltersBatch(&r) + } + return + }, "subscribeNewBlock": func(s *WebsocketServer, c *websocketChannel, req *WsReq) (rv interface{}, err error) { return s.subscribeNewBlock(c, req) }, @@ -658,6 +666,10 @@ func (s *WebsocketServer) getBlockFilter(r *WsBlockFilterReq) (res string, err e return s.db.GetBlockFilter(r.BlockHash) } +func (s *WebsocketServer) getBlockFiltersBatch(r *WsBlockFiltersBatchReq) (res []string, err error) { + return s.api.GetBlockFiltersBatch(r.BlockHash, r.PageSize) +} + type subscriptionResponse struct { Subscribed bool `json:"subscribed"` } diff --git a/server/ws_types.go b/server/ws_types.go index f6074b44..a71c2df7 100644 --- a/server/ws_types.go +++ b/server/ws_types.go @@ -85,6 +85,11 @@ type WsBlockFilterReq struct { BlockHash string `json:"blockHash"` } +type WsBlockFiltersBatchReq struct { + BlockHash string `json:"bestKnownBlockHash"` + PageSize int `json:"pageSize,omitempty"` +} + type WsTransactionSpecificReq struct { Txid string `json:"txid"` } diff --git a/static/test-websocket.html b/static/test-websocket.html index 1f4ea808..07a5ebf8 100644 --- a/static/test-websocket.html +++ b/static/test-websocket.html @@ -413,7 +413,7 @@ function getBlockFilter() { const method = 'getBlockFilter'; - let blockHash = document.getElementById('getBlockFilterBlockHash').value; + const blockHash = document.getElementById('getBlockFilterBlockHash').value; const params = { blockHash, }; @@ -422,6 +422,19 @@ }); } + function getBlockFiltersBatch() { + const method = 'getBlockFiltersBatch'; + const bestKnownBlockHash = document.getElementById('getBlockFiltersBatchBlockHash').value; + const pageSize = parseInt(document.getElementById("getBlockFiltersBatchPageSize").value); + const params = { + bestKnownBlockHash, + }; + if (pageSize) params.pageSize = pageSize; + send(method, params, function (result) { + document.getElementById('getBlockFiltersBatchResult').innerText = JSON.stringify(result).replace(/,/g, ", "); + }); + } + function subscribeNewFiatRatesTicker() { const method = 'subscribeFiatRates'; var currency = document.getElementById('subscribeFiatRatesCurrency').value; @@ -704,13 +717,27 @@
-
+
+
+
+ +
+
+
+ + +
+
+
+
+
+