Get blocks by height.
This commit is contained in:
parent
69ed6efcb2
commit
24e705b265
@ -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) {
|
blockData.forEach(function(data) {
|
||||||
var block = bitcore.Block.fromString(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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -837,46 +837,52 @@ static void
|
|||||||
async_get_block(uv_work_t *req) {
|
async_get_block(uv_work_t *req) {
|
||||||
async_block_data* data = static_cast<async_block_data*>(req->data);
|
async_block_data* data = static_cast<async_block_data*>(req->data);
|
||||||
|
|
||||||
|
CBlockIndex* pblockindex;
|
||||||
std::string strHash = data->hash;
|
std::string strHash = data->hash;
|
||||||
uint256 hash(strHash);
|
uint256 hash(strHash);
|
||||||
|
|
||||||
if (mapBlockIndex.count(hash) == 0) {
|
if (data->height != -1) {
|
||||||
data->err_msg = std::string("Block not found.");
|
pblockindex = chainActive[data->height];
|
||||||
} else {
|
} else {
|
||||||
|
if (mapBlockIndex.count(hash) == 0) {
|
||||||
CBlockIndex* pblockindex = mapBlockIndex[hash];
|
data->err_msg = std::string("Block not found.");
|
||||||
|
|
||||||
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;
|
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
|
static void
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user