From 24e705b26569ad443b6247c29880e1131fc55bb2 Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Thu, 9 Jul 2015 16:45:30 -0400 Subject: [PATCH] Get blocks by height. --- integration/index.js | 22 +++++++++++++- src/bitcoindjs.cc | 72 ++++++++++++++++++++++++-------------------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/integration/index.js b/integration/index.js index 04849e6c..f7cbe53c 100644 --- a/integration/index.js +++ b/integration/index.js @@ -45,7 +45,7 @@ describe('Basic Functionality', function() { }); }); - describe('will get correct block data', function() { + describe('get blocks by hash', function() { blockData.forEach(function(data) { var block = bitcore.Block.fromString(data); @@ -58,4 +58,24 @@ describe('Basic Functionality', function() { }); }); + describe('get blocks by height', function() { + + var knownHeights = [ + [0, '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f'], + [1, '00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048'], + [100000,'000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506'], + [314159, '00000000000000001bb82a7f5973618cfd3185ba1ded04dd852a653f92a27c45'] + ]; + + knownHeights.forEach(function(data) { + it('block at height ' + data[0], function(done) { + bitcoind.getBlock(data[0], function(err, response) { + var block = bitcore.Block.fromBuffer(response); + block.hash.should.equal(data[1]); + done(); + }); + }); + }); + }); + }); diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 0c0c6bc5..a62f3d06 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -837,46 +837,52 @@ static void async_get_block(uv_work_t *req) { async_block_data* data = static_cast(req->data); + CBlockIndex* pblockindex; std::string strHash = data->hash; uint256 hash(strHash); - if (mapBlockIndex.count(hash) == 0) { - data->err_msg = std::string("Block not found."); + if (data->height != -1) { + pblockindex = chainActive[data->height]; } else { - - CBlockIndex* pblockindex = mapBlockIndex[hash]; - - const CDiskBlockPos& pos = pblockindex->GetBlockPos(); - - // We can read directly from the file, and pass that, we don't need to - // deserialize the entire block only for it to then be serialized - // and then deserialized again in JavaScript - - // Open history file to read - CAutoFile filein(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION); - if (filein.IsNull()) { - data->err_msg = std::string("ReadBlockFromDisk: OpenBlockFile failed"); + if (mapBlockIndex.count(hash) == 0) { + data->err_msg = std::string("Block not found."); return; + } else { + pblockindex = mapBlockIndex[hash]; } - - // Get the actual file, seeked position and rewind a uint32_t - FILE* blockFile = filein.release(); - long int filePos = ftell(blockFile); - fseek(blockFile, filePos - sizeof(uint32_t), SEEK_SET); - - // Read the size of the block - uint32_t size = 0; - fread(&size, sizeof(uint32_t), 1, blockFile); - - // Read block - char* buffer = (char *)malloc(sizeof(char) * size); - fread((void *)buffer, sizeof(char), size, blockFile); - fclose(blockFile); - - data->buffer = buffer; - data->size = size; - data->cblock_index = pblockindex; } + + const CDiskBlockPos& pos = pblockindex->GetBlockPos(); + + // We can read directly from the file, and pass that, we don't need to + // deserialize the entire block only for it to then be serialized + // and then deserialized again in JavaScript + + // Open history file to read + CAutoFile filein(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION); + if (filein.IsNull()) { + data->err_msg = std::string("ReadBlockFromDisk: OpenBlockFile failed"); + return; + } + + // Get the actual file, seeked position and rewind a uint32_t + FILE* blockFile = filein.release(); + long int filePos = ftell(blockFile); + fseek(blockFile, filePos - sizeof(uint32_t), SEEK_SET); + + // Read the size of the block + uint32_t size = 0; + fread(&size, sizeof(uint32_t), 1, blockFile); + + // Read block + char* buffer = (char *)malloc(sizeof(char) * size); + fread((void *)buffer, sizeof(char), size, blockFile); + fclose(blockFile); + + data->buffer = buffer; + data->size = size; + data->cblock_index = pblockindex; + } static void