rpc: add indexinfo results

This commit is contained in:
Chase Sillevis 2024-12-13 12:16:16 +01:00
parent e646d437e9
commit f9d94bc301
No known key found for this signature in database
GPG key ID: B31ED7165146D701
5 changed files with 135 additions and 0 deletions

View file

@ -225,6 +225,15 @@ func NewGetBlockChainInfoCmd() *GetBlockChainInfoCmd {
return &GetBlockChainInfoCmd{}
}
// GetIndexInfoCmd defines the getindexinfo JSON-RPC command.
type GetIndexInfoCmd struct{}
// NewGetIndexInfoCmd returns a new instance which can be used to issue a
// getindexinfo JSON-RPC command.
func NewGetIndexInfoCmd() *GetIndexInfoCmd {
return &GetIndexInfoCmd{}
}
// GetBlockCountCmd defines the getblockcount JSON-RPC command.
type GetBlockCountCmd struct{}
@ -1131,6 +1140,7 @@ func init() {
MustRegisterCmd("getgenerate", (*GetGenerateCmd)(nil), flags)
MustRegisterCmd("gethashespersec", (*GetHashesPerSecCmd)(nil), flags)
MustRegisterCmd("getinfo", (*GetInfoCmd)(nil), flags)
MustRegisterCmd("getindexinfo", (*GetIndexInfoCmd)(nil), flags)
MustRegisterCmd("getmempoolentry", (*GetMempoolEntryCmd)(nil), flags)
MustRegisterCmd("getmempoolinfo", (*GetMempoolInfoCmd)(nil), flags)
MustRegisterCmd("getmininginfo", (*GetMiningInfoCmd)(nil), flags)

View file

@ -369,6 +369,17 @@ func TestChainSvrCmds(t *testing.T) {
marshalled: `{"jsonrpc":"1.0","method":"getblockchaininfo","params":[],"id":1}`,
unmarshalled: &btcjson.GetBlockChainInfoCmd{},
},
{
name: "getindexinfo",
newCmd: func() (interface{}, error) {
return btcjson.NewCmd("getindexinfo")
},
staticCmd: func() interface{} {
return btcjson.NewGetIndexInfoCmd()
},
marshalled: `{"jsonrpc":"1.0","method":"getindexinfo","params":[],"id":1}`,
unmarshalled: &btcjson.GetIndexInfoCmd{},
},
{
name: "getblockcount",
newCmd: func() (interface{}, error) {

View file

@ -242,6 +242,17 @@ type GetBlockChainInfoResult struct {
*UnifiedSoftForks
}
// GetIndexInfoResult models the data returned from the getindexinfo command.
type GetIndexInfoResult struct {
*TxIndex `json:"txindex,omitempty"`
}
// TxIndex describes the current txindex results from getindexinfo.
type TxIndex struct {
Synced bool `json:"synced"`
BestBlockHeight int32 `json:"best_block_height"`
}
// GetBlockFilterResult models the data returned from the getblockfilter
// command.
type GetBlockFilterResult struct {

View file

@ -507,6 +507,54 @@ func (c *Client) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) {
return c.GetBlockChainInfoAsync().Receive()
}
// FutureGetIndexInfoResult is a promise to deliver the result of a
// GetIndexInfoAsync RPC invocation (or an applicable error).
type FutureGetIndexInfoResult struct {
client *Client
Response chan *Response
}
// unmarshalPartialGetIndexInfoResult unmarshals the response into an
// instance of GetIndexInfoResult.
func unmarshalPartialGetIndexInfoResult(res []byte) (*btcjson.GetIndexInfoResult, error) {
var indexInfo btcjson.GetIndexInfoResult
if err := json.Unmarshal(res, &indexInfo); err != nil {
return nil, err
}
return &indexInfo, nil
}
// Receive waits for the Response promised by the future and returns txindex info
// result provided by the server.
func (r FutureGetIndexInfoResult) Receive() (*btcjson.GetIndexInfoResult, error) {
res, err := ReceiveFuture(r.Response)
if err != nil {
return nil, err
}
indexInfo, err := unmarshalPartialGetIndexInfoResult(res)
if err != nil {
return nil, err
}
return indexInfo, nil
}
// GetIndexInfoAsync returns an instance of a type that can be used to get
// the result of the RPC at some future time by invoking the Receive function
// on the returned instance.
func (c *Client) GetIndexInfoAsync() FutureGetIndexInfoResult {
cmd := btcjson.NewGetIndexInfoCmd()
return FutureGetIndexInfoResult{
client: c,
Response: c.SendCmd(cmd),
}
}
// GetIndexInfo returns information related to the txindex state.
func (c *Client) GetIndexInfo() (*btcjson.GetIndexInfoResult, error) {
return c.GetIndexInfoAsync().Receive()
}
// FutureGetBlockFilterResult is a future promise to deliver the result of a
// GetBlockFilterAsync RPC invocation (or an applicable error).
type FutureGetBlockFilterResult chan *Response

View file

@ -103,6 +103,61 @@ func TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) {
}
}
// TestUnmarshalGetIndexInfoResult ensures that the Txindex of GetIndexInfoResult
// are properly unmarshaled.
func TestUnmarshalGetIndexInfoResult(t *testing.T) {
t.Parallel()
tests := []struct {
name string
res []byte
enabled bool
blockHeight int32
}{
{
name: "txindex synced and best block height valid",
res: []byte(`{"txindex": {"synced": true, "best_block_height": 3522710}}`),
enabled: true,
blockHeight: 3522710,
},
{
name: "txindex not enabled",
res: []byte(`{}`),
enabled: false,
blockHeight: 0,
},
}
for _, test := range tests {
success := t.Run(test.name, func(t *testing.T) {
// We'll start by unmarshalling the JSON into a struct.
info, err := unmarshalPartialGetIndexInfoResult(test.res)
if err != nil {
t.Fatal(err)
}
if test.enabled {
if info.TxIndex == nil {
t.Fatalf("unable to unmarshal txindex: %v", err)
}
if info.TxIndex.Synced == false {
t.Fatalf("expected TxIndex.Synced to be true")
}
if info.TxIndex.BestBlockHeight != test.blockHeight {
t.Fatalf("expected TxIndex.BestBlockHeight to be equal")
}
} else {
if info.TxIndex != nil {
t.Fatalf("expected TxIndex to be empty")
}
}
})
if !success {
return
}
}
}
func TestFutureGetBlockCountResultReceiveErrors(t *testing.T) {
responseChan := FutureGetBlockCountResult(make(chan *Response))
response := Response{