From 939eeca0cf651f658cdbbce9308ac520f8734c26 Mon Sep 17 00:00:00 2001 From: Brannon King Date: Tue, 3 Aug 2021 22:10:26 -0700 Subject: [PATCH] [lbry] rpc: fix getblock reponse --- btcjson/chainsvrresults.go | 62 ++++++++++++++++---------------------- rpcserver.go | 45 ++++++++++++++++++--------- rpcserverhelp.go | 2 +- 3 files changed, 57 insertions(+), 52 deletions(-) diff --git a/btcjson/chainsvrresults.go b/btcjson/chainsvrresults.go index ecc26827..46d454c5 100644 --- a/btcjson/chainsvrresults.go +++ b/btcjson/chainsvrresults.go @@ -25,7 +25,7 @@ type GetBlockHeaderVerboseResult struct { Version int32 `json:"version"` VersionHex string `json:"versionHex"` MerkleRoot string `json:"merkleroot"` - ClaimTrie string `json:"claimtrie"` + ClaimTrie string `json:"nameclaimroot,omitempty"` Time int64 `json:"time"` Nonce uint64 `json:"nonce"` Bits string `json:"bits"` @@ -66,6 +66,27 @@ type GetBlockStatsResult struct { UTXOSizeIncrease int64 `json:"utxo_size_inc"` } +type GetBlockVerboseResultBase struct { + Hash string `json:"hash"` + Confirmations int64 `json:"confirmations"` + StrippedSize int32 `json:"strippedsize"` + Size int32 `json:"size"` + Weight int32 `json:"weight"` + Height int64 `json:"height"` + Version int32 `json:"version"` + VersionHex string `json:"versionHex"` + MerkleRoot string `json:"merkleroot"` + Time int64 `json:"time"` + Nonce uint32 `json:"nonce"` + Bits string `json:"bits"` + Difficulty float64 `json:"difficulty"` + PreviousHash string `json:"previousblockhash,omitempty"` + NextHash string `json:"nextblockhash,omitempty"` + + ClaimTrie string `json:"nameclaimroot,omitempty"` + TxCount int `json:"nTx"` // For backwards compatibility only +} + // GetBlockVerboseResult models the data from the getblock command when the // verbose flag is set to 1. When the verbose flag is set to 0, getblock returns a // hex-encoded string. When the verbose flag is set to 1, getblock returns an object @@ -73,24 +94,8 @@ type GetBlockStatsResult struct { // getblock returns an object whose tx field is an array of raw transactions. // Use GetBlockVerboseTxResult to unmarshal data received from passing verbose=2 to getblock. type GetBlockVerboseResult struct { - Hash string `json:"hash"` - Confirmations int64 `json:"confirmations"` - StrippedSize int32 `json:"strippedsize"` - Size int32 `json:"size"` - Weight int32 `json:"weight"` - Height int64 `json:"height"` - Version int32 `json:"version"` - VersionHex string `json:"versionHex"` - MerkleRoot string `json:"merkleroot"` - ClaimTrie string `json:"claimTrie"` - Tx []string `json:"tx,omitempty"` - RawTx []TxRawResult `json:"rawtx,omitempty"` // Note: this field is always empty when verbose != 2. - Time int64 `json:"time"` - Nonce uint32 `json:"nonce"` - Bits string `json:"bits"` - Difficulty float64 `json:"difficulty"` - PreviousHash string `json:"previousblockhash"` - NextHash string `json:"nextblockhash,omitempty"` + GetBlockVerboseResultBase + Tx []string `json:"tx"` } // GetBlockVerboseTxResult models the data from the getblock command when the @@ -100,23 +105,8 @@ type GetBlockVerboseResult struct { // getblock returns an object whose tx field is an array of raw transactions. // Use GetBlockVerboseResult to unmarshal data received from passing verbose=1 to getblock. type GetBlockVerboseTxResult struct { - Hash string `json:"hash"` - Confirmations int64 `json:"confirmations"` - StrippedSize int32 `json:"strippedsize"` - Size int32 `json:"size"` - Weight int32 `json:"weight"` - Height int64 `json:"height"` - Version int32 `json:"version"` - VersionHex string `json:"versionHex"` - MerkleRoot string `json:"merkleroot"` - Tx []TxRawResult `json:"tx,omitempty"` - RawTx []TxRawResult `json:"rawtx,omitempty"` // Deprecated: removed in Bitcoin Core - Time int64 `json:"time"` - Nonce uint32 `json:"nonce"` - Bits string `json:"bits"` - Difficulty float64 `json:"difficulty"` - PreviousHash string `json:"previousblockhash"` - NextHash string `json:"nextblockhash,omitempty"` + GetBlockVerboseResultBase + Tx []TxRawResult `json:"tx"` } // GetChainTxStatsResult models the data from the getchaintxstats command. diff --git a/rpcserver.go b/rpcserver.go index f337668a..3c0530fe 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1188,12 +1188,17 @@ func handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i params := s.cfg.ChainParams blockHeader := &blk.MsgBlock().Header - blockReply := btcjson.GetBlockVerboseResult{ + var prevHashString string + if blockHeight > 0 { + prevHashString = blockHeader.PrevBlock.String() + } + + base := btcjson.GetBlockVerboseResultBase{ Hash: c.Hash, Version: blockHeader.Version, VersionHex: fmt.Sprintf("%08x", blockHeader.Version), MerkleRoot: blockHeader.MerkleRoot.String(), - PreviousHash: blockHeader.PrevBlock.String(), + PreviousHash: prevHashString, Nonce: blockHeader.Nonce, Time: blockHeader.Timestamp.Unix(), Confirmations: int64(1 + best.Height - blockHeight), @@ -1204,6 +1209,7 @@ func handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i Bits: strconv.FormatInt(int64(blockHeader.Bits), 16), Difficulty: getDifficultyRatio(blockHeader.Bits, params), NextHash: nextHashString, + ClaimTrie: blockHeader.ClaimTrie.String(), } if *c.Verbosity == 1 { @@ -1213,20 +1219,29 @@ func handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (i txNames[i] = tx.Hash().String() } - blockReply.Tx = txNames - } else { - txns := blk.Transactions() - rawTxns := make([]btcjson.TxRawResult, len(txns)) - for i, tx := range txns { - rawTxn, err := createTxRawResult(params, tx.MsgTx(), - tx.Hash().String(), blockHeader, hash.String(), - blockHeight, best.Height) - if err != nil { - return nil, err - } - rawTxns[i] = *rawTxn + base.TxCount = len(txNames) + blockReply := btcjson.GetBlockVerboseResult{ + GetBlockVerboseResultBase: base, + Tx: txNames, } - blockReply.RawTx = rawTxns + return blockReply, nil + } + + txns := blk.Transactions() + rawTxns := make([]btcjson.TxRawResult, len(txns)) + for i, tx := range txns { + rawTxn, err := createTxRawResult(params, tx.MsgTx(), + tx.Hash().String(), blockHeader, hash.String(), + blockHeight, best.Height) + if err != nil { + return nil, err + } + rawTxns[i] = *rawTxn + } + base.TxCount = len(rawTxns) + blockReply := btcjson.GetBlockVerboseTxResult{ + GetBlockVerboseResultBase: base, + Tx: rawTxns, } return blockReply, nil diff --git a/rpcserverhelp.go b/rpcserverhelp.go index dfbe86c6..12bef63d 100644 --- a/rpcserverhelp.go +++ b/rpcserverhelp.go @@ -249,7 +249,7 @@ var helpDescsEnUS = map[string]string{ "getblockverboseresult-merkleroot": "Root hash of the merkle tree", "getblockverboseresult-nameclaimroot": "Root hash of the claim trie", "getblockverboseresult-tx": "The transaction hashes (only when verbosity=1)", - "getblockverboseresult-rawtx": "The transactions as JSON objects (only when verbosity=2)", + "getblockverboseresult-nTx": "The number of transactions (aka, count of TX)", "getblockverboseresult-time": "The block time in seconds since 1 Jan 1970 GMT", "getblockverboseresult-nonce": "The block nonce", "getblockverboseresult-bits": "The bits which represent the block difficulty",