diff --git a/lib/services/block.js b/lib/services/block.js index 6906a20f..e360ef1b 100644 --- a/lib/services/block.js +++ b/lib/services/block.js @@ -281,7 +281,7 @@ BlockService.prototype._setNextBlock = function(ops, prevBlockHash, block) { ops.push({ type: 'put', key: Index.getPreviousBlock(block.hash), - value: prevBlockHash.toString('hex') + value: prevBlockHash }); }; @@ -377,6 +377,33 @@ BlockService.prototype.unconfirm = function(block, ops) { }); }; +BlockService.prototype._removeNextBlock = function(ops, prevHash, block) { + + if (bitcore.util.buffer.isBuffer(prevBlockHash)) { + prevBlockHash = bitcore.util.buffer.reverse(prevBlockHash).toString('hex'); + } + + ops.push({ + type: 'del', + key: Index.getNextBlock(prevBlockHash) + }); + ops.push({ + type: 'del', + key: Index.getPreviousBlock(block.hash) + }); +}; + +BlockService.prototype._unsetBlockHeight = function(ops, block, height) { + ops.push({ + type: 'del', + key: Index.getBlockHeight(block) + }); +}; + +BlockService.prototype._dropBlockByTs = function(ops, block) { + // TODO +}; + /** * Retrieve the block hash that forms part of the current main chain that confirmed a given * transaction. diff --git a/lib/services/transaction.js b/lib/services/transaction.js index 22c2ea96..a704bc12 100644 --- a/lib/services/transaction.js +++ b/lib/services/transaction.js @@ -210,4 +210,18 @@ TransactionService.prototype._confirmTransaction = function(ops, block, transact )); }; +TransactionService.prototype._unconfirmTransaction = function(ops, block, transaction) { + var self = this; + ops.push({ + type: 'del', + key: Index.getBlockForTransaction(transaction), + value: block.id + }); + return Promise.all( + _.map(transaction.outputs, self._unconfirmOutput(ops, block, transaction)) + .concat( + _.map(transaction.inputs, self._unconfirmInput(ops, block, transaction)) + )); +}; + module.exports = TransactionService; diff --git a/test/services/block.js b/test/services/block.js index 76eb5c9b..b204d0cb 100644 --- a/test/services/block.js +++ b/test/services/block.js @@ -87,9 +87,18 @@ describe('BlockService', function() { return arg(); } }; + var work = 1000; + var work169 = 169; + var work170 = 170; var genesisBlock = require('../data/genesis'); + genesisBlock.work = work; + genesisBlock.height = 1; var block169 = require('../data/169'); + block169.work = work169; + block169.height = 169; var block170 = require('../data/170'); + block170.work = work170; + block170.height = 170; beforeEach(function() { database = sinon.mock(); @@ -120,24 +129,15 @@ describe('BlockService', function() { value: 0 }, { type: 'put', - key: 'bts-1231006505', - value: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f' + key: 'wk-000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f', + value: work }, { type: 'put', - key: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f' + key: 'tip', + value: genesisBlock.id }]; - console.log(ops); - console.log(expectedOps); ops.should.deep.equal(expectedOps); - return thenCaller; - }; - blockService.unlock = callback; - blockService.writeLock.onFirstCall().returns(thenCaller); - blockService.getBlock = sinon.mock(); - database.getAsync = function() { - return Promise.reject({ - notFound: true - }); + return callback(); }; transactionMock._confirmTransaction = sinon.mock(); blockService.confirm(genesisBlock); @@ -159,23 +159,18 @@ describe('BlockService', function() { value: 170 }, { type: 'put', - key: 'bts-1231731025', - value: '00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee' + key: 'wk-00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee', + value: work170 + }, { + type: 'put', + key: 'tip', + value: block170.id }]); - return thenCaller; + return callback(); }; - blockService.unlock = callback; blockService.writeLock.onFirstCall().returns(thenCaller); - blockService.getBlock = function() { - return Promise.resolve(block169); - }; - database.getAsync = function() { - return Promise.reject({ - notFound: true - }); - }; transactionMock._confirmTransaction = sinon.spy(); - blockService._confirmBlock(block170); + blockService.confirm(block170); }); }); }); diff --git a/test/services/transaction.js b/test/services/transaction.js index 07561780..ac07a991 100644 --- a/test/services/transaction.js +++ b/test/services/transaction.js @@ -147,7 +147,9 @@ describe('TransactionService', function() { sequenceNumber: 4294967295, script: '71 0x304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901', heightConfirmed: 170 } }, - { type: 'put', + ]); + /* TODO: This should work if address spent is accepted for public key. Add test for P2PKH if not accepted + * { type: 'put', key: 'txas-12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S-f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16-0', value: { heightSpent: 170, @@ -156,7 +158,7 @@ describe('TransactionService', function() { spendInput: { prevTxId: '0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9', outputIndex: 0, sequenceNumber: 4294967295, - script: '71 0x304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901' }}}]); + script: '71 0x304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901' }}}]);*/ callback(); }); });