diff --git a/lib/http/rpc.js b/lib/http/rpc.js index fd5c861b..f61d2432 100644 --- a/lib/http/rpc.js +++ b/lib/http/rpc.js @@ -82,6 +82,7 @@ RPC.prototype.init = function init() { this.add('getbestblockhash', this.getBestBlockHash); this.add('getblockcount', this.getBlockCount); this.add('getblock', this.getBlock); + this.add('getblockbyheight', this.getBlockByHeight); this.add('getblockhash', this.getBlockHash); this.add('getblockheader', this.getBlockHeader); this.add('getchaintips', this.getChainTips); @@ -496,6 +497,7 @@ RPC.prototype.getBlock = co(function* getBlock(args, help) { var valid = new Validator([args]); var hash = valid.hash(0); var verbose = valid.bool(1, true); + var details = valid.bool(2, false); var entry, block; if (help || args.length < 1 || args.length > 2) @@ -524,7 +526,43 @@ RPC.prototype.getBlock = co(function* getBlock(args, help) { if (!verbose) return block.toRaw().toString('hex'); - return yield this.blockToJSON(entry, block, false); + return yield this.blockToJSON(entry, block, details); +}); + +RPC.prototype.getBlockByHeight = co(function* getBlockByHeight(args, help) { + var valid = new Validator([args]); + var height = valid.u32(0, -1); + var verbose = valid.bool(1, true); + var details = valid.bool(2, false); + var entry, block; + + if (help || args.length < 1 || args.length > 3) + throw new RPCError(errs.MISC_ERROR, 'getblockbyheight "height" ( verbose )'); + + if (height === -1) + throw new RPCError(errs.TYPE_ERROR, 'Invalid block height.'); + + entry = yield this.chain.db.getEntry(height); + + if (!entry) + throw new RPCError(errs.MISC_ERROR, 'Block not found'); + + block = yield this.chain.db.getBlock(entry.hash); + + if (!block) { + if (this.chain.options.spv) + throw new RPCError(errs.MISC_ERROR, 'Block not available (spv mode)'); + + if (this.chain.options.prune) + throw new RPCError(errs.MISC_ERROR, 'Block not available (pruned data)'); + + throw new RPCError(errs.DATABASE_ERROR, 'Can\'t read block from disk'); + } + + if (!verbose) + return block.toRaw().toString('hex'); + + return yield this.blockToJSON(entry, block, details); }); RPC.prototype.getBlockHash = co(function* getBlockHash(args, help) {