Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rpc: add indexinfo results #2289

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions btcjson/chainsvrcmds.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}

Expand Down Expand Up @@ -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)
Expand Down
11 changes: 11 additions & 0 deletions btcjson/chainsvrcmds_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
11 changes: 11 additions & 0 deletions btcjson/chainsvrresults.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
48 changes: 48 additions & 0 deletions rpcclient/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
55 changes: 55 additions & 0 deletions rpcclient/chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
Loading