Merge pull request #466 from isocolsky/fix/lotsa-utxos

Improve UTXO selection & add tx max size limit
This commit is contained in:
Matias Alejo Garcia 2016-02-19 13:51:17 -03:00
commit 3c02a0bf89
4 changed files with 27 additions and 9 deletions

View File

@ -7,6 +7,7 @@ Defaults.MIN_FEE_PER_KB = 0;
Defaults.MAX_FEE_PER_KB = 1000000;
Defaults.MIN_TX_FEE = 0;
Defaults.MAX_TX_FEE = 0.1 * 1e8;
Defaults.MAX_TX_SIZE_IN_KB = 100;
Defaults.MAX_KEYS = 100;

View File

@ -24,6 +24,7 @@ var errors = {
TX_ALREADY_BROADCASTED: 'The transaction proposal is already broadcasted',
TX_CANNOT_CREATE: 'Cannot create TX proposal during backoff time',
TX_CANNOT_REMOVE: 'Cannot remove this tx proposal during locktime',
TX_MAX_SIZE_EXCEEDED: 'TX exceeds maximum allowed size',
TX_NOT_ACCEPTED: 'The transaction proposal is not accepted',
TX_NOT_FOUND: 'Transaction proposal not found',
TX_NOT_PENDING: 'The transaction proposal is not pending',

View File

@ -1305,21 +1305,23 @@ WalletService.prototype._selectTxInputs = function(txp, utxosToExclude, cb) {
var bitcoreTx, bitcoreError;
while (i < inputs.length) {
selected.push(inputs[i]);
total += inputs[i].satoshis;
i++;
function select() {
if (i >= inputs.length) return cb(bitcoreError || new Error('Could not select tx inputs'));
var input = inputs[i++];
selected.push(input);
total += input.satoshis;
if (total >= txp.getTotalAmount()) {
txp.setInputs(selected);
bitcoreError = self._checkTxAndEstimateFee(txp);
if (!bitcoreError) {
return cb();
}
if (!bitcoreError) return cb();
if (txp.getEstimatedSize() / 1000 > Defaults.MAX_TX_SIZE_IN_KB)
return cb(Errors.TX_MAX_SIZE_EXCEEDED);
}
}
setTimeout(select, 0);
};
return cb(bitcoreError || new Error('Could not select tx inputs'));
select();
});
};

View File

@ -2287,6 +2287,20 @@ describe('Wallet service', function() {
});
});
it('should fail to create a tx exceeding max size in kb', function(done) {
helpers.stubUtxos(server, wallet, _.range(1, 10, 0), function() {
var txOpts = helpers.createSimpleProposalOpts('18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', 9, TestData.copayers[0].privKey_1H_0);
var _oldDefault = Defaults.MAX_TX_SIZE_IN_KB;
Defaults.MAX_TX_SIZE_IN_KB = 1;
server.createTxLegacy(txOpts, function(err, tx) {
should.exist(err);
err.code.should.equal('TX_MAX_SIZE_EXCEEDED');
Defaults.MAX_TX_SIZE_IN_KB = _oldDefault;
done();
});
});
});
it('should fail to create tx for dust amount', function(done) {
helpers.stubUtxos(server, wallet, [1], function() {
var txOpts = helpers.createSimpleProposalOpts('18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', 0.00000001, TestData.copayers[0].privKey_1H_0);