diff --git a/api/types.go b/api/types.go index f6743823..b8fa5579 100644 --- a/api/types.go +++ b/api/types.go @@ -424,18 +424,19 @@ type BlockbookInfo struct { // BackendInfo is used to get information about blockchain type BackendInfo struct { - BackendError string `json:"error,omitempty"` - Chain string `json:"chain,omitempty"` - Blocks int `json:"blocks,omitempty"` - Headers int `json:"headers,omitempty"` - BestBlockHash string `json:"bestBlockHash,omitempty"` - Difficulty string `json:"difficulty,omitempty"` - SizeOnDisk int64 `json:"sizeOnDisk,omitempty"` - Version string `json:"version,omitempty"` - Subversion string `json:"subversion,omitempty"` - ProtocolVersion string `json:"protocolVersion,omitempty"` - Timeoffset float64 `json:"timeOffset,omitempty"` - Warnings string `json:"warnings,omitempty"` + BackendError string `json:"error,omitempty"` + Chain string `json:"chain,omitempty"` + Blocks int `json:"blocks,omitempty"` + Headers int `json:"headers,omitempty"` + BestBlockHash string `json:"bestBlockHash,omitempty"` + Difficulty string `json:"difficulty,omitempty"` + SizeOnDisk int64 `json:"sizeOnDisk,omitempty"` + Version string `json:"version,omitempty"` + Subversion string `json:"subversion,omitempty"` + ProtocolVersion string `json:"protocolVersion,omitempty"` + Timeoffset float64 `json:"timeOffset,omitempty"` + Warnings string `json:"warnings,omitempty"` + Consensus interface{} `json:"consensus,omitempty"` } // SystemInfo contains information about the running blockbook and backend instance diff --git a/api/worker.go b/api/worker.go index 90769b77..87b9cfe0 100644 --- a/api/worker.go +++ b/api/worker.go @@ -1777,6 +1777,7 @@ func (w *Worker) GetSystemInfo(internal bool) (*SystemInfo, error) { Timeoffset: ci.Timeoffset, Version: ci.Version, Warnings: ci.Warnings, + Consensus: ci.Consensus, } glog.Info("GetSystemInfo finished in ", time.Since(start)) return &SystemInfo{blockbookInfo, backendInfo}, nil diff --git a/bchain/coins/zec/zcashrpc.go b/bchain/coins/zec/zcashrpc.go index 9cf75852..47376e1c 100644 --- a/bchain/coins/zec/zcashrpc.go +++ b/bchain/coins/zec/zcashrpc.go @@ -7,6 +7,7 @@ import ( "github.com/juju/errors" "github.com/trezor/blockbook/bchain" "github.com/trezor/blockbook/bchain/coins/btc" + "github.com/trezor/blockbook/common" ) // ZCashRPC is an interface to JSON-RPC bitcoind service @@ -14,6 +15,23 @@ type ZCashRPC struct { *btc.BitcoinRPC } +type ResGetBlockChainInfo struct { + Error *bchain.RPCError `json:"error"` + Result struct { + Chain string `json:"chain"` + Blocks int `json:"blocks"` + Headers int `json:"headers"` + Bestblockhash string `json:"bestblockhash"` + Difficulty common.JSONNumber `json:"difficulty"` + Pruned bool `json:"pruned"` + SizeOnDisk int64 `json:"size_on_disk"` + Consensus struct { + Chaintip string `json:"chaintip"` + Nextblock string `json:"nextblock"` + } `json:"consensus"` + } `json:"result"` +} + // NewZCashRPC returns new ZCashRPC instance func NewZCashRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) { b, err := btc.NewBitcoinRPC(config, pushHandler) @@ -54,6 +72,41 @@ func (z *ZCashRPC) Initialize() error { return nil } +func (z *ZCashRPC) GetChainInfo() (*bchain.ChainInfo, error) { + chainInfo := ResGetBlockChainInfo{} + err := z.Call(&btc.CmdGetBlockChainInfo{Method: "getblockchaininfo"}, &chainInfo) + if err != nil { + return nil, err + } + if chainInfo.Error != nil { + return nil, chainInfo.Error + } + + networkInfo := btc.ResGetNetworkInfo{} + err = z.Call(&btc.CmdGetNetworkInfo{Method: "getnetworkinfo"}, &networkInfo) + if err != nil { + return nil, err + } + if networkInfo.Error != nil { + return nil, networkInfo.Error + } + + return &bchain.ChainInfo{ + Bestblockhash: chainInfo.Result.Bestblockhash, + Blocks: chainInfo.Result.Blocks, + Chain: chainInfo.Result.Chain, + Difficulty: string(chainInfo.Result.Difficulty), + Headers: chainInfo.Result.Headers, + SizeOnDisk: chainInfo.Result.SizeOnDisk, + Version: string(networkInfo.Result.Version), + Subversion: string(networkInfo.Result.Subversion), + ProtocolVersion: string(networkInfo.Result.ProtocolVersion), + Timeoffset: networkInfo.Result.Timeoffset, + Consensus: chainInfo.Result.Consensus, + Warnings: networkInfo.Result.Warnings, + }, nil +} + // GetBlock returns block with given hash. func (z *ZCashRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) { var err error diff --git a/bchain/types.go b/bchain/types.go index 6f536153..78c8a531 100644 --- a/bchain/types.go +++ b/bchain/types.go @@ -161,17 +161,18 @@ type MempoolEntry struct { // ChainInfo is used to get information about blockchain type ChainInfo struct { - Chain string `json:"chain"` - Blocks int `json:"blocks"` - Headers int `json:"headers"` - Bestblockhash string `json:"bestblockhash"` - Difficulty string `json:"difficulty"` - SizeOnDisk int64 `json:"size_on_disk"` - Version string `json:"version"` - Subversion string `json:"subversion"` - ProtocolVersion string `json:"protocolversion"` - Timeoffset float64 `json:"timeoffset"` - Warnings string `json:"warnings"` + Chain string `json:"chain"` + Blocks int `json:"blocks"` + Headers int `json:"headers"` + Bestblockhash string `json:"bestblockhash"` + Difficulty string `json:"difficulty"` + SizeOnDisk int64 `json:"size_on_disk"` + Version string `json:"version"` + Subversion string `json:"subversion"` + ProtocolVersion string `json:"protocolversion"` + Timeoffset float64 `json:"timeoffset"` + Warnings string `json:"warnings"` + Consensus interface{} `json:"consensus,omitempty"` } // RPCError defines rpc error returned by backend