Skip to content

Commit

Permalink
http: interactive rescan will now throw on socket.call similar to res…
Browse files Browse the repository at this point in the history
…can.
  • Loading branch information
nodech committed Feb 14, 2024
1 parent 2b44a64 commit 620284e
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 15 deletions.
13 changes: 11 additions & 2 deletions lib/blockchain/chain.js
Expand Up @@ -2266,13 +2266,22 @@ class Chain extends AsyncEmitter {
}
}

/** @typedef {import('./common').ScanAction} ScanAction */

/**
* @callback ScanInteractiveIterCB
* @param {ChainEntry} entry
* @param {TX[]} txs
* @returns {Promise<ScanAction>}
*/

/**
* Interactive scan the blockchain for transactions containing specified
* address hashes. Allows repeat and abort.
* @param {Hash|Number} start - Block hash or height to start at.
* @param {BloomFilter} filter - Starting bloom filter containing tx,
* address and name hashes.
* @param {Function} iter - Iterator.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [fullLock=false]
* @returns {Promise}
*/
Expand Down Expand Up @@ -2300,7 +2309,7 @@ class Chain extends AsyncEmitter {
* @param {Hash|Number} start - Block hash or height to start at.
* @param {BloomFilter} filter - Starting bloom filter containing tx,
* address and name hashes.
* @param {Function} iter - Iterator.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [lockPerScan=true] - if we should lock per block scan.
* @returns {Promise}
*/
Expand Down
8 changes: 7 additions & 1 deletion lib/blockchain/chaindb.js
Expand Up @@ -1612,12 +1612,18 @@ class ChainDB {
this.logger.info('Finished scanning %d blocks.', total);
}

/**
* @typedef {Object} ScanBlockResult
* @property {ChainEntry} entry
* @property {TX[]} txs
*/

/**
* Interactive scans block checks.
* @param {Hash|Number} blockID - Block hash or height to start at.
* @param {BloomFilter} [filter] - Starting bloom filter containing tx,
* address and name hashes.
* @returns {Promise}
* @returns {Promise<ScanBlockResult>}
*/

async scanBlock(blockID, filter) {
Expand Down
36 changes: 36 additions & 0 deletions lib/blockchain/common.js
Expand Up @@ -84,3 +84,39 @@ exports.scanActions = {
REPEAT_ADD: 4,
REPEAT: 5
};

/**
* @typedef {Object} ActionAbort
* @property {exports.scanActions} type - ABORT
*/

/**
* @typedef {Object} ActionNext
* @property {exports.scanActions} type - NEXT
*/

/**
* @typedef {Object} ActionRepeat
* @property {exports.ScanAction} type - REPEAT
*/

/**
* @typedef {Object} ActionRepeatAdd
* @property {exports.scanActions} type - REPEAT_ADD
* @property {Buffer[]} chunks
*/

/**
* @typedef {Object} ActionRepeatSet
* @property {exports.scanActions} type - REPEAT_SET
* @property {BloomFilter} filter
*/

/**
* @typedef {ActionAbort
* | ActionNext
* | ActionRepeat
* | ActionRepeatAdd
* | ActionRepeatSet
* } ScanAction
*/
5 changes: 2 additions & 3 deletions lib/node/http.js
Expand Up @@ -925,10 +925,9 @@ class HTTP extends Server {
try {
await this.node.scanInteractive(start, filter, iter, fullLock);
} catch (err) {
return socket.call('block rescan interactive abort', err.message);
await socket.call('block rescan interactive abort', err.message);
throw err;
}

return null;
}
}

Expand Down
85 changes: 76 additions & 9 deletions test/node-rescan-test.js
Expand Up @@ -543,7 +543,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();

await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);

Expand All @@ -554,7 +561,15 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());

await client.rescanInteractive(startHeight, null);
err = null;
try {
await client.rescanInteractive(startHeight, null);
} catch (e) {
err = e;
}

assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
Expand Down Expand Up @@ -596,7 +611,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();

await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);

Expand All @@ -606,7 +628,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());

await client.rescanInteractive(startHeight);
err = null;
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
Expand Down Expand Up @@ -648,7 +677,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();

await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);

Expand All @@ -658,7 +694,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());

await client.rescanInteractive(startHeight);
err = null;
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
Expand Down Expand Up @@ -705,7 +748,15 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();

await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}

assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, tests.length);
assert.strictEqual(aborted, true);
});
Expand Down Expand Up @@ -748,17 +799,33 @@ describe('Node Rescan Interactive API', function() {
aborted = true;
});

await client.rescanInteractive(startHeight, filter.encode());
let err;
try {
await client.rescanInteractive(startHeight, filter.encode());
} catch (e) {
err = e;
}

assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(aborted, true);

// Now try using client.filter
err = null;
aborted = false;
filter = BloomFilter.fromRate(10000, 0.001);
testTXs = allTXs[startHeight].slice();
expected = 0;

await client.setFilter(filter.encode());
await client.rescanInteractive(startHeight);
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}

assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(aborted, true);
});

Expand Down

0 comments on commit 620284e

Please sign in to comment.