Add getBlockFiltersBatch websocket method

This commit is contained in:
Martin Boehm 2023-08-22 09:06:57 +02:00
parent 4b6f19632d
commit a1a17b4331
6 changed files with 97 additions and 2 deletions

View File

@ -2200,6 +2200,48 @@ func (w *Worker) GetBlockRaw(bid string) (*BlockRaw, error) {
return &BlockRaw{Hex: hex}, err 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 // ComputeFeeStats computes fee distribution in defined blocks and logs them to log
func (w *Worker) ComputeFeeStats(blockFrom, blockTo int, stopCompute chan os.Signal) error { func (w *Worker) ComputeFeeStats(blockFrom, blockTo int, stopCompute chan os.Signal) error {
bestheight, _, err := w.db.GetBestBlock() bestheight, _, err := w.db.GetBestBlock()

View File

@ -357,6 +357,13 @@ export interface WsBlockReq {
pageSize?: number; pageSize?: number;
page?: number; page?: number;
} }
export interface WsBlockFilterReq {
blockHash: string;
}
export interface WsBlockFiltersBatchReq {
bestKnownBlockHash: string;
pageSize?: number;
}
export interface WsAccountUtxoReq { export interface WsAccountUtxoReq {
descriptor: string; descriptor: string;
} }

View File

@ -45,6 +45,8 @@ func main() {
t.Add(server.WsBlockHashReq{}) t.Add(server.WsBlockHashReq{})
t.Add(server.WsBlockHashRes{}) t.Add(server.WsBlockHashRes{})
t.Add(server.WsBlockReq{}) t.Add(server.WsBlockReq{})
t.Add(server.WsBlockFilterReq{})
t.Add(server.WsBlockFiltersBatchReq{})
t.Add(server.WsAccountUtxoReq{}) t.Add(server.WsAccountUtxoReq{})
t.Add(server.WsBalanceHistoryReq{}) t.Add(server.WsBalanceHistoryReq{})
t.Add(server.WsTransactionReq{}) t.Add(server.WsTransactionReq{})

View File

@ -359,6 +359,14 @@ var requestHandlers = map[string]func(*WebsocketServer, *websocketChannel, *WsRe
} }
return 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) { "subscribeNewBlock": func(s *WebsocketServer, c *websocketChannel, req *WsReq) (rv interface{}, err error) {
return s.subscribeNewBlock(c, req) 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) 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 { type subscriptionResponse struct {
Subscribed bool `json:"subscribed"` Subscribed bool `json:"subscribed"`
} }

View File

@ -85,6 +85,11 @@ type WsBlockFilterReq struct {
BlockHash string `json:"blockHash"` BlockHash string `json:"blockHash"`
} }
type WsBlockFiltersBatchReq struct {
BlockHash string `json:"bestKnownBlockHash"`
PageSize int `json:"pageSize,omitempty"`
}
type WsTransactionSpecificReq struct { type WsTransactionSpecificReq struct {
Txid string `json:"txid"` Txid string `json:"txid"`
} }

View File

@ -413,7 +413,7 @@
function getBlockFilter() { function getBlockFilter() {
const method = 'getBlockFilter'; const method = 'getBlockFilter';
let blockHash = document.getElementById('getBlockFilterBlockHash').value; const blockHash = document.getElementById('getBlockFilterBlockHash').value;
const params = { const params = {
blockHash, 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() { function subscribeNewFiatRatesTicker() {
const method = 'subscribeFiatRates'; const method = 'subscribeFiatRates';
var currency = document.getElementById('subscribeFiatRatesCurrency').value; var currency = document.getElementById('subscribeFiatRatesCurrency').value;
@ -704,13 +717,27 @@
<div class="col-2"> <div class="col-2">
<input class="btn btn-secondary" type="button" value="get block filter" onclick="getBlockFilter()"> <input class="btn btn-secondary" type="button" value="get block filter" onclick="getBlockFilter()">
</div> </div>
<div class="col-5"> <div class="col-8">
<input type="text" class="form-control" id="getBlockFilterBlockHash" value="000000000000001cb4edd91be03b6775abd351fb51b1fbb0871fc1451454f362" placeholder="block hash"> <input type="text" class="form-control" id="getBlockFilterBlockHash" value="000000000000001cb4edd91be03b6775abd351fb51b1fbb0871fc1451454f362" placeholder="block hash">
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col" id="getBlockFilterResult"></div> <div class="col" id="getBlockFilterResult"></div>
</div> </div>
<div class="row">
<div class="col-2">
<input class="btn btn-secondary" type="button" value="get block filter batch" onclick="getBlockFiltersBatch()">
</div>
<div class="col-10">
<div class="row" style="margin: 0;">
<input type="text" class="form-control" id="getBlockFiltersBatchBlockHash" style="width: 80%; margin-right: 5px;" value="000000000000001cb4edd91be03b6775abd351fb51b1fbb0871fc1451454f362" placeholder="best known block hash">
<input type="text" class="form-control" placeholder="page size" style="width: 15%;" id="getBlockFiltersBatchPageSize" value="">
</div>
</div>
</div>
<div class="row">
<div class="col" id="getBlockFiltersBatchResult"></div>
</div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<input class="btn btn-secondary" type="button" value="subscribe new block" onclick="subscribeNewBlock()"> <input class="btn btn-secondary" type="button" value="subscribe new block" onclick="subscribeNewBlock()">